48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
export class HttpRequest {
|
|
constructor(options) {
|
|
this.method = options.method || "GET";
|
|
this.hostname = options.hostname || "localhost";
|
|
this.port = options.port;
|
|
this.query = options.query || {};
|
|
this.headers = options.headers || {};
|
|
this.body = options.body;
|
|
this.protocol = options.protocol
|
|
? options.protocol.slice(-1) !== ":"
|
|
? `${options.protocol}:`
|
|
: options.protocol
|
|
: "https:";
|
|
this.path = options.path ? (options.path.charAt(0) !== "/" ? `/${options.path}` : options.path) : "/";
|
|
this.username = options.username;
|
|
this.password = options.password;
|
|
this.fragment = options.fragment;
|
|
}
|
|
static isInstance(request) {
|
|
if (!request)
|
|
return false;
|
|
const req = request;
|
|
return ("method" in req &&
|
|
"protocol" in req &&
|
|
"hostname" in req &&
|
|
"path" in req &&
|
|
typeof req["query"] === "object" &&
|
|
typeof req["headers"] === "object");
|
|
}
|
|
clone() {
|
|
const cloned = new HttpRequest({
|
|
...this,
|
|
headers: { ...this.headers },
|
|
});
|
|
if (cloned.query)
|
|
cloned.query = cloneQuery(cloned.query);
|
|
return cloned;
|
|
}
|
|
}
|
|
function cloneQuery(query) {
|
|
return Object.keys(query).reduce((carry, paramName) => {
|
|
const param = query[paramName];
|
|
return {
|
|
...carry,
|
|
[paramName]: Array.isArray(param) ? [...param] : param,
|
|
};
|
|
}, {});
|
|
}
|