xhr_streaming fails (Spring + Zuul + SockJS)

Viewed 889

I've got the following testing script (executed with node, real client is a browser, result is the same):

const SockJS = require('sockjs-client');
const webstomp = require('webstomp-client');

let sock = new SockJS(/*INSERT_URL_HERE*/);
let stomp = webstomp.over(sock, {
  heartbeat: false,
});

stomp.connect({}, function() {
  console.log('connected');
}, function() {
  console.log('disconnected');
});

Versions in use:

  • Spring Boot - 1.5.3
  • Spring Cloud Netflix - 1.3.1
  • Nginx - 1.11
  • RabbitMQ - 3.6.9

To exclude parts of our infrastructure (Like NGINX as Proxy to route subdomains etc.) being the root of evil, I tried connecting to the Spring based Stomp Broker Relay (using RabbitMQ as real Broker) directly, via the NGINX Proxy and through Zuul.

The first two variants work as intended, but the third one (Using Zuul as Gateway with the ResourceServer annotation) fails. Increasing the timeouts didn't help, as the problem seems to reside in the "handshake". This is what I could get from the client side logs so far (Log for the first 2 variants, everything works fine, even webstomp could be established):

sockjs-client:main using url http://domain.tld/stomp +0ms
  sockjs-client:utils:url same http://domain.tld/stomp http://localhost/ false +4ms
  sockjs-client:info-receiver http://domain.tld/stomp +3ms
Opening Web Socket...
  sockjs-client:info-receiver doXhr http://domain.tld/stomp/info +5ms
  sockjs-client:driver:xhr GET http://domain.tld/stomp/info undefined +1ms
  sockjs-client:driver:xhr data {"entropy":394670331,"origins":["*:*"],"cookie_needed":true,"websocket":false} +100ms
  sockjs-client:driver:xhr end +2ms
  sockjs-client:info-receiver finish { entropy: 394670331,
  origins: [ '*:*' ],
  cookie_needed: true,
  websocket: false } 103 +1ms
  sockjs-client:info-receiver _cleanup +5ms
  sockjs-client:main _receiveInfo 103 +1ms
  sockjs-client:main info { entropy: 394670331,
  origins: [ '*:*' ],
  cookie_needed: true,
  websocket: false,
  nullOrigin: false,
  sameOrigin: false,
  sameScheme: true } +1ms
  sockjs-client:utils:transport disabled from server websocket +0ms
  sockjs-client:utils:transport enabled xhr-streaming +1ms
  sockjs-client:utils:transport disabled xdr-streaming +0ms
  sockjs-client:utils:transport enabled eventsource +0ms
  sockjs-client:utils:transport disabled iframe-eventsource +0ms
  sockjs-client:utils:transport disabled htmlfile +1ms
  sockjs-client:utils:transport disabled iframe-htmlfile +0ms
  sockjs-client:utils:transport enabled xhr-polling +0ms
  sockjs-client:utils:transport disabled xdr-polling +0ms
  sockjs-client:utils:transport disabled iframe-xhr-polling +0ms
  sockjs-client:utils:transport disabled jsonp-polling +0ms
  sockjs-client:main 3 enabled transports +0ms
  sockjs-client:main attempt xhr-streaming +0ms
  sockjs-client:main using timeout 824 +0ms
  sockjs-client:main transport url http://domain.tld/stomp/365/5rfribd0 +1ms
  sockjs-client:sender-receiver http://domain.tld/stomp/365/5rfribd0/xhr_streaming +0ms
  sockjs-client:buffered-sender http://domain.tld/stomp/365/5rfribd0 +1ms
  sockjs-client:polling http://domain.tld/stomp/365/5rfribd0/xhr_streaming +0ms
  sockjs-client:polling _scheduleReceiver +2ms
  sockjs-client:receiver:xhr http://domain.tld/stomp/365/5rfribd0/xhr_streaming +0ms
  sockjs-client:driver:xhr POST http://domain.tld/stomp/365/5rfribd0/xhr_streaming null +1ms
  sockjs-client:driver:xhr data hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
 +60ms
  sockjs-client:receiver:xhr _chunkHandler 200 +0ms
  sockjs-client:receiver:xhr message hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +0ms
  sockjs-client:polling message hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +0ms
  sockjs-client:sender-receiver poll message hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +1ms
  sockjs-client:main _transportMessage hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh +0ms
  sockjs-client:main heartbeat undefined +5ms
  sockjs-client:driver:xhr data o
 +0ms
  sockjs-client:receiver:xhr _chunkHandler 200 +0ms
  sockjs-client:receiver:xhr message o +0ms
  sockjs-client:polling message o +0ms
  sockjs-client:sender-receiver poll message o +2ms
  sockjs-client:main _transportMessage o +0ms
  sockjs-client:main _open xhr-streaming 0 +1ms
