1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-27 16:10:57 -05:00
denoland-deno/cli/rt/25_request.js
2020-07-23 16:27:26 +02:00

139 lines
3.3 KiB
JavaScript

// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => {
const body = window.__bootstrap.body;
const { ReadableStream } = window.__bootstrap.streams;
function byteUpperCase(s) {
return String(s).replace(/[a-z]/g, function byteUpperCaseReplace(c) {
return c.toUpperCase();
});
}
function normalizeMethod(m) {
const u = byteUpperCase(m);
if (
u === "DELETE" ||
u === "GET" ||
u === "HEAD" ||
u === "OPTIONS" ||
u === "POST" ||
u === "PUT"
) {
return u;
}
return m;
}
class Request extends body.Body {
constructor(input, init) {
if (arguments.length < 1) {
throw TypeError("Not enough arguments");
}
if (!init) {
init = {};
}
let b;
// prefer body from init
if (init.body) {
b = init.body;
} else if (input instanceof Request && input._bodySource) {
if (input.bodyUsed) {
throw TypeError(body.BodyUsedError);
}
b = input._bodySource;
} else if (typeof input === "object" && "body" in input && input.body) {
if (input.bodyUsed) {
throw TypeError(body.BodyUsedError);
}
b = input.body;
} else {
b = "";
}
let headers;
// prefer headers from init
if (init.headers) {
headers = new Headers(init.headers);
} else if (input instanceof Request) {
headers = input.headers;
} else {
headers = new Headers();
}
const contentType = headers.get("content-type") || "";
super(b, { contentType });
this.headers = headers;
// readonly attribute ByteString method;
this.method = "GET";
// readonly attribute USVString url;
this.url = "";
// readonly attribute RequestCredentials credentials;
this.credentials = "omit";
if (input instanceof Request) {
if (input.bodyUsed) {
throw TypeError(body.BodyUsedError);
}
this.method = input.method;
this.url = input.url;
this.headers = new Headers(input.headers);
this.credentials = input.credentials;
this._stream = input._stream;
} else if (typeof input === "string") {
this.url = input;
}
if (init && "method" in init) {
this.method = normalizeMethod(init.method);
}
if (
init &&
"credentials" in init &&
init.credentials &&
["omit", "same-origin", "include"].indexOf(init.credentials) !== -1
) {
this.credentials = init.credentials;
}
}
clone() {
if (this.bodyUsed) {
throw TypeError(body.BodyUsedError);
}
const iterators = this.headers.entries();
const headersList = [];
for (const header of iterators) {
headersList.push(header);
}
let body2 = this._bodySource;
if (this._bodySource instanceof ReadableStream) {
const tees = this._bodySource.tee();
this._stream = this._bodySource = tees[0];
body2 = tees[1];
}
return new Request(this.url, {
body: body2,
method: this.method,
headers: new Headers(headersList),
credentials: this.credentials,
});
}
}
window.__bootstrap.request = {
Request,
};
})(this);