@@ -3,8 +3,24 @@ import { HeaderBag, HttpMessage, HttpRequest as IHttpRequest, QueryParameterBag,
3
3
4
4
type HttpRequestOptions = Partial < HttpMessage > & Partial < URI > & { method ?: string } ;
5
5
6
+ /**
7
+ * Use the distinct IHttpRequest interface from @smithy/types instead.
8
+ * This should not be used due to
9
+ * overlapping with the concrete class' name.
10
+ *
11
+ * This is not marked deprecated since that would mark the concrete class
12
+ * deprecated as well.
13
+ */
6
14
export interface HttpRequest extends IHttpRequest { }
7
15
16
+ /**
17
+ * @public
18
+ */
19
+ export { IHttpRequest } ;
20
+
21
+ /**
22
+ * @public
23
+ */
8
24
export class HttpRequest implements HttpMessage , URI {
9
25
public method : string ;
10
26
public protocol : string ;
@@ -18,7 +34,7 @@ export class HttpRequest implements HttpMessage, URI {
18
34
public fragment ?: string ;
19
35
public body ?: any ;
20
36
21
- constructor ( options : HttpRequestOptions ) {
37
+ public constructor ( options : HttpRequestOptions ) {
22
38
this . method = options . method || "GET" ;
23
39
this . hostname = options . hostname || "localhost" ;
24
40
this . port = options . port ;
@@ -36,9 +52,31 @@ export class HttpRequest implements HttpMessage, URI {
36
52
this . fragment = options . fragment ;
37
53
}
38
54
39
- static isInstance ( request : unknown ) : request is HttpRequest {
40
- //determine if request is a valid httpRequest
41
- if ( ! request ) return false ;
55
+ /**
56
+ * Note: this does not deep-clone the body.
57
+ */
58
+ public static clone ( request : IHttpRequest ) {
59
+ const cloned = new HttpRequest ( {
60
+ ...request ,
61
+ headers : { ...request . headers } ,
62
+ } ) ;
63
+ if ( cloned . query ) {
64
+ cloned . query = cloneQuery ( cloned . query ) ;
65
+ }
66
+ return cloned ;
67
+ }
68
+
69
+ /**
70
+ * This method only actually asserts that request is the interface {@link IHttpRequest},
71
+ * and not necessarily this concrete class. Left in place for API stability.
72
+ *
73
+ * Do not call instance methods on the input of this function, and
74
+ * do not assume it has the HttpRequest prototype.
75
+ */
76
+ public static isInstance ( request : unknown ) : request is HttpRequest {
77
+ if ( ! request ) {
78
+ return false ;
79
+ }
42
80
const req : any = request ;
43
81
return (
44
82
"method" in req &&
@@ -50,13 +88,13 @@ export class HttpRequest implements HttpMessage, URI {
50
88
) ;
51
89
}
52
90
53
- clone ( ) : HttpRequest {
54
- const cloned = new HttpRequest ( {
55
- ... this ,
56
- headers : { ... this . headers } ,
57
- } ) ;
58
- if ( cloned . query ) cloned . query = cloneQuery ( cloned . query ) ;
59
- return cloned ;
91
+ /**
92
+ * @deprecated use static HttpRequest.clone(request) instead. It's not safe to call
93
+ * this method because { @link HttpRequest.isInstance} incorrectly
94
+ * asserts that IHttpRequest (interface) objects are of type HttpRequest (class).
95
+ */
96
+ public clone ( ) : HttpRequest {
97
+ return HttpRequest . clone ( this ) ;
60
98
}
61
99
}
62
100
0 commit comments