Web Socket Opened...
>>> CONNECT
accept-version:1.2,1.1,1.0
heart-beat:0,0


>>> length 110
  sockjs-client:buffered-sender send "CONNECT\naccept-version:1.2,1.1,1.0\nheart-beat:0,0\n\n\u0000" +2ms
  sockjs-client:buffered-sender sendSchedule 1 +0ms
  sockjs-client:ajax-based create ajax sender http://domain.tld/stomp/365/5rfribd0 ["CONNECT\naccept-version:1.2,1.1,1.0\nheart-beat:0,0\n\n\u0000"] +0ms
  sockjs-client:driver:xhr POST http://domain.tld/stomp/365/5rfribd0/xhr_send ["CONNECT\naccept-version:1.2,1.1,1.0\nheart-beat:0,0\n\n\u0000"] +0ms
  sockjs-client:main connected xhr-streaming +2ms
  sockjs-client:driver:xhr end +111ms
  sockjs-client:ajax-based finish 204 +0ms
  sockjs-client:buffered-sender sendScheduleWait +1ms
  sockjs-client:buffered-sender timeout +26ms
  sockjs-client:buffered-sender sendSchedule 0 +0ms
  sockjs-client:driver:xhr data a["CONNECTED\nserver:RabbitMQ/3.6.9\nsession:session--67Xn59asIOtXSwEHL4NZQ\nheart-beat:0,0\nversion:1.2\n\n\u0000"]
 +186ms
  sockjs-client:receiver:xhr _chunkHandler 200 +1ms
  sockjs-client:receiver:xhr message a["CONNECTED\nserver:RabbitMQ/3.6.9\nsession:session--67Xn59asIOtXSwEHL4NZQ\nheart-beat:0,0\nversion:1.2\n\n\u0000"] +0ms
  sockjs-client:polling message a["CONNECTED\nserver:RabbitMQ/3.6.9\nsession:session--67Xn59asIOtXSwEHL4NZQ\nheart-beat:0,0\nversion:1.2\n\n\u0000"] +0ms
  sockjs-client:sender-receiver poll message a["CONNECTED\nserver:RabbitMQ/3.6.9\nsession:session--67Xn59asIOtXSwEHL4NZQ\nheart-beat:0,0\nversion:1.2\n\n\u0000"] +0ms
  sockjs-client:main _transportMessage a["CONNECTED\nserver:RabbitMQ/3.6.9\nsession:session--67Xn59asIOtXSwEHL4NZQ\nheart-beat:0,0\nversion:1.2\n\n\u0000"] +0ms
  sockjs-client:main message xhr-streaming CONNECTED
server:RabbitMQ/3.6.9
session:session--67Xn59asIOtXSwEHL4NZQ
heart-beat:0,0
version:1.2

 +0ms
<<< CONNECTED
server:RabbitMQ/3.6.9
session:session--67Xn59asIOtXSwEHL4NZQ
heart-beat:0,0
version:1.2


connected to server RabbitMQ/3.6.9
connected
  sockjs-client:driver:xhr data a["\n"]
 +4ms
  sockjs-client:receiver:xhr _chunkHandler 200 +0ms
  sockjs-client:receiver:xhr message a["\n"] +0ms
  sockjs-client:polling message a["\n"] +0ms
  sockjs-client:sender-receiver poll message a["\n"] +0ms
  sockjs-client:main _transportMessage a["\n"] +0ms
  sockjs-client:main message xhr-streaming 
 +0ms
<<< PONG

But when using Zuul, the following happens (the "Handshake" request fails by timing out):

sockjs-client:main using url http://domain.tld/stomp +0ms
  sockjs-client:utils:url same http://domain.tld/stomp http://localhost/ false +4ms
  sockjs-client:info-receiver http://domain.tld/stomp +3ms
