feat: add xhr

Signed-off-by: MiaoWoo <admin@yumc.pw>
backup
MiaoWoo 2019-11-04 20:20:08 +08:00
parent 0012da9855
commit a3cf7eb036
1 changed files with 61 additions and 29 deletions

View File

@ -43,15 +43,37 @@ enum ReadyState {
LOADING,//Downloading; responseText holds partial data.
DONE,//The operation is complete.
}
type RequestMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH';
type ResponseType = '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text';
type EventType = 'load' | 'error' | 'abort' | 'progress' | 'timeout' | 'loadend' | 'loadstart';
type RequestMethod =
| 'get' | 'GET'
| 'delete' | 'DELETE'
| 'head' | 'HEAD'
| 'options' | 'OPTIONS'
| 'post' | 'POST'
| 'put' | 'PUT'
| 'patch' | 'PATCH';
type ResponseType =
| 'arraybuffer'
| 'blob'
| 'document'
| 'json'
| 'text'
| 'stream';
type EventType =
| 'load'
| 'error'
| 'abort'
| 'progress'
| 'timeout'
| 'loadend'
| 'loadstart';
type HttpHeader = { [key: string]: string };
const executor = Executors.newCachedThreadPool();
export class XMLHttpRequest {
private _timeout: number;
private _responseType: ResponseType;
private _responseType: ResponseType = 'text';
private _withCredentials: boolean;
private _readyState: ReadyState = ReadyState.UNSENT;
@ -65,6 +87,7 @@ export class XMLHttpRequest {
private _statusText: string = null;
private _response: any;
private _responseURL: string;
private _responseHeaders: HttpHeader;
private _connection = null;
@ -103,30 +126,23 @@ export class XMLHttpRequest {
return this._responseURL;
}
onreadystatechange() {
}
onprogress() {
}
onabort() {
}
onerror(ex: Error) {
}
ontimeout(ex: Error) {
}
onload() { }
onerror(ex: Error) { }
onabort() { }
onprogress() { }
ontimeout(ex: Error) { }
onloadend() { }
onloadstart() { }
onreadystatechange() { }
setRequestHeader(key: string, val: string) {
this._connection.setRequestProperty(key, val);
}
getResponseHeader(key: string): string {
return this._connection.getHeaderField(key);
return this._responseHeaders[key];
}
getAllResponseHeaders(): any {
return this._connection.getHeaderFields();
return this._responseHeaders;
}
addEventListener(event: EventType, callback: Function) {
this[`on${event.toLowerCase()}`] = callback;
@ -167,6 +183,7 @@ export class XMLHttpRequest {
try {
this._connection.connect();
this.onloadstart();
if (body) {
let bodyType = Object.prototype.toString.call(body);
if (bodyType !== '[object String]') { throw new Error(`body(${bodyType}) must be string!`) }
@ -175,11 +192,10 @@ export class XMLHttpRequest {
out.flush();
out.close();
}
this.setReadyState(ReadyState.LOADING);
this._status = this._connection.getResponseCode();
this._statusText = this._connection.getResponseMessage();
this.setResponseHeaders(this._connection.getHeaderFields());
if (this._status >= 0 && this._status < 300) {
this._response = this.readOutput(this._connection.getInputStream());
} else if (this._status >= 300 && this._status < 400) {
@ -187,19 +203,35 @@ export class XMLHttpRequest {
} else {
this._response = this.readOutput(this._connection.getErrorStream());
}
return this._response;
} catch (ex) {
if (ex instanceof SocketTimeoutException) {
this.ontimeout(ex)
} else {
this.onerror(ex);
this.onloadend();
switch (this._responseType) {
case "json":
return this.response;
case "text":
return this.responseText;
default:
throw Error(`Unsupport ResponseType: ${this._responseType} !`)
}
} catch (ex) {
if (ex instanceof SocketTimeoutException && this.ontimeout) {
return this.ontimeout(ex)
} else if (this.onerror) {
return this.onerror(ex);
}
throw ex;
} finally {
this._connection.disconnect();
this.setReadyState(ReadyState.DONE);
}
}
private setResponseHeaders(header: any) {
this._responseHeaders = {};
header.forEach((key, value) => {
this._responseHeaders[key] = value[value.length - 1]
});
}
private setReadyState(state: ReadyState) {
this._readyState = state;
this.onreadystatechange();