rc-web@69
|
1
|
rc-web@69
|
2 /*!
|
rc-web@69
|
3 * socket.io-node
|
rc-web@69
|
4 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
|
rc-web@69
|
5 * MIT Licensed
|
rc-web@69
|
6 */
|
rc-web@69
|
7
|
rc-web@69
|
8 /**
|
rc-web@69
|
9 * Module requirements.
|
rc-web@69
|
10 */
|
rc-web@69
|
11
|
rc-web@69
|
12 var Transport = require('../transport')
|
rc-web@69
|
13 , parser = require('../parser')
|
rc-web@69
|
14 , qs = require('querystring');
|
rc-web@69
|
15
|
rc-web@69
|
16 /**
|
rc-web@69
|
17 * Export the constructor.
|
rc-web@69
|
18 */
|
rc-web@69
|
19
|
rc-web@69
|
20 exports = module.exports = HTTPTransport;
|
rc-web@69
|
21
|
rc-web@69
|
22 /**
|
rc-web@69
|
23 * HTTP interface constructor. For all non-websocket transports.
|
rc-web@69
|
24 *
|
rc-web@69
|
25 * @api public
|
rc-web@69
|
26 */
|
rc-web@69
|
27
|
rc-web@69
|
28 function HTTPTransport (mng, data, req) {
|
rc-web@69
|
29 Transport.call(this, mng, data, req);
|
rc-web@69
|
30 };
|
rc-web@69
|
31
|
rc-web@69
|
32 /**
|
rc-web@69
|
33 * Inherits from Transport.
|
rc-web@69
|
34 */
|
rc-web@69
|
35
|
rc-web@69
|
36 HTTPTransport.prototype.__proto__ = Transport.prototype;
|
rc-web@69
|
37
|
rc-web@69
|
38 /**
|
rc-web@69
|
39 * Handles a request.
|
rc-web@69
|
40 *
|
rc-web@69
|
41 * @api private
|
rc-web@69
|
42 */
|
rc-web@69
|
43
|
rc-web@69
|
44 HTTPTransport.prototype.handleRequest = function (req) {
|
rc-web@69
|
45
|
rc-web@69
|
46 // Always set the response in case an error is returned to the client
|
rc-web@69
|
47 this.response = req.res;
|
rc-web@69
|
48
|
rc-web@69
|
49 if (req.method == 'POST') {
|
rc-web@69
|
50 var buffer = ''
|
rc-web@69
|
51 , res = req.res
|
rc-web@69
|
52 , origin = req.headers.origin
|
rc-web@69
|
53 , headers = { 'Content-Length': 1, 'Content-Type': 'text/plain; charset=UTF-8' }
|
rc-web@69
|
54 , self = this;
|
rc-web@69
|
55
|
rc-web@69
|
56 req.on('data', function (data) {
|
rc-web@69
|
57 buffer += data;
|
rc-web@69
|
58
|
rc-web@69
|
59 if (Buffer.byteLength(buffer) >= self.manager.get('destroy buffer size')) {
|
rc-web@69
|
60 buffer = '';
|
rc-web@69
|
61 req.connection.destroy();
|
rc-web@69
|
62 }
|
rc-web@69
|
63 });
|
rc-web@69
|
64
|
rc-web@69
|
65 req.on('end', function () {
|
rc-web@69
|
66 res.writeHead(200, headers);
|
rc-web@69
|
67 res.end('1');
|
rc-web@69
|
68
|
rc-web@69
|
69 self.onData(self.postEncoded ? qs.parse(buffer).d : buffer);
|
rc-web@69
|
70 });
|
rc-web@69
|
71
|
rc-web@69
|
72 // prevent memory leaks for uncompleted requests
|
rc-web@69
|
73 req.on('close', function () {
|
rc-web@69
|
74 buffer = '';
|
rc-web@69
|
75 self.onClose();
|
rc-web@69
|
76 });
|
rc-web@69
|
77
|
rc-web@69
|
78 if (origin) {
|
rc-web@69
|
79 // https://developer.mozilla.org/En/HTTP_Access_Control
|
rc-web@69
|
80 headers['Access-Control-Allow-Origin'] = origin;
|
rc-web@69
|
81 headers['Access-Control-Allow-Credentials'] = 'true';
|
rc-web@69
|
82 }
|
rc-web@69
|
83 } else {
|
rc-web@69
|
84 Transport.prototype.handleRequest.call(this, req);
|
rc-web@69
|
85 }
|
rc-web@69
|
86 };
|
rc-web@69
|
87
|
rc-web@69
|
88 /**
|
rc-web@69
|
89 * Handles data payload.
|
rc-web@69
|
90 *
|
rc-web@69
|
91 * @api private
|
rc-web@69
|
92 */
|
rc-web@69
|
93
|
rc-web@69
|
94 HTTPTransport.prototype.onData = function (data) {
|
rc-web@69
|
95 var messages = parser.decodePayload(data);
|
rc-web@69
|
96 this.log.debug(this.name + ' received data packet', data);
|
rc-web@69
|
97
|
rc-web@69
|
98 for (var i = 0, l = messages.length; i < l; i++) {
|
rc-web@69
|
99 this.onMessage(messages[i]);
|
rc-web@69
|
100 }
|
rc-web@69
|
101 };
|
rc-web@69
|
102
|
rc-web@69
|
103 /**
|
rc-web@69
|
104 * Closes the request-response cycle
|
rc-web@69
|
105 *
|
rc-web@69
|
106 * @api private
|
rc-web@69
|
107 */
|
rc-web@69
|
108
|
rc-web@69
|
109 HTTPTransport.prototype.doClose = function () {
|
rc-web@69
|
110 this.response.end();
|
rc-web@69
|
111 };
|
rc-web@69
|
112
|
rc-web@69
|
113 /**
|
rc-web@69
|
114 * Writes a payload of messages
|
rc-web@69
|
115 *
|
rc-web@69
|
116 * @api private
|
rc-web@69
|
117 */
|
rc-web@69
|
118
|
rc-web@69
|
119 HTTPTransport.prototype.payload = function (msgs) {
|
rc-web@69
|
120 this.write(parser.encodePayload(msgs));
|
rc-web@69
|
121 };
|