|
|
/** * 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; };
|