Opening Web Socket...
  sockjs-client:info-receiver doXhr http://domain.tld/stomp/info +8ms
  sockjs-client:driver:xhr GET http://domain.tld/stomp/info undefined +1ms
  sockjs-client:driver:xhr data {"entropy":886967672,"origins":["*:*"],"cookie_needed":true,"websocket":false} +280ms
  sockjs-client:driver:xhr end +3ms
  sockjs-client:info-receiver finish { entropy: 886967672,
  origins: [ '*:*' ],
  cookie_needed: true,
  websocket: false } 284 +1ms
  sockjs-client:info-receiver _cleanup +4ms
  sockjs-client:main _receiveInfo 284 +1ms
  sockjs-client:main info { entropy: 886967672,
  origins: [ '*:*' ],
  cookie_needed: true,
  websocket: false,
  nullOrigin: false,
  sameOrigin: false,
  sameScheme: false } +1ms
  sockjs-client:utils:transport disabled from server websocket +2ms
  sockjs-client:utils:transport enabled xhr-streaming +1ms
  sockjs-client:utils:transport disabled xdr-streaming +0ms
  sockjs-client:utils:transport enabled eventsource +0ms
  sockjs-client:utils:transport disabled iframe-eventsource +1ms
  sockjs-client:utils:transport disabled htmlfile +0ms
  sockjs-client:utils:transport disabled iframe-htmlfile +0ms
  sockjs-client:utils:transport enabled xhr-polling +0ms
  sockjs-client:utils:transport disabled xdr-polling +0ms
  sockjs-client:utils:transport disabled iframe-xhr-polling +1ms
  sockjs-client:utils:transport disabled jsonp-polling +0ms
  sockjs-client:main 3 enabled transports +0ms
  sockjs-client:main attempt xhr-streaming +6ms
  sockjs-client:main using timeout 2272 +0ms
  sockjs-client:main transport url http://domain.tld/stomp/490/5sugacsu +0ms
  sockjs-client:sender-receiver http://domain.tld/stomp/490/5sugacsu/xhr_streaming +1ms
  sockjs-client:buffered-sender http://domain.tld/stomp/490/5sugacsu +0ms
  sockjs-client:polling http://domain.tld/stomp/490/5sugacsu/xhr_streaming +0ms
  sockjs-client:polling _scheduleReceiver +0ms
  sockjs-client:receiver:xhr http://domain.tld/stomp/490/5sugacsu/xhr_streaming +0ms
  sockjs-client:driver:xhr POST http://domain.tld/stomp/490/5sugacsu/xhr_streaming null +1ms
  sockjs-client:main _transportTimeout +2s
  sockjs-client:main _transportClose undefined 2007 Transport timed out +0ms
  sockjs-client:main attempt eventsource +0ms
  sockjs-client:main using timeout 2272 +1ms
  sockjs-client:main transport url http://domain.tld/stomp/490/s50jl3qh +1ms
  sockjs-client:sender-receiver http://domain.tld/stomp/490/s50jl3qh/eventsource +0ms
  sockjs-client:buffered-sender http://domain.tld/stomp/490/s50jl3qh +0ms
  sockjs-client:polling http://domain.tld/stomp/490/s50jl3qh/eventsource +0ms
  sockjs-client:polling _scheduleReceiver +1ms
  sockjs-client:receiver:eventsource http://domain.tld/stomp/490/s50jl3qh/eventsource +0ms
  sockjs-client:receiver:eventsource error 0 Event { type: 'error' } +28ms
  sockjs-client:receiver:eventsource cleanup +1ms
  sockjs-client:receiver:eventsource close network +0ms
  sockjs-client:polling close null network undefined +202ms
  sockjs-client:polling _scheduleReceiver +0ms

I hope anyone has an idea to solve this. It seems like the sockjs response isn't returned by Zuul or something in this direction. Even using Trace on serverside didn't show up any errors...

The gateway itself is a simple setup with @SpringBootApplication, @EnableZuulProxy, @EnableResourceServer and this configuration:

# increase the timeout of the proxy
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 60000
zuul:
  host:
    connect-timeout-millis: 3000
    socket-timeout-millis: 60000
  # We don't want to automatically register all service available on Eureka
  ignored-services: "*"
  retryable: true
  # Default is "Cookie,Set-Cookie,Authorization", but we want to forward the Bearer Token
  sensitive-headers: Cookie,Set-Cookie
  routes:
    stomp:
      path: /stomp/**
      serviceId: stomp
      strip-prefix: true
1 Answers

Assuming that you are having a micro-services architecture because you are already using Zuul as API proxy (gateway). For micro-services, I would suggest to have a separate service for web socket, having it's independent port and independent configurations.

you can have whatever security implementation done in this service to secure your Web socket connection. Handling socket with zuul is sort of impossible, because it is just a proxy, it routes requests and response, but not very great solution for sockets.

Related