|
|
- 'use strict';
-
- var EventEmitter = require('events').EventEmitter
- , inherits = require('inherits')
- , http = require('http')
- , https = require('https')
- , URL = require('url-parse')
- ;
-
- var debug = function() {};
- if (process.env.NODE_ENV !== 'production') {
- debug = require('debug')('sockjs-client:driver:xhr');
- }
-
- function XhrDriver(method, url, payload, opts) {
- debug(method, url, payload);
- var self = this;
- EventEmitter.call(this);
-
- var parsedUrl = new URL(url);
- var options = {
- method: method
- , hostname: parsedUrl.hostname.replace(/\[|\]/g, '')
- , port: parsedUrl.port
- , path: parsedUrl.pathname + (parsedUrl.query || '')
- , headers: opts && opts.headers
- , agent: false
- };
-
- var protocol = parsedUrl.protocol === 'https:' ? https : http;
- this.req = protocol.request(options, function(res) {
- res.setEncoding('utf8');
- var responseText = '';
-
- res.on('data', function(chunk) {
- debug('data', chunk);
- responseText += chunk;
- self.emit('chunk', 200, responseText);
- });
- res.once('end', function() {
- debug('end');
- self.emit('finish', res.statusCode, responseText);
- self.req = null;
- });
- });
-
- this.req.on('error', function(e) {
- debug('error', e);
- self.emit('finish', 0, e.message);
- });
-
- if (payload) {
- this.req.write(payload);
- }
- this.req.end();
- }
-
- inherits(XhrDriver, EventEmitter);
-
- XhrDriver.prototype.close = function() {
- debug('close');
- this.removeAllListeners();
- if (this.req) {
- this.req.abort();
- this.req = null;
- }
- };
-
- XhrDriver.enabled = true;
- XhrDriver.supportsCORS = true;
-
- module.exports = XhrDriver;
|