58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { XMLHttpRequestEventTarget } from './xml-http-request-event-target';
|
|
import { ClientRequest } from 'http';
|
|
|
|
export class XMLHttpRequestUpload extends XMLHttpRequestEventTarget {
|
|
private _contentType: string | null = null;
|
|
private _body = null;
|
|
|
|
constructor() {
|
|
super();
|
|
this._reset();
|
|
}
|
|
|
|
_reset() {
|
|
this._contentType = null;
|
|
this._body = null;
|
|
}
|
|
|
|
_setData(data?: string | Buffer | ArrayBuffer | ArrayBufferView) {
|
|
if (data == null) { return; }
|
|
|
|
if (typeof data === 'string') {
|
|
if (data.length !== 0) {
|
|
this._contentType = 'text/plain;charset=UTF-8';
|
|
}
|
|
this._body = Buffer.from(data, 'utf-8');
|
|
} else if (Buffer.isBuffer(data)) {
|
|
this._body = data;
|
|
} else if (data instanceof ArrayBuffer) {
|
|
const body = Buffer.alloc(data.byteLength);
|
|
const view = new Uint8Array(data);
|
|
for (let i = 0; i < data.byteLength; i++) { body[i] = view[i]; }
|
|
this._body = body;
|
|
} else if (data.buffer && data.buffer instanceof ArrayBuffer) {
|
|
const body = Buffer.alloc(data.byteLength);
|
|
const offset = data.byteOffset;
|
|
const view = new Uint8Array(data.buffer);
|
|
for (let i = 0; i < data.byteLength; i++) { body[i] = view[i + offset]; }
|
|
this._body = body;
|
|
} else {
|
|
throw new Error(`Unsupported send() data ${data}`);
|
|
}
|
|
}
|
|
|
|
_finalizeHeaders(headers: object, loweredHeaders: object) {
|
|
if (this._contentType && !loweredHeaders['content-type']) {
|
|
headers['Content-Type'] = this._contentType;
|
|
}
|
|
if (this._body) {
|
|
headers['Content-Length'] = this._body.length.toString();
|
|
}
|
|
}
|
|
|
|
_startUpload(request: ClientRequest) {
|
|
if (this._body) { request.write(this._body); }
|
|
request.end();
|
|
}
|
|
}
|