postal.js/example/node/node_modules/socket.io/lib/transports/http.js

118 lines
2.2 KiB
JavaScript

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