zot24
11/16/2012 - 2:47 PM

socket-io.client send the cookies!

socket-io.client send the cookies!

/*
 *  Little example of how to use ```socket-io.client``` and ```request``` from node.js
 *  to authenticate thru http, and send the cookies during the socket.io handshake.
 */

var io = require('socket.io-client');
var request = require('request');

/*
 * This is the jar (like a cookie container) we will use always
 */
var j = request.jar();

/*
 *  First I will patch the xmlhttprequest library that socket.io-client uses
 *  internally to simulate XMLHttpRequest in the browser world.
 */
var originalRequest = require('xmlhttprequest').XMLHttpRequest;

require('xmlhttprequest').XMLHttpRequest = function(){
  originalRequest.apply(this, arguments);
  this.setDisableHeaderCheck(true);
  var stdOpen = this.open;

  /*
   * I will patch now open in order to set my cookie from the jar request.
   */
  this.open = function() {
    stdOpen.apply(this, arguments);
    var header = j.get({ url: 'http://localhost:9000' })
      .map(function (c) {
        return c.name + "=" + c.value;
      }).join("; ");
    this.setRequestHeader('cookie', header);
  };
};


/*
 * Authenticate first, doing a post to some url 
 * with the credentials for instance
 */
request.post({
  jar: j,
  url: 'http://localhost:9000/login',
  form: {username: 'jose', password: 'Pa123'}
}, function (err, resp, body){

  /*
   * now we can connect.. and socket.io will send the cookies!
   */
  var socket = io.connect('http://localhost:9000');
  socket.on('connect', function(){
    console.log('connected! handshakedddddddddddd')
    done();
  }));

});