4 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
12 var Transport = require('../transport')
13 , parser = require('../parser')
14 , qs = require('querystring');
17 * Export the constructor.
20 exports = module.exports = HTTPTransport;
23 * HTTP interface constructor. For all non-websocket transports.
28 function HTTPTransport (mng, data, req) {
29 Transport.call(this, mng, data, req);
33 * Inherits from Transport.
36 HTTPTransport.prototype.__proto__ = Transport.prototype;
44 HTTPTransport.prototype.handleRequest = function (req) {
46 // Always set the response in case an error is returned to the client
47 this.response = req.res;
49 if (req.method == 'POST') {
52 , origin = req.headers.origin
53 , headers = { 'Content-Length': 1, 'Content-Type': 'text/plain; charset=UTF-8' }
56 req.on('data', function (data) {
59 if (Buffer.byteLength(buffer) >= self.manager.get('destroy buffer size')) {
61 req.connection.destroy();
65 req.on('end', function () {
66 res.writeHead(200, headers);
69 self.onData(self.postEncoded ? qs.parse(buffer).d : buffer);
72 // prevent memory leaks for uncompleted requests
73 req.on('close', function () {
79 // https://developer.mozilla.org/En/HTTP_Access_Control
80 headers['Access-Control-Allow-Origin'] = origin;
81 headers['Access-Control-Allow-Credentials'] = 'true';
84 Transport.prototype.handleRequest.call(this, req);
89 * Handles data payload.
94 HTTPTransport.prototype.onData = function (data) {
95 var messages = parser.decodePayload(data);
96 this.log.debug(this.name + ' received data packet', data);
98 for (var i = 0, l = messages.length; i < l; i++) {
99 this.onMessage(messages[i]);
104 * Closes the request-response cycle
109 HTTPTransport.prototype.doClose = function () {
114 * Writes a payload of messages
119 HTTPTransport.prototype.payload = function (msgs) {
120 this.write(parser.encodePayload(msgs));