9
|
1 |
(function (global, factory) { |
|
2 |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : |
|
3 |
typeof define === 'function' && define.amd ? define(['exports'], factory) : |
|
4 |
(factory((global.WHATWGFetch = {}))); |
|
5 |
}(this, (function (exports) { 'use strict'; |
|
6 |
|
|
7 |
var support = { |
|
8 |
searchParams: 'URLSearchParams' in self, |
|
9 |
iterable: 'Symbol' in self && 'iterator' in Symbol, |
|
10 |
blob: |
|
11 |
'FileReader' in self && |
|
12 |
'Blob' in self && |
|
13 |
(function() { |
|
14 |
try { |
|
15 |
new Blob(); |
|
16 |
return true |
|
17 |
} catch (e) { |
|
18 |
return false |
|
19 |
} |
|
20 |
})(), |
|
21 |
formData: 'FormData' in self, |
|
22 |
arrayBuffer: 'ArrayBuffer' in self |
|
23 |
}; |
|
24 |
|
|
25 |
function isDataView(obj) { |
|
26 |
return obj && DataView.prototype.isPrototypeOf(obj) |
|
27 |
} |
|
28 |
|
|
29 |
if (support.arrayBuffer) { |
|
30 |
var viewClasses = [ |
|
31 |
'[object Int8Array]', |
|
32 |
'[object Uint8Array]', |
|
33 |
'[object Uint8ClampedArray]', |
|
34 |
'[object Int16Array]', |
|
35 |
'[object Uint16Array]', |
|
36 |
'[object Int32Array]', |
|
37 |
'[object Uint32Array]', |
|
38 |
'[object Float32Array]', |
|
39 |
'[object Float64Array]' |
|
40 |
]; |
|
41 |
|
|
42 |
var isArrayBufferView = |
|
43 |
ArrayBuffer.isView || |
|
44 |
function(obj) { |
|
45 |
return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 |
|
46 |
}; |
|
47 |
} |
|
48 |
|
|
49 |
function normalizeName(name) { |
|
50 |
if (typeof name !== 'string') { |
|
51 |
name = String(name); |
|
52 |
} |
|
53 |
if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) { |
|
54 |
throw new TypeError('Invalid character in header field name') |
|
55 |
} |
|
56 |
return name.toLowerCase() |
|
57 |
} |
|
58 |
|
|
59 |
function normalizeValue(value) { |
|
60 |
if (typeof value !== 'string') { |
|
61 |
value = String(value); |
|
62 |
} |
|
63 |
return value |
|
64 |
} |
|
65 |
|
|
66 |
// Build a destructive iterator for the value list |
|
67 |
function iteratorFor(items) { |
|
68 |
var iterator = { |
|
69 |
next: function() { |
|
70 |
var value = items.shift(); |
|
71 |
return {done: value === undefined, value: value} |
|
72 |
} |
|
73 |
}; |
|
74 |
|
|
75 |
if (support.iterable) { |
|
76 |
iterator[Symbol.iterator] = function() { |
|
77 |
return iterator |
|
78 |
}; |
|
79 |
} |
|
80 |
|
|
81 |
return iterator |
|
82 |
} |
|
83 |
|
|
84 |
function Headers(headers) { |
|
85 |
this.map = {}; |
|
86 |
|
|
87 |
if (headers instanceof Headers) { |
|
88 |
headers.forEach(function(value, name) { |
|
89 |
this.append(name, value); |
|
90 |
}, this); |
|
91 |
} else if (Array.isArray(headers)) { |
|
92 |
headers.forEach(function(header) { |
|
93 |
this.append(header[0], header[1]); |
|
94 |
}, this); |
|
95 |
} else if (headers) { |
|
96 |
Object.getOwnPropertyNames(headers).forEach(function(name) { |
|
97 |
this.append(name, headers[name]); |
|
98 |
}, this); |
|
99 |
} |
|
100 |
} |
|
101 |
|
|
102 |
Headers.prototype.append = function(name, value) { |
|
103 |
name = normalizeName(name); |
|
104 |
value = normalizeValue(value); |
|
105 |
var oldValue = this.map[name]; |
|
106 |
this.map[name] = oldValue ? oldValue + ', ' + value : value; |
|
107 |
}; |
|
108 |
|
|
109 |
Headers.prototype['delete'] = function(name) { |
|
110 |
delete this.map[normalizeName(name)]; |
|
111 |
}; |
|
112 |
|
|
113 |
Headers.prototype.get = function(name) { |
|
114 |
name = normalizeName(name); |
|
115 |
return this.has(name) ? this.map[name] : null |
|
116 |
}; |
|
117 |
|
|
118 |
Headers.prototype.has = function(name) { |
|
119 |
return this.map.hasOwnProperty(normalizeName(name)) |
|
120 |
}; |
|
121 |
|
|
122 |
Headers.prototype.set = function(name, value) { |
|
123 |
this.map[normalizeName(name)] = normalizeValue(value); |
|
124 |
}; |
|
125 |
|
|
126 |
Headers.prototype.forEach = function(callback, thisArg) { |
|
127 |
for (var name in this.map) { |
|
128 |
if (this.map.hasOwnProperty(name)) { |
|
129 |
callback.call(thisArg, this.map[name], name, this); |
|
130 |
} |
|
131 |
} |
|
132 |
}; |
|
133 |
|
|
134 |
Headers.prototype.keys = function() { |
|
135 |
var items = []; |
|
136 |
this.forEach(function(value, name) { |
|
137 |
items.push(name); |
|
138 |
}); |
|
139 |
return iteratorFor(items) |
|
140 |
}; |
|
141 |
|
|
142 |
Headers.prototype.values = function() { |
|
143 |
var items = []; |
|
144 |
this.forEach(function(value) { |
|
145 |
items.push(value); |
|
146 |
}); |
|
147 |
return iteratorFor(items) |
|
148 |
}; |
|
149 |
|
|
150 |
Headers.prototype.entries = function() { |
|
151 |
var items = []; |
|
152 |
this.forEach(function(value, name) { |
|
153 |
items.push([name, value]); |
|
154 |
}); |
|
155 |
return iteratorFor(items) |
|
156 |
}; |
|
157 |
|
|
158 |
if (support.iterable) { |
|
159 |
Headers.prototype[Symbol.iterator] = Headers.prototype.entries; |
|
160 |
} |
|
161 |
|
|
162 |
function consumed(body) { |
|
163 |
if (body.bodyUsed) { |
|
164 |
return Promise.reject(new TypeError('Already read')) |
|
165 |
} |
|
166 |
body.bodyUsed = true; |
|
167 |
} |
|
168 |
|
|
169 |
function fileReaderReady(reader) { |
|
170 |
return new Promise(function(resolve, reject) { |
|
171 |
reader.onload = function() { |
|
172 |
resolve(reader.result); |
|
173 |
}; |
|
174 |
reader.onerror = function() { |
|
175 |
reject(reader.error); |
|
176 |
}; |
|
177 |
}) |
|
178 |
} |
|
179 |
|
|
180 |
function readBlobAsArrayBuffer(blob) { |
|
181 |
var reader = new FileReader(); |
|
182 |
var promise = fileReaderReady(reader); |
|
183 |
reader.readAsArrayBuffer(blob); |
|
184 |
return promise |
|
185 |
} |
|
186 |
|
|
187 |
function readBlobAsText(blob) { |
|
188 |
var reader = new FileReader(); |
|
189 |
var promise = fileReaderReady(reader); |
|
190 |
reader.readAsText(blob); |
|
191 |
return promise |
|
192 |
} |
|
193 |
|
|
194 |
function readArrayBufferAsText(buf) { |
|
195 |
var view = new Uint8Array(buf); |
|
196 |
var chars = new Array(view.length); |
|
197 |
|
|
198 |
for (var i = 0; i < view.length; i++) { |
|
199 |
chars[i] = String.fromCharCode(view[i]); |
|
200 |
} |
|
201 |
return chars.join('') |
|
202 |
} |
|
203 |
|
|
204 |
function bufferClone(buf) { |
|
205 |
if (buf.slice) { |
|
206 |
return buf.slice(0) |
|
207 |
} else { |
|
208 |
var view = new Uint8Array(buf.byteLength); |
|
209 |
view.set(new Uint8Array(buf)); |
|
210 |
return view.buffer |
|
211 |
} |
|
212 |
} |
|
213 |
|
|
214 |
function Body() { |
|
215 |
this.bodyUsed = false; |
|
216 |
|
|
217 |
this._initBody = function(body) { |
|
218 |
this._bodyInit = body; |
|
219 |
if (!body) { |
|
220 |
this._bodyText = ''; |
|
221 |
} else if (typeof body === 'string') { |
|
222 |
this._bodyText = body; |
|
223 |
} else if (support.blob && Blob.prototype.isPrototypeOf(body)) { |
|
224 |
this._bodyBlob = body; |
|
225 |
} else if (support.formData && FormData.prototype.isPrototypeOf(body)) { |
|
226 |
this._bodyFormData = body; |
|
227 |
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { |
|
228 |
this._bodyText = body.toString(); |
|
229 |
} else if (support.arrayBuffer && support.blob && isDataView(body)) { |
|
230 |
this._bodyArrayBuffer = bufferClone(body.buffer); |
|
231 |
// IE 10-11 can't handle a DataView body. |
|
232 |
this._bodyInit = new Blob([this._bodyArrayBuffer]); |
|
233 |
} else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { |
|
234 |
this._bodyArrayBuffer = bufferClone(body); |
|
235 |
} else { |
|
236 |
this._bodyText = body = Object.prototype.toString.call(body); |
|
237 |
} |
|
238 |
|
|
239 |
if (!this.headers.get('content-type')) { |
|
240 |
if (typeof body === 'string') { |
|
241 |
this.headers.set('content-type', 'text/plain;charset=UTF-8'); |
|
242 |
} else if (this._bodyBlob && this._bodyBlob.type) { |
|
243 |
this.headers.set('content-type', this._bodyBlob.type); |
|
244 |
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { |
|
245 |
this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); |
|
246 |
} |
|
247 |
} |
|
248 |
}; |
|
249 |
|
|
250 |
if (support.blob) { |
|
251 |
this.blob = function() { |
|
252 |
var rejected = consumed(this); |
|
253 |
if (rejected) { |
|
254 |
return rejected |
|
255 |
} |
|
256 |
|
|
257 |
if (this._bodyBlob) { |
|
258 |
return Promise.resolve(this._bodyBlob) |
|
259 |
} else if (this._bodyArrayBuffer) { |
|
260 |
return Promise.resolve(new Blob([this._bodyArrayBuffer])) |
|
261 |
} else if (this._bodyFormData) { |
|
262 |
throw new Error('could not read FormData body as blob') |
|
263 |
} else { |
|
264 |
return Promise.resolve(new Blob([this._bodyText])) |
|
265 |
} |
|
266 |
}; |
|
267 |
|
|
268 |
this.arrayBuffer = function() { |
|
269 |
if (this._bodyArrayBuffer) { |
|
270 |
return consumed(this) || Promise.resolve(this._bodyArrayBuffer) |
|
271 |
} else { |
|
272 |
return this.blob().then(readBlobAsArrayBuffer) |
|
273 |
} |
|
274 |
}; |
|
275 |
} |
|
276 |
|
|
277 |
this.text = function() { |
|
278 |
var rejected = consumed(this); |
|
279 |
if (rejected) { |
|
280 |
return rejected |
|
281 |
} |
|
282 |
|
|
283 |
if (this._bodyBlob) { |
|
284 |
return readBlobAsText(this._bodyBlob) |
|
285 |
} else if (this._bodyArrayBuffer) { |
|
286 |
return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) |
|
287 |
} else if (this._bodyFormData) { |
|
288 |
throw new Error('could not read FormData body as text') |
|
289 |
} else { |
|
290 |
return Promise.resolve(this._bodyText) |
|
291 |
} |
|
292 |
}; |
|
293 |
|
|
294 |
if (support.formData) { |
|
295 |
this.formData = function() { |
|
296 |
return this.text().then(decode) |
|
297 |
}; |
|
298 |
} |
|
299 |
|
|
300 |
this.json = function() { |
|
301 |
return this.text().then(JSON.parse) |
|
302 |
}; |
|
303 |
|
|
304 |
return this |
|
305 |
} |
|
306 |
|
|
307 |
// HTTP methods whose capitalization should be normalized |
|
308 |
var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; |
|
309 |
|
|
310 |
function normalizeMethod(method) { |
|
311 |
var upcased = method.toUpperCase(); |
|
312 |
return methods.indexOf(upcased) > -1 ? upcased : method |
|
313 |
} |
|
314 |
|
|
315 |
function Request(input, options) { |
|
316 |
options = options || {}; |
|
317 |
var body = options.body; |
|
318 |
|
|
319 |
if (input instanceof Request) { |
|
320 |
if (input.bodyUsed) { |
|
321 |
throw new TypeError('Already read') |
|
322 |
} |
|
323 |
this.url = input.url; |
|
324 |
this.credentials = input.credentials; |
|
325 |
if (!options.headers) { |
|
326 |
this.headers = new Headers(input.headers); |
|
327 |
} |
|
328 |
this.method = input.method; |
|
329 |
this.mode = input.mode; |
|
330 |
this.signal = input.signal; |
|
331 |
if (!body && input._bodyInit != null) { |
|
332 |
body = input._bodyInit; |
|
333 |
input.bodyUsed = true; |
|
334 |
} |
|
335 |
} else { |
|
336 |
this.url = String(input); |
|
337 |
} |
|
338 |
|
|
339 |
this.credentials = options.credentials || this.credentials || 'same-origin'; |
|
340 |
if (options.headers || !this.headers) { |
|
341 |
this.headers = new Headers(options.headers); |
|
342 |
} |
|
343 |
this.method = normalizeMethod(options.method || this.method || 'GET'); |
|
344 |
this.mode = options.mode || this.mode || null; |
|
345 |
this.signal = options.signal || this.signal; |
|
346 |
this.referrer = null; |
|
347 |
|
|
348 |
if ((this.method === 'GET' || this.method === 'HEAD') && body) { |
|
349 |
throw new TypeError('Body not allowed for GET or HEAD requests') |
|
350 |
} |
|
351 |
this._initBody(body); |
|
352 |
} |
|
353 |
|
|
354 |
Request.prototype.clone = function() { |
|
355 |
return new Request(this, {body: this._bodyInit}) |
|
356 |
}; |
|
357 |
|
|
358 |
function decode(body) { |
|
359 |
var form = new FormData(); |
|
360 |
body |
|
361 |
.trim() |
|
362 |
.split('&') |
|
363 |
.forEach(function(bytes) { |
|
364 |
if (bytes) { |
|
365 |
var split = bytes.split('='); |
|
366 |
var name = split.shift().replace(/\+/g, ' '); |
|
367 |
var value = split.join('=').replace(/\+/g, ' '); |
|
368 |
form.append(decodeURIComponent(name), decodeURIComponent(value)); |
|
369 |
} |
|
370 |
}); |
|
371 |
return form |
|
372 |
} |
|
373 |
|
|
374 |
function parseHeaders(rawHeaders) { |
|
375 |
var headers = new Headers(); |
|
376 |
// Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space |
|
377 |
// https://tools.ietf.org/html/rfc7230#section-3.2 |
|
378 |
var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); |
|
379 |
preProcessedHeaders.split(/\r?\n/).forEach(function(line) { |
|
380 |
var parts = line.split(':'); |
|
381 |
var key = parts.shift().trim(); |
|
382 |
if (key) { |
|
383 |
var value = parts.join(':').trim(); |
|
384 |
headers.append(key, value); |
|
385 |
} |
|
386 |
}); |
|
387 |
return headers |
|
388 |
} |
|
389 |
|
|
390 |
Body.call(Request.prototype); |
|
391 |
|
|
392 |
function Response(bodyInit, options) { |
|
393 |
if (!options) { |
|
394 |
options = {}; |
|
395 |
} |
|
396 |
|
|
397 |
this.type = 'default'; |
|
398 |
this.status = options.status === undefined ? 200 : options.status; |
|
399 |
this.ok = this.status >= 200 && this.status < 300; |
|
400 |
this.statusText = 'statusText' in options ? options.statusText : 'OK'; |
|
401 |
this.headers = new Headers(options.headers); |
|
402 |
this.url = options.url || ''; |
|
403 |
this._initBody(bodyInit); |
|
404 |
} |
|
405 |
|
|
406 |
Body.call(Response.prototype); |
|
407 |
|
|
408 |
Response.prototype.clone = function() { |
|
409 |
return new Response(this._bodyInit, { |
|
410 |
status: this.status, |
|
411 |
statusText: this.statusText, |
|
412 |
headers: new Headers(this.headers), |
|
413 |
url: this.url |
|
414 |
}) |
|
415 |
}; |
|
416 |
|
|
417 |
Response.error = function() { |
|
418 |
var response = new Response(null, {status: 0, statusText: ''}); |
|
419 |
response.type = 'error'; |
|
420 |
return response |
|
421 |
}; |
|
422 |
|
|
423 |
var redirectStatuses = [301, 302, 303, 307, 308]; |
|
424 |
|
|
425 |
Response.redirect = function(url, status) { |
|
426 |
if (redirectStatuses.indexOf(status) === -1) { |
|
427 |
throw new RangeError('Invalid status code') |
|
428 |
} |
|
429 |
|
|
430 |
return new Response(null, {status: status, headers: {location: url}}) |
|
431 |
}; |
|
432 |
|
|
433 |
exports.DOMException = self.DOMException; |
|
434 |
try { |
|
435 |
new exports.DOMException(); |
|
436 |
} catch (err) { |
|
437 |
exports.DOMException = function(message, name) { |
|
438 |
this.message = message; |
|
439 |
this.name = name; |
|
440 |
var error = Error(message); |
|
441 |
this.stack = error.stack; |
|
442 |
}; |
|
443 |
exports.DOMException.prototype = Object.create(Error.prototype); |
|
444 |
exports.DOMException.prototype.constructor = exports.DOMException; |
|
445 |
} |
|
446 |
|
|
447 |
function fetch(input, init) { |
|
448 |
return new Promise(function(resolve, reject) { |
|
449 |
var request = new Request(input, init); |
|
450 |
|
|
451 |
if (request.signal && request.signal.aborted) { |
|
452 |
return reject(new exports.DOMException('Aborted', 'AbortError')) |
|
453 |
} |
|
454 |
|
|
455 |
var xhr = new XMLHttpRequest(); |
|
456 |
|
|
457 |
function abortXhr() { |
|
458 |
xhr.abort(); |
|
459 |
} |
|
460 |
|
|
461 |
xhr.onload = function() { |
|
462 |
var options = { |
|
463 |
status: xhr.status, |
|
464 |
statusText: xhr.statusText, |
|
465 |
headers: parseHeaders(xhr.getAllResponseHeaders() || '') |
|
466 |
}; |
|
467 |
options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); |
|
468 |
var body = 'response' in xhr ? xhr.response : xhr.responseText; |
|
469 |
resolve(new Response(body, options)); |
|
470 |
}; |
|
471 |
|
|
472 |
xhr.onerror = function() { |
|
473 |
reject(new TypeError('Network request failed')); |
|
474 |
}; |
|
475 |
|
|
476 |
xhr.ontimeout = function() { |
|
477 |
reject(new TypeError('Network request failed')); |
|
478 |
}; |
|
479 |
|
|
480 |
xhr.onabort = function() { |
|
481 |
reject(new exports.DOMException('Aborted', 'AbortError')); |
|
482 |
}; |
|
483 |
|
|
484 |
xhr.open(request.method, request.url, true); |
|
485 |
|
|
486 |
if (request.credentials === 'include') { |
|
487 |
xhr.withCredentials = true; |
|
488 |
} else if (request.credentials === 'omit') { |
|
489 |
xhr.withCredentials = false; |
|
490 |
} |
|
491 |
|
|
492 |
if ('responseType' in xhr && support.blob) { |
|
493 |
xhr.responseType = 'blob'; |
|
494 |
} |
|
495 |
|
|
496 |
request.headers.forEach(function(value, name) { |
|
497 |
xhr.setRequestHeader(name, value); |
|
498 |
}); |
|
499 |
|
|
500 |
if (request.signal) { |
|
501 |
request.signal.addEventListener('abort', abortXhr); |
|
502 |
|
|
503 |
xhr.onreadystatechange = function() { |
|
504 |
// DONE (success or failure) |
|
505 |
if (xhr.readyState === 4) { |
|
506 |
request.signal.removeEventListener('abort', abortXhr); |
|
507 |
} |
|
508 |
}; |
|
509 |
} |
|
510 |
|
|
511 |
xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); |
|
512 |
}) |
|
513 |
} |
|
514 |
|
|
515 |
fetch.polyfill = true; |
|
516 |
|
|
517 |
if (!self.fetch) { |
|
518 |
self.fetch = fetch; |
|
519 |
self.Headers = Headers; |
|
520 |
self.Request = Request; |
|
521 |
self.Response = Response; |
|
522 |
} |
|
523 |
|
|
524 |
exports.Headers = Headers; |
|
525 |
exports.Request = Request; |
|
526 |
exports.Response = Response; |
|
527 |
exports.fetch = fetch; |
|
528 |
|
|
529 |
Object.defineProperty(exports, '__esModule', { value: true }); |
|
530 |
|
|
531 |
}))); |