You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

101 lines
2.1 KiB

/**
* Module dependencies.
*/
var Polling = require('./polling');
var Transport = require('../transport');
var debug = require('debug')('engine:polling-xhr');
/**
* Module exports.
*/
module.exports = XHR;
/**
* Ajax polling transport.
*
* @api public
*/
function XHR(req){
Polling.call(this, req);
}
/**
* Inherits from Polling.
*/
XHR.prototype.__proto__ = Polling.prototype;
/**
* Overrides `onRequest` to handle `OPTIONS`..
*
* @param {http.ServerRequest}
* @api private
*/
XHR.prototype.onRequest = function (req) {
if ('OPTIONS' == req.method) {
var res = req.res;
var headers = this.headers(req);
headers['Access-Control-Allow-Headers'] = 'Content-Type';
res.writeHead(200, headers);
res.end();
} else {
Polling.prototype.onRequest.call(this, req);
}
};
/**
* Frames data prior to write.
*
* @api private
*/
XHR.prototype.doWrite = function(data){
// explicit UTF-8 is required for pages not served under utf
var isString = typeof data == 'string';
var contentType = isString
? 'text/plain; charset=UTF-8'
: 'application/octet-stream';
var contentLength = '' + (isString ? Buffer.byteLength(data) : data.length);
var headers = {
'Content-Type': contentType,
'Content-Length': contentLength
};
// prevent XSS warnings on IE
// https://github.com/LearnBoost/socket.io/pull/1333
var ua = this.req.headers['user-agent'];
if (ua && (~ua.indexOf(';MSIE') || ~ua.indexOf('Trident/'))) {
headers['X-XSS-Protection'] = '0';
}
this.res.writeHead(200, this.headers(this.req, headers));
this.res.end(data);
};
/**
* Returns headers for a response.
*
* @param {http.ServerRequest} request
* @param {Object} extra headers
* @api private
*/
XHR.prototype.headers = function(req, headers){
headers = headers || {};
if (req.headers.origin) {
headers['Access-Control-Allow-Credentials'] = 'true';
headers['Access-Control-Allow-Origin'] = req.headers.origin;
} else {
headers['Access-Control-Allow-Origin'] = '*';
}
this.emit('headers', headers);
return headers;
};