Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js with Socket.io - Long Polling fails and throws "code":1,"message":"Session ID unknown" response

Tags:

I'm stuck on why a node.js app that was moved to an IIS7 server is now failing. I know IIS7 doesn't support web sockets but my understanding was that socket.io would fall back to long polling if web socket isn't available. So now when the user tries to press a specific button which would normally have required the socket or long polling I get something like this:

XHR finished loading: POST "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777964357-6&sid=QWsESi0c9ih7WMWKAAAC". GET https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC 400 (Bad Request) XHR finished loading: GET "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC". OPTIONS https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC  XMLHttpRequest cannot load https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC. Invalid HTTP status code 400 

When I click on the GET or the XMLHttpRequest I can see that the response is "code":1,"message":"Session ID unknown", which I don't understand as I can see the SID. When I click on the code listed for the failure for the option I see that the problem is coming from the Request.prototype.create, namely the xhr send:

xhr.send(this.data); 

Does anyone have any idea what could be causing these things?

Any clarification would be greatly appreciated!

Thank you so much!

like image 538
mario Avatar asked Jun 08 '15 15:06

mario


2 Answers

For socket.io v2.0.3 (js client),when you use socket.io on client side the client socket.io makes some network calls as explained:

  1. When io.connect() is called, the socket.io library makes a call to the server which looks like

    ?EIO=3&transport=polling&t=LqtOnHh,

    server responds with something like

    "90:0{"sid":"pcJM_AEZirrJT-DuAAUy","upgrades[], "pingInterval":3600000,"pingTimeout":3600000}2:40"

    here the server generates a socket object on server side and sends its id back to the client.

  2. After this client makes another call to the server which is something like

    ?EIO=3&transport=polling&t=LqtR6Rn&sid=0JFGcEFNdrS-XBZeAAXM

    this is the long poll call that client makes to the server, if you see here it is passing the sessionId which it received in first call above, if the call goes to same node which generated that sessionId, the node identifies the socket connection for which the request has been made and responds.

    But behind ELB the call may go to some other node that didn't generate this sessioId, in that case the node will not be able to identify the sessionId for which the call was made and hence responds with {"code":1,"message":"Session ID unknown"}

You will also see this error in case of long polling not getting answered or getting timeout.

like image 105
Shahid Hussain Avatar answered Sep 25 '22 14:09

Shahid Hussain


In my project, I tried adding the transport option as a websocket and error no longer appears.

io.connect(url, {    "transports": ['websocket'] }) 

It will be a problem with supporting IE and other old browsers as they don't support native websockets, if the application browser compatibility is not an issue this seems a solution.

like image 31
slorenzo Avatar answered Sep 23 '22 14:09

slorenzo