(arg)
| 46 | } |
| 47 | |
| 48 | send(arg) { |
| 49 | arg = arg || null; |
| 50 | let self = this; |
| 51 | if (adapter) { |
| 52 | let request = { |
| 53 | method: self.method, |
| 54 | url: self.responseURL, |
| 55 | headers: self.requestHeaders || {}, |
| 56 | body: arg |
| 57 | } |
| 58 | util.merge(request, self._options || {}) |
| 59 | if (request.method === "GET") { |
| 60 | request.body = null; |
| 61 | } |
| 62 | self._changeReadyState(3) |
| 63 | let timer; |
| 64 | self.timeout = self.timeout || 0; |
| 65 | if (self.timeout > 0) { |
| 66 | timer = setTimeout(() => { |
| 67 | if (self.readyState === 3) { |
| 68 | this._call("onloadend"); |
| 69 | self._changeReadyState(0); |
| 70 | self._call("ontimeout"); |
| 71 | |
| 72 | } |
| 73 | }, self.timeout); |
| 74 | } |
| 75 | request.timeout = self.timeout; |
| 76 | adapter(request, function (response) { |
| 77 | |
| 78 | function getAndDelete(key) { |
| 79 | let t = response[key] |
| 80 | delete response[key] |
| 81 | return t; |
| 82 | } |
| 83 | |
| 84 | // If the request has already timeout, return |
| 85 | if (self.readyState !== 3) return; |
| 86 | clearTimeout(timer) |
| 87 | |
| 88 | // Make sure the type of status is integer |
| 89 | self.status = getAndDelete("statusCode") - 0; |
| 90 | |
| 91 | let responseText = getAndDelete("responseText") |
| 92 | let statusMessage = getAndDelete("statusMessage") |
| 93 | |
| 94 | // Network error, set the status code 0 |
| 95 | if (!self.status) { |
| 96 | self.statusText = responseText; |
| 97 | self._call("onerror", {msg: statusMessage}); |
| 98 | } else { |
| 99 | // Parsing the response headers to array in a object, because |
| 100 | // there may be multiple values with the same header name |
| 101 | let responseHeaders = getAndDelete("headers") |
| 102 | let headers = {}; |
| 103 | for (let field in responseHeaders) { |
| 104 | let value = responseHeaders[field]; |
| 105 | let key = field.toLowerCase(); |
no test coverage detected