prawnsalad / KiwiIRC

This is **DEPRECATED**! Please go to https://github.com/kiwiirc/kiwiirc
https://kiwiirc.com
GNU Affero General Public License v3.0
891 stars 277 forks source link

req in 'irc connecting' fails randomly #863

Closed Robby- closed 8 years ago

Robby- commented 8 years ago

I'm using a client plugin and a server module called username. It generates a string of random alphanumeric characters which is then stored in a cookie and used as the ident of the user on IRC.

It turns out that the server module sometimes fails to retrieve the headers, and thus the cookie.

However, it seems that manually setting conf.client_transports to either polling or websocket in config.js seems to fix the issue, rather than leaving that option commented out, which causes cookie retrieval to fail at random. This "fix" is however not ideal as it will lock browsers to the configured transport.

I added the following to server_modules/username.js to see what happens:

var obj1 = event_data.connection.state.client.websocket.transport;
console.log(require('util').inspect(obj1));
var obj2 = event_data.connection.state.client.websocket.transport.req;
console.log(require('util').inspect(obj2));

When it is failing obj2 returns only undefined, and obj1 returns the following:

{ readyState: 'open',
  discarded: false,
  socket:
   { domain: null,
     _events:
      { message: [Function],
        close: [Object],
        error: [Function],
        headers: [Function] },
     _maxListeners: 10,
     _socket:
      { _connecting: false,
        _handle: [Object],
        _readableState: [Object],
        readable: true,
        domain: null,
        _events: [Object],
        _maxListeners: 10,
        _writableState: [Object],
        writable: true,
        allowHalfOpen: true,
        onend: null,
        destroyed: false,
        bytesRead: 988,
        _bytesDispatched: 243,
        _pendingData: null,
        _pendingEncoding: '',
        server: [Object],
        _idleTimeout: -1,
        _idleNext: null,
        _idlePrev: null,
        _idleStart: 1459104891037,
        parser: null,
        ondata: null,
        _paused: false,
        _peername: [Object],
        pipe: [Function],
        addListener: [Function: addListener],
        on: [Function: addListener],
        pause: [Function],
        resume: [Function],
        read: [Function],
        _consuming: true },
     _ultron: { id: 0, ee: [Object] },
     _closeReceived: false,
     bytesReceived: 207,
     readyState: 1,
     supports: { binary: true },
     extensions: { 'permessage-deflate': [Object] },
     protocol: undefined,
     protocolVersion: 13,
     upgradeReq:
      { _readableState: [Object],
        readable: true,
        domain: null,
        _events: {},
        _maxListeners: 10,
        socket: [Object],
        connection: [Object],
        httpVersion: '1.1',
        complete: true,
        headers: [Object],
        trailers: {},
        _pendings: [],
        _pendingIndex: 0,
        url: '/kiwi/transport/?EIO=3&transport=websocket&sid=laFUb0RxxRBSPmckAAAA',
        method: 'GET',
        statusCode: null,
        client: [Object],
        _consuming: false,
        _dumped: false,
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        upgrade: true,
        parser: null,
        meta: [Object],
        _query: [Object],
        websocket: [Circular] },
     _isServer: true,
     _receiver:
      { fragmentedBufferPool: [Object],
        unfragmentedBufferPool: [Object],
        extensions: [Object],
        state: [Object],
        overflow: [],
        headerBuffer: <Buffer 11 51 8b 64 00 00 00 00 08 54>,
        expectOffset: 0,
        expectBuffer: <Buffer 11 51>,
        expectHandler: [Function],
        currentMessage: [],
        messageHandlers: [],
        dead: false,
        processing: true,
        onerror: [Function: onerror],
        ontext: [Function: ontext],
        onbinary: [Function: onbinary],
        onclose: [Function: onclose],
        onping: [Function: onping],
        onpong: [Function: onpong] },
     _sender:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        _socket: [Object],
        extensions: [Object],
        firstFragment: true,
        compress: false,
        messageHandlers: [],
        processing: false } },
  writable: true,
  perMessageDeflate: { threshold: 1024 },
  supportsBinary: true,
  _events:
   { error: { [Function: g] listener: [Function] },
     packet: [Function],
     drain: [ [Function], [Function: onDrain] ],
     close: { [Function: g] listener: [Function] } } }
Robby- commented 8 years ago

Oh, it didn't auto-close.

Robby- commented 8 years ago

For anyone else having issues retrieving headers or cookies using event_data.connection.state.client.websocket.transport.req.headers or event_data.connection.state.client.websocket.transport.req.headers.cookie in their server modules, the better way as of 4a680edaa9aab3c18c13c5e4e03f3bb2cbabec29 is event_data.connection.state.client.websocket.meta.headers for the headers and event_data.connection.state.client.websocket.meta.headers.cookie for the cookie.