(href, info = {})
| 190 | } |
| 191 | |
| 192 | function fetch(href, info = {}) { |
| 193 | return new Promise((resolveResponse, rejectResponse) => { |
| 194 | let url = new URL(href); |
| 195 | if ((url.protocol != "http:") && (url.protocol != "https:")) |
| 196 | rejectResponse(new URIError("only http or https")); |
| 197 | let method = info.method; |
| 198 | let headers = info.headers; |
| 199 | let body = info.body; |
| 200 | let length = 0; |
| 201 | if ((method == "POST") || (method == "PUT") || (method == "PATCH")) { |
| 202 | body = info.body; |
| 203 | if (body == undefined) |
| 204 | rejectResponse(new URIError(method + " no body")); |
| 205 | else if (!(body instanceof ArrayBuffer)) { |
| 206 | body = body.toString(); |
| 207 | body = ArrayBuffer.fromString(body); |
| 208 | } |
| 209 | if (!headers) |
| 210 | headers = new Headers(); |
| 211 | else { |
| 212 | if (!(headers instanceof Headers)) { |
| 213 | const h = new Headers(); |
| 214 | for (const name in headers) |
| 215 | h.set(name.toLowerCase(), headers[name]); |
| 216 | headers = h; |
| 217 | } |
| 218 | length = headers.get("content-length"); |
| 219 | if (length == undefined) { |
| 220 | headers = new Headers(headers); |
| 221 | length = body.byteLength; |
| 222 | headers.set("content-length", length); |
| 223 | } |
| 224 | } |
| 225 | } |
| 226 | let readableController = null; |
| 227 | let redirected = false; |
| 228 | let offset = 0; |
| 229 | let buffer = null; |
| 230 | if (info.signal) { |
| 231 | info.signal.addEventListener("abort", event => { |
| 232 | if (readableController) { |
| 233 | readableController.error(event.signal.reason); |
| 234 | readableController = null; |
| 235 | } |
| 236 | else |
| 237 | rejectResponse(event.signal.reason); |
| 238 | }); |
| 239 | } |
| 240 | const options = { |
| 241 | method, |
| 242 | headers, |
| 243 | onHeaders(status, headers) { |
| 244 | if ((301 === status) || (308 === status) || (302 === status) || (303 === status) || (307 === status)) { |
| 245 | url = new URL(headers.get("location")); |
| 246 | redirected = this.redirected = true; |
| 247 | offset = 0; |
| 248 | return; |
| 249 | } |
no test coverage detected