@@ -3,8 +3,24 @@ import { HeaderBag, HttpMessage, HttpRequest as IHttpRequest, QueryParameterBag,
33
44type HttpRequestOptions = Partial < HttpMessage > & Partial < URI > & { method ?: string } ;
55
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+ */
614export interface HttpRequest extends IHttpRequest { }
715
16+ /**
17+ * @public
18+ */
19+ export { IHttpRequest } ;
20+
21+ /**
22+ * @public
23+ */
824export class HttpRequest implements HttpMessage , URI {
925 public method : string ;
1026 public protocol : string ;
@@ -18,7 +34,7 @@ export class HttpRequest implements HttpMessage, URI {
1834 public fragment ?: string ;
1935 public body ?: any ;
2036
21- constructor ( options : HttpRequestOptions ) {
37+ public constructor ( options : HttpRequestOptions ) {
2238 this . method = options . method || "GET" ;
2339 this . hostname = options . hostname || "localhost" ;
2440 this . port = options . port ;
@@ -36,9 +52,31 @@ export class HttpRequest implements HttpMessage, URI {
3652 this . fragment = options . fragment ;
3753 }
3854
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+ }
4280 const req : any = request ;
4381 return (
4482 "method" in req &&
@@ -50,13 +88,13 @@ export class HttpRequest implements HttpMessage, URI {
5088 ) ;
5189 }
5290
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 ) ;
6098 }
6199}
62100
0 commit comments