rc-web@69: rc-web@69: /*! rc-web@69: * socket.io-node rc-web@69: * Copyright(c) 2011 LearnBoost rc-web@69: * MIT Licensed rc-web@69: */ rc-web@69: rc-web@69: /** rc-web@69: * Module requirements. rc-web@69: */ rc-web@69: rc-web@69: var Transport = require('../transport') rc-web@69: , parser = require('../parser') rc-web@69: , qs = require('querystring'); rc-web@69: rc-web@69: /** rc-web@69: * Export the constructor. rc-web@69: */ rc-web@69: rc-web@69: exports = module.exports = HTTPTransport; rc-web@69: rc-web@69: /** rc-web@69: * HTTP interface constructor. For all non-websocket transports. rc-web@69: * rc-web@69: * @api public rc-web@69: */ rc-web@69: rc-web@69: function HTTPTransport (mng, data, req) { rc-web@69: Transport.call(this, mng, data, req); rc-web@69: }; rc-web@69: rc-web@69: /** rc-web@69: * Inherits from Transport. rc-web@69: */ rc-web@69: rc-web@69: HTTPTransport.prototype.__proto__ = Transport.prototype; rc-web@69: rc-web@69: /** rc-web@69: * Handles a request. rc-web@69: * rc-web@69: * @api private rc-web@69: */ rc-web@69: rc-web@69: HTTPTransport.prototype.handleRequest = function (req) { rc-web@69: rc-web@69: // Always set the response in case an error is returned to the client rc-web@69: this.response = req.res; rc-web@69: rc-web@69: if (req.method == 'POST') { rc-web@69: var buffer = '' rc-web@69: , res = req.res rc-web@69: , origin = req.headers.origin rc-web@69: , headers = { 'Content-Length': 1, 'Content-Type': 'text/plain; charset=UTF-8' } rc-web@69: , self = this; rc-web@69: rc-web@69: req.on('data', function (data) { rc-web@69: buffer += data; rc-web@69: rc-web@69: if (Buffer.byteLength(buffer) >= self.manager.get('destroy buffer size')) { rc-web@69: buffer = ''; rc-web@69: req.connection.destroy(); rc-web@69: } rc-web@69: }); rc-web@69: rc-web@69: req.on('end', function () { rc-web@69: res.writeHead(200, headers); rc-web@69: res.end('1'); rc-web@69: rc-web@69: self.onData(self.postEncoded ? qs.parse(buffer).d : buffer); rc-web@69: }); rc-web@69: rc-web@69: // prevent memory leaks for uncompleted requests rc-web@69: req.on('close', function () { rc-web@69: buffer = ''; rc-web@69: self.onClose(); rc-web@69: }); rc-web@69: rc-web@69: if (origin) { rc-web@69: // https://developer.mozilla.org/En/HTTP_Access_Control rc-web@69: headers['Access-Control-Allow-Origin'] = origin; rc-web@69: headers['Access-Control-Allow-Credentials'] = 'true'; rc-web@69: } rc-web@69: } else { rc-web@69: Transport.prototype.handleRequest.call(this, req); rc-web@69: } rc-web@69: }; rc-web@69: rc-web@69: /** rc-web@69: * Handles data payload. rc-web@69: * rc-web@69: * @api private rc-web@69: */ rc-web@69: rc-web@69: HTTPTransport.prototype.onData = function (data) { rc-web@69: var messages = parser.decodePayload(data); rc-web@69: this.log.debug(this.name + ' received data packet', data); rc-web@69: rc-web@69: for (var i = 0, l = messages.length; i < l; i++) { rc-web@69: this.onMessage(messages[i]); rc-web@69: } rc-web@69: }; rc-web@69: rc-web@69: /** rc-web@69: * Closes the request-response cycle rc-web@69: * rc-web@69: * @api private rc-web@69: */ rc-web@69: rc-web@69: HTTPTransport.prototype.doClose = function () { rc-web@69: this.response.end(); rc-web@69: }; rc-web@69: rc-web@69: /** rc-web@69: * Writes a payload of messages rc-web@69: * rc-web@69: * @api private rc-web@69: */ rc-web@69: rc-web@69: HTTPTransport.prototype.payload = function (msgs) { rc-web@69: this.write(parser.encodePayload(msgs)); rc-web@69: };