function XMLHttpRequest(options) { XMLHttpRequest.__super__.constructor.call(this); this.onreadystatechange = null; this._anonymous = options && options.anon; this.readyState = XMLHttpRequest.UNSENT; this.response = null; this.responseText = ''; this.responseType = ''; this.responseURL = ''; this.status = 0; this.statusText = ''; this.timeout = 0; this.upload = new XMLHttpRequestUpload(this); this._method = null; this._url = null; this._sync = false; this._headers = null; this._loweredHeaders = null; this._mimeOverride = null; this._request = null; this._response = null; this._responseParts = null; this._responseHeaders = null; this._aborting = null; this._error = null; this._loadedBytes = 0; this._totalBytes = 0; this._lengthComputable = false; }
n/a
function InvalidStateError() { return InvalidStateError.__super__.constructor.apply(this, arguments); }
n/a
function ProgressEvent(type) { this.type = type; this.target = null; this.currentTarget = null; this.lengthComputable = false; this.loaded = 0; this.total = 0; }
n/a
function SecurityError() { SecurityError.__super__.constructor.apply(this, arguments); }
n/a
function XMLHttpRequest(options) { XMLHttpRequest.__super__.constructor.call(this); this.onreadystatechange = null; this._anonymous = options && options.anon; this.readyState = XMLHttpRequest.UNSENT; this.response = null; this.responseText = ''; this.responseType = ''; this.responseURL = ''; this.status = 0; this.statusText = ''; this.timeout = 0; this.upload = new XMLHttpRequestUpload(this); this._method = null; this._url = null; this._sync = false; this._headers = null; this._loweredHeaders = null; this._mimeOverride = null; this._request = null; this._response = null; this._responseParts = null; this._responseHeaders = null; this._aborting = null; this._error = null; this._loadedBytes = 0; this._totalBytes = 0; this._lengthComputable = false; }
n/a
function XMLHttpRequestUpload(request) { XMLHttpRequestUpload.__super__.constructor.call(this); this._request = request; this._reset(); }
n/a
nodejsSet = function (options) { XMLHttpRequest.prototype.nodejsSet(options); return void 0; }
...
}
this.nodejsBaseUrl = baseUrl;
}
return void 0;
};
XMLHttpRequest.nodejsSet = function(options) {
XMLHttpRequest.prototype.nodejsSet(options);
return void 0;
};
XMLHttpRequest.prototype.UNSENT = 0;
XMLHttpRequest.UNSENT = 0;
...
function InvalidStateError() { return InvalidStateError.__super__.constructor.apply(this, arguments); }
n/a
function captureStackTrace() { [native code] }
n/a
function InvalidStateError() { return InvalidStateError.__super__.constructor.apply(this, arguments); }
n/a
function SecurityError() { SecurityError.__super__.constructor.apply(this, arguments); }
n/a
function captureStackTrace() { [native code] }
n/a
function SecurityError() { SecurityError.__super__.constructor.apply(this, arguments); }
n/a
function XMLHttpRequest(options) { XMLHttpRequest.__super__.constructor.call(this); this.onreadystatechange = null; this._anonymous = options && options.anon; this.readyState = XMLHttpRequest.UNSENT; this.response = null; this.responseText = ''; this.responseType = ''; this.responseURL = ''; this.status = 0; this.statusText = ''; this.timeout = 0; this.upload = new XMLHttpRequestUpload(this); this._method = null; this._url = null; this._sync = false; this._headers = null; this._loweredHeaders = null; this._mimeOverride = null; this._request = null; this._response = null; this._responseParts = null; this._responseHeaders = null; this._aborting = null; this._error = null; this._loadedBytes = 0; this._totalBytes = 0; this._lengthComputable = false; }
n/a
function InvalidStateError() { return InvalidStateError.__super__.constructor.apply(this, arguments); }
n/a
function ProgressEvent(type) { this.type = type; this.target = null; this.currentTarget = null; this.lengthComputable = false; this.loaded = 0; this.total = 0; }
n/a
function SecurityError() { SecurityError.__super__.constructor.apply(this, arguments); }
n/a
function XMLHttpRequestUpload(request) { XMLHttpRequestUpload.__super__.constructor.call(this); this._request = request; this._reset(); }
n/a
nodejsSet = function (options) { XMLHttpRequest.prototype.nodejsSet(options); return void 0; }
...
}
this.nodejsBaseUrl = baseUrl;
}
return void 0;
};
XMLHttpRequest.nodejsSet = function(options) {
XMLHttpRequest.prototype.nodejsSet(options);
return void 0;
};
XMLHttpRequest.prototype.UNSENT = 0;
XMLHttpRequest.UNSENT = 0;
...
_concatBuffers = function (buffers) { var buffer, j, k, len, len1, length, target; if (buffers.length === 0) { return new Buffer(0); } if (buffers.length === 1) { return buffers[0]; } length = 0; for (j = 0, len = buffers.length; j < len; j++) { buffer = buffers[j]; length += buffer.length; } target = new Buffer(length); length = 0; for (k = 0, len1 = buffers.length; k < len1; k++) { buffer = buffers[k]; buffer.copy(target, length); length += buffer.length; } return target; }
...
};
XMLHttpRequest.prototype._parseResponse = function() {
var arrayBuffer, buffer, i, j, jsonError, ref, view;
if (Buffer.concat) {
buffer = Buffer.concat(this._responseParts);
} else {
buffer = this._concatBuffers(this._responseParts);
}
this._responseParts = null;
switch (this.responseType) {
case 'text':
this._parseTextResponse(buffer);
break;
case 'json':
...
_dispatchProgress = function (eventType) { var event; event = new ProgressEvent(eventType); event.lengthComputable = this._lengthComputable; event.loaded = this._loadedBytes; event.total = this._totalBytes; this.dispatchEvent(event); return void 0; }
...
XMLHttpRequest.prototype.abort = function() {
if (!this._request) {
return;
}
this._request.abort();
this._setError();
this._dispatchProgress('abort');
this._dispatchProgress('loadend');
return void 0;
};
XMLHttpRequest.prototype.getResponseHeader = function(name) {
var loweredName;
if (!this._responseHeaders) {
...
_finalizeHeaders = function () { this._headers['Connection'] = 'keep-alive'; this._headers['Host'] = this._url.host; if (this._anonymous) { this._headers['Referer'] = 'about:blank'; } this._headers['User-Agent'] = this._userAgent; this.upload._finalizeHeaders(this._headers, this._loweredHeaders); return void 0; }
...
if ((data != null) && (this._method === 'GET' || this._method === 'HEAD')) {
console.warn("Discarding entity body for " + this._method + " requests");
data = null;
} else {
data || (data = '');
}
this.upload._setData(data);
this._finalizeHeaders();
this._sendHxxpRequest();
return void 0;
};
XMLHttpRequest.prototype._sendHxxpRequest = function() {
var agent, hxxp, request;
if (this._url.protocol === 'http:') {
...
_onHttpRequestError = function (request, error) { if (this._request !== request) { return; } this._setError(); request.abort(); this._setReadyState(XMLHttpRequest.DONE); this._dispatchProgress('error'); return this._dispatchProgress('loadend'); }
...
request.on('response', (function(_this) {
return function(response) {
return _this._onHttpResponse(request, response);
};
})(this));
request.on('error', (function(_this) {
return function(error) {
return _this._onHttpRequestError(request, error);
};
})(this));
this.upload._startUpload(request);
if (this._request === request) {
this._dispatchProgress('loadstart');
}
return void 0;
...
_onHttpResponse = function (request, response) { var lengthString; if (this._request !== request) { return; } switch (response.statusCode) { case 301: case 302: case 303: case 307: case 308: this._url = this._parseUrl(response.headers['location']); this._method = 'GET'; if ('content-type' in this._loweredHeaders) { delete this._headers[this._loweredHeaders['content-type']]; delete this._loweredHeaders['content-type']; } if ('Content-Type' in this._headers) { delete this._headers['Content-Type']; } delete this._headers['Content-Length']; this.upload._reset(); this._finalizeHeaders(); this._sendHxxpRequest(); return; } this._response = response; this._response.on('data', (function(_this) { return function(data) { return _this._onHttpResponseData(response, data); }; })(this)); this._response.on('end', (function(_this) { return function() { return _this._onHttpResponseEnd(response); }; })(this)); this._response.on('close', (function(_this) { return function() { return _this._onHttpResponseClose(response); }; })(this)); this.responseURL = this._url.href.split('#')[0]; this.status = this._response.statusCode; this.statusText = http.STATUS_CODES[this.status]; this._parseResponseHeaders(response); if (lengthString = this._responseHeaders['content-length']) { this._totalBytes = parseInt(lengthString); this._lengthComputable = true; } else { this._lengthComputable = false; } return this._setReadyState(XMLHttpRequest.HEADERS_RECEIVED); }
...
return function() {
return _this._onHttpTimeout(request);
};
})(this));
}
request.on('response', (function(_this) {
return function(response) {
return _this._onHttpResponse(request, response);
};
})(this));
request.on('error', (function(_this) {
return function(error) {
return _this._onHttpRequestError(request, error);
};
})(this));
...
_onHttpResponseClose = function (response) { var request; if (this._response !== response) { return; } request = this._request; this._setError(); request.abort(); this._setReadyState(XMLHttpRequest.DONE); this._dispatchProgress('error'); return this._dispatchProgress('loadend'); }
...
this._response.on('end', (function(_this) {
return function() {
return _this._onHttpResponseEnd(response);
};
})(this));
this._response.on('close', (function(_this) {
return function() {
return _this._onHttpResponseClose(response);
};
})(this));
this.responseURL = this._url.href.split('#')[0];
this.status = this._response.statusCode;
this.statusText = http.STATUS_CODES[this.status];
this._parseResponseHeaders(response);
if (lengthString = this._responseHeaders['content-length']) {
...
_onHttpResponseData = function (response, data) { if (this._response !== response) { return; } this._responseParts.push(data); this._loadedBytes += data.length; if (this.readyState !== XMLHttpRequest.LOADING) { this._setReadyState(XMLHttpRequest.LOADING); } return this._dispatchProgress('progress'); }
...
this._finalizeHeaders();
this._sendHxxpRequest();
return;
}
this._response = response;
this._response.on('data', (function(_this) {
return function(data) {
return _this._onHttpResponseData(response, data);
};
})(this));
this._response.on('end', (function(_this) {
return function() {
return _this._onHttpResponseEnd(response);
};
})(this));
...
_onHttpResponseEnd = function (response) { if (this._response !== response) { return; } this._parseResponse(); this._request = null; this._response = null; this._setReadyState(XMLHttpRequest.DONE); this._dispatchProgress('load'); return this._dispatchProgress('loadend'); }
...
this._response.on('data', (function(_this) {
return function(data) {
return _this._onHttpResponseData(response, data);
};
})(this));
this._response.on('end', (function(_this) {
return function() {
return _this._onHttpResponseEnd(response);
};
})(this));
this._response.on('close', (function(_this) {
return function() {
return _this._onHttpResponseClose(response);
};
})(this));
...
_onHttpTimeout = function (request) { if (this._request !== request) { return; } this._setError(); request.abort(); this._setReadyState(XMLHttpRequest.DONE); this._dispatchProgress('timeout'); return this._dispatchProgress('loadend'); }
...
headers: this._headers,
agent: agent
});
this._request = request;
if (this.timeout) {
request.setTimeout(this.timeout, (function(_this) {
return function() {
return _this._onHttpTimeout(request);
};
})(this));
}
request.on('response', (function(_this) {
return function(response) {
return _this._onHttpResponse(request, response);
};
...
_parseResponse = function () { var arrayBuffer, buffer, i, j, jsonError, ref, view; if (Buffer.concat) { buffer = Buffer.concat(this._responseParts); } else { buffer = this._concatBuffers(this._responseParts); } this._responseParts = null; switch (this.responseType) { case 'text': this._parseTextResponse(buffer); break; case 'json': this.responseText = null; try { this.response = JSON.parse(buffer.toString('utf-8')); } catch (error1) { jsonError = error1; this.response = null; } break; case 'buffer': this.responseText = null; this.response = buffer; break; case 'arraybuffer': this.responseText = null; arrayBuffer = new ArrayBuffer(buffer.length); view = new Uint8Array(arrayBuffer); for (i = j = 0, ref = buffer.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { view[i] = buffer[i]; } this.response = arrayBuffer; break; default: this._parseTextResponse(buffer); } return void 0; }
...
return this._dispatchProgress('progress');
};
XMLHttpRequest.prototype._onHttpResponseEnd = function(response) {
if (this._response !== response) {
return;
}
this._parseResponse();
this._request = null;
this._response = null;
this._setReadyState(XMLHttpRequest.DONE);
this._dispatchProgress('load');
return this._dispatchProgress('loadend');
};
...
_parseResponseEncoding = function () { var contentType, encoding, match; encoding = null; if (contentType = this._responseHeaders['content-type']) { if (match = /\;\s*charset\=(.*)$/.exec(contentType)) { return match[1]; } } return 'utf-8'; }
...
}
return void 0;
};
XMLHttpRequest.prototype._parseTextResponse = function(buffer) {
var e;
try {
this.responseText = buffer.toString(this._parseResponseEncoding());
} catch (error1) {
e = error1;
this.responseText = buffer.toString('binary');
}
this.response = this.responseText;
return void 0;
};
...
_parseResponseHeaders = function (response) { var loweredName, name, ref, value; this._responseHeaders = {}; ref = response.headers; for (name in ref) { value = ref[name]; loweredName = name.toLowerCase(); if (this._privateHeaders[loweredName]) { continue; } if (this._mimeOverride !== null && loweredName === 'content-type') { value = this._mimeOverride; } this._responseHeaders[loweredName] = value; } if (this._mimeOverride !== null && !('content-type' in this._responseHeaders)) { this._responseHeaders['content-type'] = this._mimeOverride; } return void 0; }
...
return function() {
return _this._onHttpResponseClose(response);
};
})(this));
this.responseURL = this._url.href.split('#')[0];
this.status = this._response.statusCode;
this.statusText = http.STATUS_CODES[this.status];
this._parseResponseHeaders(response);
if (lengthString = this._responseHeaders['content-length']) {
this._totalBytes = parseInt(lengthString);
this._lengthComputable = true;
} else {
this._lengthComputable = false;
}
return this._setReadyState(XMLHttpRequest.HEADERS_RECEIVED);
...
_parseTextResponse = function (buffer) { var e; try { this.responseText = buffer.toString(this._parseResponseEncoding()); } catch (error1) { e = error1; this.responseText = buffer.toString('binary'); } this.response = this.responseText; return void 0; }
...
buffer = Buffer.concat(this._responseParts);
} else {
buffer = this._concatBuffers(this._responseParts);
}
this._responseParts = null;
switch (this.responseType) {
case 'text':
this._parseTextResponse(buffer);
break;
case 'json':
this.responseText = null;
try {
this.response = JSON.parse(buffer.toString('utf-8'));
} catch (error1) {
jsonError = error1;
...
_parseUrl = function (urlString) { var absoluteUrlString, index, password, user, xhrUrl; if (this.nodejsBaseUrl === null) { absoluteUrlString = urlString; } else { absoluteUrlString = url.resolve(this.nodejsBaseUrl, urlString); } xhrUrl = url.parse(absoluteUrlString, false, true); xhrUrl.hash = null; if (xhrUrl.auth && ((typeof user !== "undefined" && user !== null) || (typeof password !== "undefined" && password !== null))) { index = xhrUrl.auth.indexOf(':'); if (index === -1) { if (!user) { user = xhrUrl.auth; } } else { if (!user) { user = xhrUrl.substring(0, index); } if (!password) { password = xhrUrl.substring(index + 1); } } } if (user || password) { xhrUrl.auth = user + ":" + password; } return xhrUrl; }
...
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
var xhrUrl;
method = method.toUpperCase();
if (method in this._restrictedMethods) {
throw new SecurityError("HTTP method " + method + " is not allowed in XHR");
}
xhrUrl = this._parseUrl(url);
if (async === void 0) {
async = true;
}
switch (this.readyState) {
case XMLHttpRequest.UNSENT:
case XMLHttpRequest.OPENED:
case XMLHttpRequest.DONE:
...
_sendFile = function () { if (this._url.method !== 'GET') { throw new NetworkError('The file protocol only supports GET'); } throw new Error("Protocol file: not implemented"); }
...
throw new InvalidStateError("XHR readyState must be OPENED");
}
if (this._request) {
throw new InvalidStateError("send() already called");
}
switch (this._url.protocol) {
case 'file:':
this._sendFile(data);
break;
case 'http:':
case 'https:':
this._sendHttp(data);
break;
default:
throw new NetworkError("Unsupported protocol " + this._url.protocol);
...
_sendHttp = function (data) { if (this._sync) { throw new Error("Synchronous XHR processing not implemented"); } if ((data != null) && (this._method === 'GET' || this._method === 'HEAD')) { console.warn("Discarding entity body for " + this._method + " requests"); data = null; } else { data || (data = ''); } this.upload._setData(data); this._finalizeHeaders(); this._sendHxxpRequest(); return void 0; }
...
}
switch (this._url.protocol) {
case 'file:':
this._sendFile(data);
break;
case 'http:':
case 'https:':
this._sendHttp(data);
break;
default:
throw new NetworkError("Unsupported protocol " + this._url.protocol);
}
return void 0;
};
...
_sendHxxpRequest = function () { var agent, hxxp, request; if (this._url.protocol === 'http:') { hxxp = http; agent = this.nodejsHttpAgent; } else { hxxp = https; agent = this.nodejsHttpsAgent; } request = hxxp.request({ hostname: this._url.hostname, port: this._url.port, path: this._url.path, auth: this._url.auth, method: this._method, headers: this._headers, agent: agent }); this._request = request; if (this.timeout) { request.setTimeout(this.timeout, (function(_this) { return function() { return _this._onHttpTimeout(request); }; })(this)); } request.on('response', (function(_this) { return function(response) { return _this._onHttpResponse(request, response); }; })(this)); request.on('error', (function(_this) { return function(error) { return _this._onHttpRequestError(request, error); }; })(this)); this.upload._startUpload(request); if (this._request === request) { this._dispatchProgress('loadstart'); } return void 0; }
...
console.warn("Discarding entity body for " + this._method + " requests");
data = null;
} else {
data || (data = '');
}
this.upload._setData(data);
this._finalizeHeaders();
this._sendHxxpRequest();
return void 0;
};
XMLHttpRequest.prototype._sendHxxpRequest = function() {
var agent, hxxp, request;
if (this._url.protocol === 'http:') {
hxxp = http;
...
_setError = function () { this._request = null; this._response = null; this._responseHeaders = null; this._responseParts = null; return void 0; }
...
};
XMLHttpRequest.prototype.abort = function() {
if (!this._request) {
return;
}
this._request.abort();
this._setError();
this._dispatchProgress('abort');
this._dispatchProgress('loadend');
return void 0;
};
XMLHttpRequest.prototype.getResponseHeader = function(name) {
var loweredName;
...
_setReadyState = function (newReadyState) { var event; this.readyState = newReadyState; event = new ProgressEvent('readystatechange'); this.dispatchEvent(event); return void 0; }
...
}
this._method = method;
this._url = xhrUrl;
this._sync = !async;
this._headers = {};
this._loweredHeaders = {};
this._mimeOverride = null;
this._setReadyState(XMLHttpRequest.OPENED);
this._request = null;
this._response = null;
this.status = 0;
this.statusText = '';
this._responseParts = [];
this._responseHeaders = null;
this._loadedBytes = 0;
...
abort = function () { if (!this._request) { return; } this._request.abort(); this._setError(); this._dispatchProgress('abort'); this._dispatchProgress('loadend'); return void 0; }
...
return void 0;
};
XMLHttpRequest.prototype.abort = function() {
if (!this._request) {
return;
}
this._request.abort();
this._setError();
this._dispatchProgress('abort');
this._dispatchProgress('loadend');
return void 0;
};
XMLHttpRequest.prototype.getResponseHeader = function(name) {
...
function XMLHttpRequest(options) { XMLHttpRequest.__super__.constructor.call(this); this.onreadystatechange = null; this._anonymous = options && options.anon; this.readyState = XMLHttpRequest.UNSENT; this.response = null; this.responseText = ''; this.responseType = ''; this.responseURL = ''; this.status = 0; this.statusText = ''; this.timeout = 0; this.upload = new XMLHttpRequestUpload(this); this._method = null; this._url = null; this._sync = false; this._headers = null; this._loweredHeaders = null; this._mimeOverride = null; this._request = null; this._response = null; this._responseParts = null; this._responseHeaders = null; this._aborting = null; this._error = null; this._loadedBytes = 0; this._totalBytes = 0; this._lengthComputable = false; }
n/a
getAllResponseHeaders = function () { var lines, name, value; if (!this._responseHeaders) { return ''; } lines = (function() { var ref, results; ref = this._responseHeaders; results = []; for (name in ref) { value = ref[name]; results.push(name + ": " + value); } return results; }).call(this); return lines.join("\r\n"); }
...
"Content-Type": "application/xhr2; charset=utf-1337",
"Set-Cookie": "UserID=JohnDoe; Max-Age=3600; Version=1",
"X-Header": "one, more, value"}
'''
it 'contains accessible headers', (done) ->
@xhr.onloadend = =>
headers = @xhr.getAllResponseHeaders()
expect(headers).to.match(/(\A|\r\n)accept-ranges: bytes(\r\n|\Z)/mi)
expect(headers).to.match(
/(\A|\r\n)content-type: application\/xhr2; charset=utf-1337(\r\n|\Z)/mi)
expect(headers).to.match(/(\A|\r\n)X-Header: one, more, value(\r\n|\Z)/mi)
done()
@xhr.send @headerJson
...
getResponseHeader = function (name) { var loweredName; if (!this._responseHeaders) { return null; } loweredName = name.toLowerCase(); if (loweredName in this._responseHeaders) { return this._responseHeaders[loweredName]; } else { return null; } }
...
"Content-Type": "application/xhr2; charset=utf-1337",
"Set-Cookie": "UserID=JohnDoe; Max-Age=3600; Version=1",
"X-Header": "one, more, value"}
'''
it 'returns accessible headers', (done) ->
@xhr.onloadend = =>
expect(@xhr.getResponseHeader('AccEPt-RANgeS')).to.equal 'bytes'
;
expect(@xhr.getResponseHeader('content-Type')).to.
equal 'application/xhr2; charset=utf-1337'
expect(@xhr.getResponseHeader('X-Header')).to.equal "one, more, value"
done()
@xhr.send @headerJson
it 'returns null for private headers', (done) ->
...
nodejsSet = function (options) { var baseUrl, parsedUrl; if ('httpAgent' in options) { this.nodejsHttpAgent = options.httpAgent; } if ('httpsAgent' in options) { this.nodejsHttpsAgent = options.httpsAgent; } if ('baseUrl' in options) { baseUrl = options.baseUrl; if (baseUrl !== null) { parsedUrl = url.parse(baseUrl, false, true); if (!parsedUrl.protocol) { throw new SyntaxError("baseUrl must be an absolute URL"); } } this.nodejsBaseUrl = baseUrl; } return void 0; }
...
}
this.nodejsBaseUrl = baseUrl;
}
return void 0;
};
XMLHttpRequest.nodejsSet = function(options) {
XMLHttpRequest.prototype.nodejsSet(options);
return void 0;
};
XMLHttpRequest.prototype.UNSENT = 0;
XMLHttpRequest.UNSENT = 0;
...
open = function (method, url, async, user, password) { var xhrUrl; method = method.toUpperCase(); if (method in this._restrictedMethods) { throw new SecurityError("HTTP method " + method + " is not allowed in XHR"); } xhrUrl = this._parseUrl(url); if (async === void 0) { async = true; } switch (this.readyState) { case XMLHttpRequest.UNSENT: case XMLHttpRequest.OPENED: case XMLHttpRequest.DONE: null; break; case XMLHttpRequest.HEADERS_RECEIVED: case XMLHttpRequest.LOADING: null; } this._method = method; this._url = xhrUrl; this._sync = !async; this._headers = {}; this._loweredHeaders = {}; this._mimeOverride = null; this._setReadyState(XMLHttpRequest.OPENED); this._request = null; this._response = null; this.status = 0; this.statusText = ''; this._responseParts = []; this._responseHeaders = null; this._loadedBytes = 0; this._totalBytes = 0; this._lengthComputable = false; return void 0; }
n/a
overrideMimeType = function (newMimeType) { if (this.readyState === XMLHttpRequest.LOADING || this.readyState === XMLHttpRequest.DONE) { throw new InvalidStateError("overrideMimeType() not allowed in LOADING or DONE"); } this._mimeOverride = newMimeType.toLowerCase(); return void 0; }
n/a
send = function (data) { if (this.readyState !== XMLHttpRequest.OPENED) { throw new InvalidStateError("XHR readyState must be OPENED"); } if (this._request) { throw new InvalidStateError("send() already called"); } switch (this._url.protocol) { case 'file:': this._sendFile(data); break; case 'http:': case 'https:': this._sendHttp(data); break; default: throw new NetworkError("Unsupported protocol " + this._url.protocol); } return void 0; }
...
found = true
expect(found).to.equal true
done()
describe 'for a network error due to bad DNS', (done) ->
beforeEach ->
@xhr.open 'GET', 'https://broken.to.cause.an.xhrnetworkerror.com'
@xhr.send()
it 'no progress or load is emitted', (done) ->
@events.check = =>
for event in @events
expect(event.type).not.to.equal 'load'
expect(event.type).not.to.equal 'progress'
done()
...
setRequestHeader = function (name, value) { var loweredName; if (this.readyState !== XMLHttpRequest.OPENED) { throw new InvalidStateError("XHR readyState must be OPENED"); } loweredName = name.toLowerCase(); if (this._restrictedHeaders[loweredName] || /^sec\-/.test(loweredName) || /^proxy-/.test(loweredName)) { console.warn("Refused to set unsafe header \"" + name + "\""); return void 0; } value = value.toString(); if (loweredName in this._loweredHeaders) { name = this._loweredHeaders[loweredName]; this._headers[name] = this._headers[name] + ', ' + value; } else { this._loweredHeaders[loweredName] = name; this._headers[name] = value; } return void 0; }
n/a
function XMLHttpRequestUpload(request) { XMLHttpRequestUpload.__super__.constructor.call(this); this._request = request; this._reset(); }
n/a
_finalizeHeaders = function (headers, loweredHeaders) { if (this._contentType) { if (!('content-type' in loweredHeaders)) { headers['Content-Type'] = this._contentType; } } if (this._body) { headers['Content-Length'] = this._body.length.toString(); } return void 0; }
...
if ((data != null) && (this._method === 'GET' || this._method === 'HEAD')) {
console.warn("Discarding entity body for " + this._method + " requests");
data = null;
} else {
data || (data = '');
}
this.upload._setData(data);
this._finalizeHeaders();
this._sendHxxpRequest();
return void 0;
};
XMLHttpRequest.prototype._sendHxxpRequest = function() {
var agent, hxxp, request;
if (this._url.protocol === 'http:') {
...
_reset = function () { this._contentType = null; this._body = null; return void 0; }
...
delete this._headers[this._loweredHeaders['content-type']];
delete this._loweredHeaders['content-type'];
}
if ('Content-Type' in this._headers) {
delete this._headers['Content-Type'];
}
delete this._headers['Content-Length'];
this.upload._reset();
this._finalizeHeaders();
this._sendHxxpRequest();
return;
}
this._response = response;
this._response.on('data', (function(_this) {
return function(data) {
...
_setData = function (data) { var body, i, j, k, offset, ref, ref1, view; if (typeof data === 'undefined' || data === null) { return; } if (typeof data === 'string') { if (data.length !== 0) { this._contentType = 'text/plain;charset=UTF-8'; } this._body = new Buffer(data, 'utf8'); } else if (Buffer.isBuffer(data)) { this._body = data; } else if (data instanceof ArrayBuffer) { body = new Buffer(data.byteLength); view = new Uint8Array(data); for (i = j = 0, ref = data.byteLength; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { body[i] = view[i]; } this._body = body; } else if (data.buffer && data.buffer instanceof ArrayBuffer) { body = new Buffer(data.byteLength); offset = data.byteOffset; view = new Uint8Array(data.buffer); for (i = k = 0, ref1 = data.byteLength; 0 <= ref1 ? k < ref1 : k > ref1; i = 0 <= ref1 ? ++k : --k) { body[i] = view[i + offset]; } this._body = body; } else { throw new Error("Unsupported send() data " + data); } return void 0; }
...
}
if ((data != null) && (this._method === 'GET' || this._method === 'HEAD')) {
console.warn("Discarding entity body for " + this._method + " requests");
data = null;
} else {
data || (data = '');
}
this.upload._setData(data);
this._finalizeHeaders();
this._sendHxxpRequest();
return void 0;
};
XMLHttpRequest.prototype._sendHxxpRequest = function() {
var agent, hxxp, request;
...
_startUpload = function (request) { if (this._body) { request.write(this._body); } request.end(); return void 0; }
...
};
})(this));
request.on('error', (function(_this) {
return function(error) {
return _this._onHttpRequestError(request, error);
};
})(this));
this.upload._startUpload(request);
if (this._request === request) {
this._dispatchProgress('loadstart');
}
return void 0;
};
XMLHttpRequest.prototype._finalizeHeaders = function() {
...
function XMLHttpRequestUpload(request) { XMLHttpRequestUpload.__super__.constructor.call(this); this._request = request; this._reset(); }
n/a
addEventListener = function (eventType, listener) { var base; eventType = eventType.toLowerCase(); (base = this._listeners)[eventType] || (base[eventType] = []); this._listeners[eventType].push(listener); return void 0; }
n/a
dispatchEvent = function (event) { var eventType, j, len, listener, listeners; event.currentTarget = event.target = this; eventType = event.type; if (listeners = this._listeners[eventType]) { for (j = 0, len = listeners.length; j < len; j++) { listener = listeners[j]; listener.call(this, event); } } if (listener = this["on" + eventType]) { listener.call(this, event); } return void 0; }
...
XMLHttpRequest.prototype._userAgent = ("Mozilla/5.0 (" + (os.type()) + " " + (os.arch()) + ") ") + (
x22;node.js/" + process.versions.node + " v8/" + process.versions.v8);
XMLHttpRequest.prototype._setReadyState = function(newReadyState) {
var event;
this.readyState = newReadyState;
event = new ProgressEvent('readystatechange');
this.dispatchEvent(event);
return void 0;
};
XMLHttpRequest.prototype._sendFile = function() {
if (this._url.method !== 'GET') {
throw new NetworkError('The file protocol only supports GET');
}
...
removeEventListener = function (eventType, listener) { var index; eventType = eventType.toLowerCase(); if (this._listeners[eventType]) { index = this._listeners[eventType].indexOf(listener); if (index !== -1) { this._listeners[eventType].splice(index, 1); } } return void 0; }
n/a