-
Notifications
You must be signed in to change notification settings - Fork 576
/
httpRequest.ts
64 lines (57 loc) · 1.93 KB
/
httpRequest.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { Endpoint, HeaderBag, HttpMessage, HttpRequest as IHttpRequest, QueryParameterBag } from "@aws-sdk/types";
type HttpRequestOptions = Partial<HttpMessage> & Partial<Endpoint> & { method?: string };
export interface HttpRequest extends IHttpRequest {}
export class HttpRequest implements HttpMessage, Endpoint {
public method: string;
public protocol: string;
public hostname: string;
public port?: number;
public path: string;
public query: QueryParameterBag;
public headers: HeaderBag;
public body?: any;
constructor(options: HttpRequestOptions) {
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) : "/";
}
static isInstance(request: unknown): request is HttpRequest {
//determine if request is a valid httpRequest
if (!request) return false;
const req: any = request;
return (
"method" in req &&
"protocol" in req &&
"hostname" in req &&
"path" in req &&
typeof req["query"] === "object" &&
typeof req["headers"] === "object"
);
}
clone(): HttpRequest {
const cloned = new HttpRequest({
...this,
headers: { ...this.headers },
});
if (cloned.query) cloned.query = cloneQuery(cloned.query);
return cloned;
}
}
function cloneQuery(query: QueryParameterBag): QueryParameterBag {
return Object.keys(query).reduce((carry: QueryParameterBag, paramName: string) => {
const param = query[paramName];
return {
...carry,
[paramName]: Array.isArray(param) ? [...param] : param,
};
}, {});
}