139 lines
9.5 KiB
JavaScript
Executable File
139 lines
9.5 KiB
JavaScript
Executable File
(function(self){'use strict';if(self.fetch){return}
|
|
var support={searchParams:'URLSearchParams' in self,iterable:'Symbol' in self&&'iterator' in Symbol,blob:'FileReader' in self&&'Blob' in self&&(function(){try{new Blob()
|
|
return!0}catch(e){return!1}})(),formData:'FormData' in self,arrayBuffer:'ArrayBuffer' in self}
|
|
if(support.arrayBuffer){var viewClasses=['[object Int8Array]','[object Uint8Array]','[object Uint8ClampedArray]','[object Int16Array]','[object Uint16Array]','[object Int32Array]','[object Uint32Array]','[object Float32Array]','[object Float64Array]']
|
|
var isDataView=function(obj){return obj&&DataView.prototype.isPrototypeOf(obj)}
|
|
var isArrayBufferView=ArrayBuffer.isView||function(obj){return obj&&viewClasses.indexOf(Object.prototype.toString.call(obj))>-1}}
|
|
function normalizeName(name){if(typeof name!=='string'){name=String(name)}
|
|
if(/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)){throw new TypeError('Invalid character in header field name')}
|
|
return name.toLowerCase()}
|
|
function normalizeValue(value){if(typeof value!=='string'){value=String(value)}
|
|
return value}
|
|
function iteratorFor(items){var iterator={next:function(){var value=items.shift()
|
|
return{done:value===undefined,value:value}}}
|
|
if(support.iterable){iterator[Symbol.iterator]=function(){return iterator}}
|
|
return iterator}
|
|
function Headers(headers){this.map={}
|
|
if(headers instanceof Headers){headers.forEach(function(value,name){this.append(name,value)},this)}else if(Array.isArray(headers)){headers.forEach(function(header){this.append(header[0],header[1])},this)}else if(headers){Object.getOwnPropertyNames(headers).forEach(function(name){this.append(name,headers[name])},this)}}
|
|
Headers.prototype.append=function(name,value){name=normalizeName(name)
|
|
value=normalizeValue(value)
|
|
var oldValue=this.map[name]
|
|
this.map[name]=oldValue?oldValue+','+value:value}
|
|
Headers.prototype['delete']=function(name){delete this.map[normalizeName(name)]}
|
|
Headers.prototype.get=function(name){name=normalizeName(name)
|
|
return this.has(name)?this.map[name]:null}
|
|
Headers.prototype.has=function(name){return this.map.hasOwnProperty(normalizeName(name))}
|
|
Headers.prototype.set=function(name,value){this.map[normalizeName(name)]=normalizeValue(value)}
|
|
Headers.prototype.forEach=function(callback,thisArg){for(var name in this.map){if(this.map.hasOwnProperty(name)){callback.call(thisArg,this.map[name],name,this)}}}
|
|
Headers.prototype.keys=function(){var items=[]
|
|
this.forEach(function(value,name){items.push(name)})
|
|
return iteratorFor(items)}
|
|
Headers.prototype.values=function(){var items=[]
|
|
this.forEach(function(value){items.push(value)})
|
|
return iteratorFor(items)}
|
|
Headers.prototype.entries=function(){var items=[]
|
|
this.forEach(function(value,name){items.push([name,value])})
|
|
return iteratorFor(items)}
|
|
if(support.iterable){Headers.prototype[Symbol.iterator]=Headers.prototype.entries}
|
|
function consumed(body){if(body.bodyUsed){return Promise.reject(new TypeError('Already read'))}
|
|
body.bodyUsed=!0}
|
|
function fileReaderReady(reader){return new Promise(function(resolve,reject){reader.onload=function(){resolve(reader.result)}
|
|
reader.onerror=function(){reject(reader.error)}})}
|
|
function readBlobAsArrayBuffer(blob){var reader=new FileReader()
|
|
var promise=fileReaderReady(reader)
|
|
reader.readAsArrayBuffer(blob)
|
|
return promise}
|
|
function readBlobAsText(blob){var reader=new FileReader()
|
|
var promise=fileReaderReady(reader)
|
|
reader.readAsText(blob)
|
|
return promise}
|
|
function readArrayBufferAsText(buf){var view=new Uint8Array(buf)
|
|
var chars=new Array(view.length)
|
|
for(var i=0;i<view.length;i++){chars[i]=String.fromCharCode(view[i])}
|
|
return chars.join('')}
|
|
function bufferClone(buf){if(buf.slice){return buf.slice(0)}else{var view=new Uint8Array(buf.byteLength)
|
|
view.set(new Uint8Array(buf))
|
|
return view.buffer}}
|
|
function Body(){this.bodyUsed=!1
|
|
this._initBody=function(body){this._bodyInit=body
|
|
if(!body){this._bodyText=''}else if(typeof body==='string'){this._bodyText=body}else if(support.blob&&Blob.prototype.isPrototypeOf(body)){this._bodyBlob=body}else if(support.formData&&FormData.prototype.isPrototypeOf(body)){this._bodyFormData=body}else if(support.searchParams&&URLSearchParams.prototype.isPrototypeOf(body)){this._bodyText=body.toString()}else if(support.arrayBuffer&&support.blob&&isDataView(body)){this._bodyArrayBuffer=bufferClone(body.buffer)
|
|
this._bodyInit=new Blob([this._bodyArrayBuffer])}else if(support.arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(body)||isArrayBufferView(body))){this._bodyArrayBuffer=bufferClone(body)}else{throw new Error('unsupported BodyInit type')}
|
|
if(!this.headers.get('content-type')){if(typeof body==='string'){this.headers.set('content-type','text/plain;charset=UTF-8')}else if(this._bodyBlob&&this._bodyBlob.type){this.headers.set('content-type',this._bodyBlob.type)}else if(support.searchParams&&URLSearchParams.prototype.isPrototypeOf(body)){this.headers.set('content-type','application/x-www-form-urlencoded;charset=UTF-8')}}}
|
|
if(support.blob){this.blob=function(){var rejected=consumed(this)
|
|
if(rejected){return rejected}
|
|
if(this._bodyBlob){return Promise.resolve(this._bodyBlob)}else if(this._bodyArrayBuffer){return Promise.resolve(new Blob([this._bodyArrayBuffer]))}else if(this._bodyFormData){throw new Error('could not read FormData body as blob')}else{return Promise.resolve(new Blob([this._bodyText]))}}
|
|
this.arrayBuffer=function(){if(this._bodyArrayBuffer){return consumed(this)||Promise.resolve(this._bodyArrayBuffer)}else{return this.blob().then(readBlobAsArrayBuffer)}}}
|
|
this.text=function(){var rejected=consumed(this)
|
|
if(rejected){return rejected}
|
|
if(this._bodyBlob){return readBlobAsText(this._bodyBlob)}else if(this._bodyArrayBuffer){return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))}else if(this._bodyFormData){throw new Error('could not read FormData body as text')}else{return Promise.resolve(this._bodyText)}}
|
|
if(support.formData){this.formData=function(){return this.text().then(decode)}}
|
|
this.json=function(){return this.text().then(JSON.parse)}
|
|
return this}
|
|
var methods=['DELETE','GET','HEAD','OPTIONS','POST','PUT']
|
|
function normalizeMethod(method){var upcased=method.toUpperCase()
|
|
return(methods.indexOf(upcased)>-1)?upcased:method}
|
|
function Request(input,options){options=options||{}
|
|
var body=options.body
|
|
if(input instanceof Request){if(input.bodyUsed){throw new TypeError('Already read')}
|
|
this.url=input.url
|
|
this.credentials=input.credentials
|
|
if(!options.headers){this.headers=new Headers(input.headers)}
|
|
this.method=input.method
|
|
this.mode=input.mode
|
|
if(!body&&input._bodyInit!=null){body=input._bodyInit
|
|
input.bodyUsed=!0}}else{this.url=String(input)}
|
|
this.credentials=options.credentials||this.credentials||'omit'
|
|
if(options.headers||!this.headers){this.headers=new Headers(options.headers)}
|
|
this.method=normalizeMethod(options.method||this.method||'GET')
|
|
this.mode=options.mode||this.mode||null
|
|
this.referrer=null
|
|
if((this.method==='GET'||this.method==='HEAD')&&body){throw new TypeError('Body not allowed for GET or HEAD requests')}
|
|
this._initBody(body)}
|
|
Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})}
|
|
function decode(body){var form=new FormData()
|
|
body.trim().split('&').forEach(function(bytes){if(bytes){var split=bytes.split('=')
|
|
var name=split.shift().replace(/\+/g,' ')
|
|
var value=split.join('=').replace(/\+/g,' ')
|
|
form.append(decodeURIComponent(name),decodeURIComponent(value))}})
|
|
return form}
|
|
function parseHeaders(rawHeaders){var headers=new Headers()
|
|
var preProcessedHeaders=rawHeaders.replace(/\r?\n[\t ]+/g,' ')
|
|
preProcessedHeaders.split(/\r?\n/).forEach(function(line){var parts=line.split(':')
|
|
var key=parts.shift().trim()
|
|
if(key){var value=parts.join(':').trim()
|
|
headers.append(key,value)}})
|
|
return headers}
|
|
Body.call(Request.prototype)
|
|
function Response(bodyInit,options){if(!options){options={}}
|
|
this.type='default'
|
|
this.status=options.status===undefined?200:options.status
|
|
this.ok=this.status>=200&&this.status<300
|
|
this.statusText='statusText' in options?options.statusText:'OK'
|
|
this.headers=new Headers(options.headers)
|
|
this.url=options.url||''
|
|
this._initBody(bodyInit)}
|
|
Body.call(Response.prototype)
|
|
Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})}
|
|
Response.error=function(){var response=new Response(null,{status:0,statusText:''})
|
|
response.type='error'
|
|
return response}
|
|
var redirectStatuses=[301,302,303,307,308]
|
|
Response.redirect=function(url,status){if(redirectStatuses.indexOf(status)===-1){throw new RangeError('Invalid status code')}
|
|
return new Response(null,{status:status,headers:{location:url}})}
|
|
self.Headers=Headers
|
|
self.Request=Request
|
|
self.Response=Response
|
|
self.fetch=function(input,init){return new Promise(function(resolve,reject){var request=new Request(input,init)
|
|
var xhr=new XMLHttpRequest()
|
|
xhr.onload=function(){var options={status:xhr.status,statusText:xhr.statusText,headers:parseHeaders(xhr.getAllResponseHeaders()||'')}
|
|
options.url='responseURL' in xhr?xhr.responseURL:options.headers.get('X-Request-URL')
|
|
var body='response' in xhr?xhr.response:xhr.responseText
|
|
resolve(new Response(body,options))}
|
|
xhr.onerror=function(){reject(new TypeError('Network request failed'))}
|
|
xhr.ontimeout=function(){reject(new TypeError('Network request failed'))}
|
|
xhr.open(request.method,request.url,!0)
|
|
if(request.credentials==='include'){xhr.withCredentials=!0}else if(request.credentials==='omit'){xhr.withCredentials=!1}
|
|
if('responseType' in xhr&&support.blob){xhr.responseType='blob'}
|
|
request.headers.forEach(function(value,name){xhr.setRequestHeader(name,value)})
|
|
xhr.send(typeof request._bodyInit==='undefined'?null:request._bodyInit)})}
|
|
self.fetch.polyfill=!0})(typeof self!=='undefined'?self:this) |