{"versions":{"2.5.1":{"name":"@videojs/xhr","version":"2.5.1","description":"small xhr abstraction","keywords":["xhr","http","xmlhttprequest","xhr2","browserify"],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/naugtur/xhr.git"},"main":"index","homepage":"https://github.com/naugtur/xhr","contributors":[{"name":"Jake Verbaten"},{"name":"Zbyszek Tenerowicz","email":"naugtur@gmail.com"}],"bugs":{"url":"https://github.com/naugtur/xhr/issues","email":"naugtur@gmail.com"},"typings":"./index.d.ts","dependencies":{"@babel/runtime":"^7.5.5","is-function":"^1.0.1","global":"~4.4.0"},"devDependencies":{"for-each":"^0.3.2","pre-commit":"1.2.2","run-browser":"github:naugtur/run-browser","tap-spec":"^4.0.2","tape":"^4.0.0"},"license":"MIT","scripts":{"test":"run-browser test/index.js -b -m test/mock-server.js | tap-spec","browser":"run-browser -m test/mock-server.js test/index.js"},"gitHead":"2fb3a390da6ff184b41b792cb11d6690a9b4cec1","_id":"@videojs/xhr@2.5.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"anonymous","email":"brandonocasey@gmail.com"},"dist":{"shasum":"26bc5a79dbb3b03bfb13742c6ce559f89e90719e","size":8231,"noattachment":false,"tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@videojs/xhr/-/xhr-2.5.1.tgz"},"maintainers":[{"name":"anonymous","email":"alexander.barstow@gmail.com"},{"name":"anonymous","email":"brandonocasey@gmail.com"},{"name":"anonymous","email":"dlapalomento@gmail.com"},{"name":"anonymous","email":"joseph.a.forbes@gmail.com"},{"name":"anonymous","email":"gesinger@gmail.com"},{"name":"anonymous","email":"me@gkatsev.com"},{"name":"anonymous","email":"steve@zencoder.com"},{"name":"anonymous","email":"jon.carlos.rivera@gmail.com"},{"name":"anonymous","email":"gsmith@incompl.com"},{"name":"anonymous","email":"ldayananda@brightcove.com"},{"name":"anonymous","email":"npm@misterben.me"},{"name":"anonymous","email":"pgoneill@gmail.com"},{"name":"anonymous","email":"mneilweb@gmail.com"},{"name":"anonymous","email":"matt@mmcc.io"},{"name":"anonymous","email":"mmmcclure@brightcove.com"},{"name":"anonymous","email":"okaramia@gmail.com"},{"name":"anonymous","email":"chuck.wilson+github@gmail.com"},{"name":"anonymous","email":"tjaneczko@brightcove.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/xhr_2.5.1_1567113748555_0.021833403815311847"},"_hasShrinkwrap":false,"publish_time":1567113748697,"_cnpm_publish_time":1567113748697},"2.6.0":{"name":"@videojs/xhr","version":"2.6.0","description":"","keywords":["xhr","http","xmlhttprequest","xhr2","browserify"],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/videojs/xhr.git"},"main":"./lib/index.js","homepage":"https://github.com/videojs/xhr","contributors":[{"name":"Jake Verbaten"},{"name":"Zbyszek Tenerowicz","email":"naugtur@gmail.com"}],"bugs":{"url":"https://github.com/videojs/xhr/issues"},"typings":"./lib/index.d.ts","dependencies":{"@babel/runtime":"^7.5.5","is-function":"^1.0.1","global":"~4.4.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.14.8","@babel/preset-env":"^7.14.8","@videojs/babel-config":"^0.1.0","for-each":"^0.3.2","pre-commit":"1.2.2","run-browser":"github:naugtur/run-browser","tap-spec":"^5.0.0","tape":"^4.0.0"},"license":"MIT","scripts":{"prepublishOnly":"npm run build","start":"npm run build -- -w","build":"babel-config-cjs src -d lib","test:index":"run-browser test/index.js -b -m test/mock-server.js | tap-spec","test:http-handler":"run-browser test/http-handler.js -b -m test/mock-server.js | tap-spec","pretest":"npm run build","test":"npm run test:index && npm run test:http-handler","browser":"run-browser -m test/mock-server.js test/index.js"},"gitHead":"b6a39f2ba85d552ce9c46c407007a79ab970acfc","_id":"@videojs/xhr@2.6.0","_nodeVersion":"10.24.1","_npmVersion":"6.14.12","dist":{"shasum":"cd897e0ad54faf497961bcce3fa16dc15a26bb80","size":11077,"noattachment":false,"tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@videojs/xhr/-/xhr-2.6.0.tgz"},"_npmUser":{"name":"anonymous","email":"me@gkatsev.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"alexander.barstow@gmail.com"},{"name":"anonymous","email":"dlapalomento@gmail.com"},{"name":"anonymous","email":"gesinger@gmail.com"},{"name":"anonymous","email":"me@gkatsev.com"},{"name":"anonymous","email":"steve@zencoder.com"},{"name":"anonymous","email":"jon.carlos.rivera@gmail.com"},{"name":"anonymous","email":"gsmith@incompl.com"},{"name":"anonymous","email":"npm@misterben.me"},{"name":"anonymous","email":"mmmcclure@brightcove.com"},{"name":"anonymous","email":"okaramia@gmail.com"},{"name":"anonymous","email":"tjaneczko@brightcove.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/xhr_2.6.0_1627342281988_0.3741377777186612"},"_hasShrinkwrap":false,"publish_time":1627342282135,"_cnpm_publish_time":1627342282135},"2.7.0":{"name":"@videojs/xhr","version":"2.7.0","description":"small xhr abstraction","keywords":["xhr","http","xmlhttprequest","xhr2","browserify"],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/videojs/xhr.git"},"main":"./lib/index.js","homepage":"https://github.com/videojs/xhr","contributors":[{"name":"Jake Verbaten"},{"name":"Zbyszek Tenerowicz","email":"naugtur@gmail.com"}],"bugs":{"url":"https://github.com/videojs/xhr/issues"},"typings":"./lib/index.d.ts","dependencies":{"@babel/runtime":"^7.5.5","is-function":"^1.0.1","global":"~4.4.0"},"devDependencies":{"@babel/cli":"^7.14.8","@babel/core":"^7.14.8","@babel/preset-env":"^7.14.8","@videojs/babel-config":"^0.1.0","for-each":"^0.3.2","pre-commit":"1.2.2","run-browser":"github:naugtur/run-browser","tap-spec":"^5.0.0","tape":"^4.0.0"},"license":"MIT","scripts":{"prepublishOnly":"npm run build","start":"npm run build -- -w","build":"babel-config-cjs src -d lib","test:index":"run-browser test/index.js -b -m test/mock-server.js | tap-spec","test:interceptors":"run-browser test/interceptors.js -b -m test/mock-server.js | tap-spec","test:retry":"run-browser test/retry.js -b -m test/mock-server.js | tap-spec","test:http-handler":"run-browser test/http-handler.js -b -m test/mock-server.js | tap-spec","pretest":"npm run build","test":"npm run test:index && npm run test:http-handler && npm run test:interceptors && npm run test:retry","browser":"run-browser -m test/mock-server.js test/index.js"},"gitHead":"2aa63ccc2761187236b760edf71564db3258936f","_id":"@videojs/xhr@2.7.0","_nodeVersion":"10.24.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==","shasum":"e272af6e2b5448aeb400905a5c6f4818f6b6ad47","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@videojs/xhr/-/xhr-2.7.0.tgz","fileCount":18,"unpackedSize":60072,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAmcBJoqtfF2V18vlXDxQN2b3h8U+trpYXmhcoEl58UpAiA7XtIJ7CyqqWbpAdOkGf0UBxzSLQXPdNP7Ho7p6aGqBQ=="}]},"_npmUser":{"name":"anonymous","email":"ddashkevich@brightcove.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"phale@brightcove.com"},{"name":"anonymous","email":"ddashkevich@brightcove.com"},{"name":"anonymous","email":"rpougatchev@brightcove.com"},{"name":"anonymous","email":"wseymour@brightcove.com"},{"name":"anonymous","email":"videojs@gkatsev.com"},{"name":"anonymous","email":"usmanonazim@gmail.com"},{"name":"anonymous","email":"npm@htbx.net"},{"name":"anonymous","email":"pgoneill@gmail.com"},{"name":"anonymous","email":"npm@misterben.me"},{"name":"anonymous","email":"ldayananda@brightcove.com"},{"name":"anonymous","email":"jon.carlos.rivera@gmail.com"},{"name":"anonymous","email":"hswaminathan@brightcove.com"},{"name":"anonymous","email":"npm@heff.me"},{"name":"anonymous","email":"me@gkatsev.com"},{"name":"anonymous","email":"gesinger@gmail.com"},{"name":"anonymous","email":"sarah@teaandbiscuits.net"},{"name":"anonymous","email":"dlapalomento@gmail.com"},{"name":"anonymous","email":"brandonocasey@gmail.com"},{"name":"anonymous","email":"awaldron@brightcove.com"},{"name":"anonymous","email":"alexander.barstow@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/xhr_2.7.0_1717711331462_0.7733782370403268"},"_hasShrinkwrap":false}},"dist-tags":{"experimental":"2.5.1","latest":"2.7.0"},"name":"@videojs/xhr","time":{"modified":"2026-02-27T17:45:51.400Z","created":"2022-01-26T16:03:12.633Z","2.5.1":"2019-08-29T21:22:28.697Z","2.6.0":"2021-07-26T23:31:22.135Z","2.7.0":"2024-06-06T22:02:11.749Z"},"readme":"# xhr\n\n> Originally forked from [naugtur/xhr](https://github.com/naugtur/xhr).\n\nA small XMLHttpRequest wrapper. Designed for use with [browserify](http://browserify.org/), [webpack](https://webpack.github.io/) etc.\n\nAPI is a subset of [request](https://github.com/request/request) so you can write code that works in both node.js and the browser by using `require('request')` in your code and telling your browser bundler to load `xhr` instead of `request`.\n\nFor browserify, add a [browser](https://github.com/substack/node-browserify#browser-field) field to your `package.json`:\n\n```\n\"browser\": {\n  \"request\": \"@videojs/xhr\"\n}\n```\n\nFor webpack, add a [resolve.alias](http://webpack.github.io/docs/configuration.html#resolve-alias) field to your configuration:\n\n```\n\"resolve\": {\n  \"alias\": {\n    \"request$\": \"@videojs/xhr\"\n  }\n}\n```\n\nBrowser support: IE8+ and everything else.\n\n## Installation\n\n```\nnpm install @videojs/xhr\n```\n\n## Example\n\n```js\nvar xhr = require(\"@videojs/xhr\")\n\nxhr({\n    method: \"post\",\n    body: someJSONString,\n    uri: \"/foo\",\n    headers: {\n        \"Content-Type\": \"application/json\"\n    }\n}, function (err, resp, body) {\n    // check resp.statusCode\n})\n```\n\n## `var req = xhr(options, callback)`\n\n```js\ntype XhrOptions = String | {\n    useXDR: Boolean?,\n    sync: Boolean?,\n    uri: String,\n    url: String,\n    method: String?,\n    timeout: Number?,\n    headers: Object?,\n    body: String? | Object?,\n    json: Boolean? | Object?,\n    username: String?,\n    password: String?,\n    withCredentials: Boolean?,\n    responseType: String?,\n    beforeSend: Function?\n}\nxhr := (XhrOptions, Callback<Response>) => Request\n```\nthe returned object is either an [`XMLHttpRequest`][3] instance\n    or an [`XDomainRequest`][4] instance (if on IE8/IE9 &&\n    `options.useXDR` is set to `true`)\n\n### XhrCallback\n\nYour callback will be called once with the arguments\n    ( [`Error`][5], `response` , `body` ) where the response is an object:\n```js\n{\n    body: Object||String,\n    statusCode: Number,\n    method: String,\n    headers: {},\n    url: String,\n    rawRequest: xhr\n}\n```\n - `body`: HTTP response body - [`XMLHttpRequest.response`][6], [`XMLHttpRequest.responseText`][7] or\n    [`XMLHttpRequest.responseXML`][8] depending on the request type.\n - `rawRequest`: Original  [`XMLHttpRequest`][3] instance\n    or [`XDomainRequest`][4] instance (if on IE8/IE9 &&\n    `options.useXDR` is set to `true`)\n - `headers`: A collection of headers where keys are header names converted to lowercase\n\n\nYour callback will be called with an [`Error`][5] if there is an error in the browser that prevents sending the request.\nA HTTP 500 response is not going to cause an error to be returned.\n\n## Other signatures\n\n* `var req = xhr(url, callback)` -\na simple string instead of the options. In this case, a GET request will be made to that url.\n\n* `var req = xhr(url, options, callback)` -\nthe above may also be called with the standard set of options.\n\n### Convience methods\n* `var req = xhr.{post, put, patch, del, head, get}(url, callback)`\n* `var req = xhr.{post, put, patch, del, head, get}(options, callback)`\n* `var req = xhr.{post, put, patch, del, head, get}(url, options, callback)`\n\nThe `xhr` module has convience functions attached that will make requests with the given method.\nEach function is named after its method, with the exception of `DELETE` which is called `xhr.del` for compatibility.\n\nThe method shorthands may be combined with the url-first form of `xhr` for succinct and descriptive requests. For example,\n\n```js\nxhr.post('/post-to-me', function(err, resp) {\n  console.log(resp.body)\n})\n```\n\nor\n\n```js\nxhr.del('/delete-me', { headers: { my: 'auth' } }, function (err, resp) {\n  console.log(resp.statusCode);\n})\n```\n\n## Options\n\n### `options.method`\n\nSpecify the method the [`XMLHttpRequest`][3] should be opened\n    with. Passed to [`XMLHttpRequest.open`][2]. Defaults to \"GET\"\n\n### `options.useXDR`\n\nSpecify whether this is a cross origin (CORS) request for IE<10.\n    Switches IE to use [`XDomainRequest`][4] instead of `XMLHttpRequest`.\n    Ignored in other browsers.\n\nNote that headers cannot be set on an XDomainRequest instance.\n\n### `options.sync`\n\nSpecify whether this is a synchrounous request. Note that when\n    this is true the callback will be called synchronously. In\n    most cases this option should not be used. Only use if you\n    know what you are doing!\n\n### `options.body`\n\nPass in body to be send across the [`XMLHttpRequest`][3].\n    Generally should be a string. But anything that's valid as\n    a parameter to [`XMLHttpRequest.send`][1] should work  (Buffer for file, etc.).\n\nIf `options.json` is `true`, then this must be a JSON-serializable object. `options.body` is passed to `JSON.stringify` and sent.\n\n### `options.uri` or `options.url`\n\nThe uri to send a request to. Passed to [`XMLHttpRequest.open`][2]. `options.url` and `options.uri` are aliases for each other.\n\n### `options.headers`\n\nAn object of headers that should be set on the request. The\n    key, value pair is passed to [`XMLHttpRequest.setRequestHeader`][9]\n\n### `options.timeout`\n\nNumber of miliseconds to wait for response. Defaults to 0 (no timeout). Ignored when `options.sync` is true.\n\n### `options.json`\n\nSet to `true` to send request as `application/json` (see `options.body`) and parse response from JSON.\n\nFor backwards compatibility `options.json` can also be a valid JSON-serializable value to be sent to the server. Additionally the response body is still parsed as JSON\n\nFor sending booleans as JSON body see FAQ\n\n### `options.withCredentials`\n\nSpecify whether user credentials are to be included in a cross-origin\n    request. Sets [`XMLHttpRequest.withCredentials`][10]. Defaults to false.\n\nA wildcard `*` cannot be used in the `Access-Control-Allow-Origin` header when `withCredentials` is true.\n    The header needs to specify your origin explicitly or browser will abort the request.\n\n### `options.responseType`\n\nDetermines the data type of the `response`. Sets [`XMLHttpRequest.responseType`][11]. For example, a `responseType` of `document` will return a parsed `Document` object as the `response.body` for an XML resource.\n\n### `options.beforeSend`\n\nA function being called right before the `send` method of the `XMLHttpRequest` or `XDomainRequest` instance is called. The `XMLHttpRequest` or `XDomainRequest` instance is passed as an argument.\n\n### `options.xhr`\n\nPass an `XMLHttpRequest` object (or something that acts like one) to use instead of constructing a new one using the `XMLHttpRequest` or `XDomainRequest` constructors. Useful for testing.\n\n## Helpers\n\nThis module exposes the following helpers on the `xhr` object.\n\n### `xhr.httpHandler(callback, decodeResponseBody) => XhrCallback`\n\n`httpHandler` is a wrapper for the [XhrCallback][] which returns an error for HTTP Status Codes 4xx and 5xx. Given a callback, it'll either return an error with the response body as the error's cause, or return the response body.\n\nUsage like so:\n```js\nxhr({\n    uri: \"https://example.com/foo\",\n    responseType: 'arraybuffer'\n}, xhr.httpHandler(function(err, responseBody) {\n\n  // we got an error if the XHR errored out or if the status code was 4xx/5xx\n  if (err) {\n    // error cause is coming soon to JavaScript https://github.com/tc39/proposal-error-cause\n    throw new Error(err, {cause: err.cause});\n  }\n\n  // this will log an ArrayBuffer\n  console.log(responseBody);\n});\n```\n\n```js\nxhr({\n    uri: \"https://example.com/foo\",\n    responseType: 'arraybuffer'\n}, xhr.httpHandler(function(err, responseBody) {\n\n  if (err) {\n    throw new Error(err, {cause: err.cause});\n  }\n\n  // in this case, responseBody will be a String\n  console.log(responseBody);\n},\n\n// passing true as the second argument will cause httpHandler try and decode the response body into a string\ntrue)\n```\n\n### `xhr.requestInterceptorsStorage` and `xhr.responseInterceptorsStorage`\n\nhave the following API:\n```typescript\nexport interface NetworkRequest {\n  headers: Record<string, string>;\n  uri: string;\n  metadata: Record<string, unknown>;\n  body?: unknown;\n  retry?: Retry;\n  timeout?: number;\n}\n\nexport interface NetworkResponse {\n  headers: Record<string, string>;\n  responseUrl: string;\n  body?: unknown;\n  responseType?: XMLHttpRequestResponseType;\n}\n\nexport type Interceptor<T> = (payload: T) => T;\n\nexport interface InterceptorsStorage<T> {\n  enable(): void;\n  disable(): void;\n  getIsEnabled(): boolean;\n  reset(): void;\n  addInterceptor(type: string, interceptor: Interceptor<T>): boolean;\n  removeInterceptor(type: string, interceptor: Interceptor<T>): boolean;\n  clearInterceptorsByType(type: string): boolean;\n  clear(): boolean;\n  getForType(type: string): Set<Interceptor<T>>;\n  execute(type: string, payload: T): T;\n}\n\n```\nUsage:\n\n```js\nxhr.requestInterceptorsStorage.enable();\nxhr.responseInterceptorsStorage.enable();\n\nxhr.requestInterceptorsStorage.addInterceptor('segment', (request) => {\n  // read / update NetworkRequest\n  return request;\n});\n\nxhr.responseInterceptorsStorage.addInterceptor('segement', (response) => {\n  // read / update NetworkResponse\n  return response;\n});\n\nxhr({\n  uri: 'https://host/segment',\n  responseType: 'arraybuffer',\n  requestType: 'segement'\n}, function(err, response, responseBody) {\n  // your callback\n});\n\n```\n\n### `xhr.retryManager`\n\nhas the following API\n\n```typescript\nexport interface Retry {\n  getCurrentDelay(): number;\n  getCurrentMinPossibleDelay(): number;\n  getCurrentMaxPossibleDelay(): number;\n  getCurrentFuzzedDelay(): number;\n  shouldRetry(): boolean;\n  moveToNextAttempt(): void;\n}\n\nexport interface RetryOptions {\n  maxAttempts?: number;\n  delayFactor?: number;\n  fuzzFactor?: number;\n  initialDelay?: number;\n}\n\nexport interface RetryManager {\n  enable(): void;\n  disable(): void;\n  reset(): void;\n  getMaxAttempts(): number;\n  setMaxAttempts(maxAttempts: number): void;\n  getDelayFactor(): number;\n  setDelayFactor(delayFactor: number): void;\n  getFuzzFactor(): number;\n  setFuzzFactor(fuzzFactor: number): void;\n  getInitialDelay(): number;\n  setInitialDelay(initialDelay: number): void;\n  createRetry(options?: RetryOptions): Retry;\n}\n```\n\nUsage:\n\n```js\nxhr.retryManager.enable();\n\nxhr.retryManager.setMaxAttempts(2);\n\nxhr({\n  uri: 'https://host/segment',\n  responseType: 'arraybuffer',\n  retry: xhr.retryManager.createRetry(),\n}, function(err, response, responseBody) {\n  // your callback\n});\n\n// or override values for specific request:\nxhr({\n  uri: 'https://host/segment',\n  responseType: 'arraybuffer',\n  retry: xhr.retryManager.createRetry({ maxAttempts: 3 }),\n}, function(err, response, responseBody) {\n  // your callback\n});\n\n\n// you can combine interceptors/retry APIs if you dont have direct acces to the request:\nxhr.requestInterceptorsStorage.addInterceptor('segment', (request) => {\n  // read / update NetworkRequest\n  request.retry = xhr.retryManager.createRetry();\n  return request;\n});\n\n\n```\n\n\n## FAQ\n\n- Why is my server's JSON response not parsed? I returned the right content-type.\n  - See `options.json` - you can set it to `true` on a GET request to tell `xhr` to parse the response body.\n  - Without `options.json` body is returned as-is (a string or when `responseType` is set and the browser supports it - a result of parsing JSON or XML)\n- How do I send an object or array as POST body?\n  - `options.body` should be a string. You need to serialize your object before passing to `xhr` for sending.\n  - To serialize to JSON you can use\n   `options.json:true` with `options.body` for convenience - then `xhr` will do the serialization and set content-type accordingly.\n- Where's stream API? `.pipe()` etc.\n  - Not implemented. You can't reasonably have that in the browser.\n- Why can't I send `\"true\"` as body by passing it as `options.json` anymore?\n  - Accepting `true` as a value was a bug. Despite what `JSON.stringify` does, the string `\"true\"` is not valid JSON. If you're sending booleans as JSON, please consider wrapping them in an object or array to save yourself from more trouble in the future. To bring back the old behavior, hardcode `options.json` to `true` and set `options.body` to your boolean value.\n- How do I add an `onprogress` listener?\n  - use `beforeSend` function for non-standard things that are browser specific. In this case:\n  ```js\n  xhr({\n    ...\n    beforeSend: function(xhrObject){\n      xhrObject.onprogress = function(){}\n    }\n  })\n  ```\n\n## Mocking Requests\nYou can override the constructor used to create new requests for testing. When you're making a new request:\n\n```js\nxhr({ xhr: new MockXMLHttpRequest() })\n```\n\nor you can override the constructors used to create requests at the module level:\n\n```js\nxhr.XMLHttpRequest = MockXMLHttpRequest\nxhr.XDomainRequest = MockXDomainRequest\n```\n\n## MIT Licenced\n\n  [1]: http://xhr.spec.whatwg.org/#the-send()-method\n  [2]: http://xhr.spec.whatwg.org/#the-open()-method\n  [3]: http://xhr.spec.whatwg.org/#interface-xmlhttprequest\n  [4]: http://msdn.microsoft.com/en-us/library/ie/cc288060(v=vs.85).aspx\n  [5]: http://es5.github.com/#x15.11\n  [6]: http://xhr.spec.whatwg.org/#the-response-attribute\n  [7]: http://xhr.spec.whatwg.org/#the-responsetext-attribute\n  [8]: http://xhr.spec.whatwg.org/#the-responsexml-attribute\n  [9]: http://xhr.spec.whatwg.org/#the-setrequestheader()-method\n  [10]: http://xhr.spec.whatwg.org/#the-withcredentials-attribute\n  [11]: https://xhr.spec.whatwg.org/#the-responsetype-attribute","users":{}}