1
1
import { Socket } from 'net' ;
2
- import { ClientRequest , IncomingMessage } from 'http' ;
2
+ import { ClientRequest , IncomingMessage , ServerResponse } from 'http' ;
3
3
import * as querystring from 'querystring' ;
4
4
import { fixRequestBody , BodyParserLikeRequest } from '../../src/handlers/fix-request-body' ;
5
5
@@ -10,8 +10,14 @@ const fakeProxyRequest = (): ClientRequest => {
10
10
return proxyRequest ;
11
11
} ;
12
12
13
+ const fakeProxyResponse = ( ) : ServerResponse < IncomingMessage > => {
14
+ const res = new ServerResponse ( new IncomingMessage ( new Socket ( ) ) ) ;
15
+ return res ;
16
+ } ;
17
+
13
18
const createRequestWithBody = ( body : unknown ) : BodyParserLikeRequest => {
14
19
const req = new IncomingMessage ( new Socket ( ) ) as BodyParserLikeRequest ;
20
+ req . url = '/test_path' ;
15
21
req . body = body ;
16
22
return req ;
17
23
} ;
@@ -32,7 +38,7 @@ describe('fixRequestBody', () => {
32
38
jest . spyOn ( proxyRequest , 'setHeader' ) ;
33
39
jest . spyOn ( proxyRequest , 'write' ) ;
34
40
35
- fixRequestBody ( proxyRequest , createRequestWithBody ( undefined ) ) ;
41
+ fixRequestBody ( proxyRequest , createRequestWithBody ( undefined ) , fakeProxyResponse ( ) , { } ) ;
36
42
37
43
expect ( proxyRequest . setHeader ) . not . toHaveBeenCalled ( ) ;
38
44
expect ( proxyRequest . write ) . not . toHaveBeenCalled ( ) ;
@@ -45,7 +51,7 @@ describe('fixRequestBody', () => {
45
51
jest . spyOn ( proxyRequest , 'setHeader' ) ;
46
52
jest . spyOn ( proxyRequest , 'write' ) ;
47
53
48
- fixRequestBody ( proxyRequest , createRequestWithBody ( { } ) ) ;
54
+ fixRequestBody ( proxyRequest , createRequestWithBody ( { } ) , fakeProxyResponse ( ) , { } ) ;
49
55
50
56
expect ( proxyRequest . setHeader ) . toHaveBeenCalled ( ) ;
51
57
expect ( proxyRequest . write ) . toHaveBeenCalled ( ) ;
@@ -58,7 +64,12 @@ describe('fixRequestBody', () => {
58
64
jest . spyOn ( proxyRequest , 'setHeader' ) ;
59
65
jest . spyOn ( proxyRequest , 'write' ) ;
60
66
61
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
67
+ fixRequestBody (
68
+ proxyRequest ,
69
+ createRequestWithBody ( { someField : 'some value' } ) ,
70
+ fakeProxyResponse ( ) ,
71
+ { } ,
72
+ ) ;
62
73
63
74
const expectedBody = JSON . stringify ( { someField : 'some value' } ) ;
64
75
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
@@ -72,7 +83,12 @@ describe('fixRequestBody', () => {
72
83
jest . spyOn ( proxyRequest , 'setHeader' ) ;
73
84
jest . spyOn ( proxyRequest , 'write' ) ;
74
85
75
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
86
+ fixRequestBody (
87
+ proxyRequest ,
88
+ createRequestWithBody ( { someField : 'some value' } ) ,
89
+ fakeProxyResponse ( ) ,
90
+ { } ,
91
+ ) ;
76
92
77
93
const expectedBody = handlerFormDataBodyData ( 'multipart/form-data' , {
78
94
someField : 'some value' ,
@@ -96,7 +112,12 @@ describe('fixRequestBody', () => {
96
112
jest . spyOn ( proxyRequest , 'setHeader' ) ;
97
113
jest . spyOn ( proxyRequest , 'write' ) ;
98
114
99
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
115
+ fixRequestBody (
116
+ proxyRequest ,
117
+ createRequestWithBody ( { someField : 'some value' } ) ,
118
+ fakeProxyResponse ( ) ,
119
+ { } ,
120
+ ) ;
100
121
101
122
const expectedBody = handlerFormDataBodyData ( 'multipart/form-data' , {
102
123
someField : 'some value' ,
@@ -121,7 +142,12 @@ describe('fixRequestBody', () => {
121
142
jest . spyOn ( proxyRequest , 'setHeader' ) ;
122
143
jest . spyOn ( proxyRequest , 'write' ) ;
123
144
124
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
145
+ fixRequestBody (
146
+ proxyRequest ,
147
+ createRequestWithBody ( { someField : 'some value' } ) ,
148
+ fakeProxyResponse ( ) ,
149
+ { } ,
150
+ ) ;
125
151
const expectedBody = JSON . stringify ( { someField : 'some value' } ) ;
126
152
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
127
153
expect ( proxyRequest . write ) . toHaveBeenCalledWith ( expectedBody ) ;
@@ -134,7 +160,12 @@ describe('fixRequestBody', () => {
134
160
jest . spyOn ( proxyRequest , 'setHeader' ) ;
135
161
jest . spyOn ( proxyRequest , 'write' ) ;
136
162
137
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
163
+ fixRequestBody (
164
+ proxyRequest ,
165
+ createRequestWithBody ( { someField : 'some value' } ) ,
166
+ fakeProxyResponse ( ) ,
167
+ { } ,
168
+ ) ;
138
169
139
170
const expectedBody = querystring . stringify ( { someField : 'some value' } ) ;
140
171
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
@@ -148,7 +179,12 @@ describe('fixRequestBody', () => {
148
179
jest . spyOn ( proxyRequest , 'setHeader' ) ;
149
180
jest . spyOn ( proxyRequest , 'write' ) ;
150
181
151
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
182
+ fixRequestBody (
183
+ proxyRequest ,
184
+ createRequestWithBody ( { someField : 'some value' } ) ,
185
+ fakeProxyResponse ( ) ,
186
+ { } ,
187
+ ) ;
152
188
153
189
const expectedBody = querystring . stringify ( { someField : 'some value' } ) ;
154
190
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
@@ -162,11 +198,69 @@ describe('fixRequestBody', () => {
162
198
jest . spyOn ( proxyRequest , 'setHeader' ) ;
163
199
jest . spyOn ( proxyRequest , 'write' ) ;
164
200
165
- fixRequestBody ( proxyRequest , createRequestWithBody ( { someField : 'some value' } ) ) ;
201
+ fixRequestBody (
202
+ proxyRequest ,
203
+ createRequestWithBody ( { someField : 'some value' } ) ,
204
+ fakeProxyResponse ( ) ,
205
+ { } ,
206
+ ) ;
166
207
167
208
const expectedBody = JSON . stringify ( { someField : 'some value' } ) ;
168
209
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
169
210
expect ( proxyRequest . write ) . toHaveBeenCalledTimes ( 1 ) ;
170
211
expect ( proxyRequest . write ) . toHaveBeenCalledWith ( expectedBody ) ;
171
212
} ) ;
213
+
214
+ it ( 'should return 400 and abort request on "Connection: Upgrade" header' , ( ) => {
215
+ const proxyRequest = fakeProxyRequest ( ) ;
216
+ const request = createRequestWithBody ( { someField : 'some value' } ) ;
217
+ const proxyResponse = fakeProxyResponse ( ) ;
218
+ proxyRequest . setHeader ( 'connection' , 'upgrade' ) ;
219
+ proxyRequest . setHeader ( 'content-type' , 'application/x-www-form-urlencoded' ) ;
220
+
221
+ jest . spyOn ( proxyRequest , 'destroy' ) ;
222
+ jest . spyOn ( request , 'destroy' ) ;
223
+ jest . spyOn ( proxyResponse , 'writeHead' ) ;
224
+ jest . spyOn ( proxyResponse , 'end' ) ;
225
+
226
+ const logger = {
227
+ error : jest . fn ( ) ,
228
+ } ;
229
+
230
+ fixRequestBody ( proxyRequest , request , proxyResponse , { logger } ) ;
231
+
232
+ expect ( proxyResponse . writeHead ) . toHaveBeenCalledWith ( 400 ) ;
233
+ expect ( proxyResponse . end ) . toHaveBeenCalledTimes ( 1 ) ;
234
+ expect ( proxyRequest . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
235
+ expect ( request . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
236
+ expect ( logger . error ) . toHaveBeenCalledWith (
237
+ `[HPM] HPM_UNEXPECTED_CONNECTION_UPGRADE_HEADER. Aborted request: /test_path` ,
238
+ ) ;
239
+ } ) ;
240
+
241
+ it ( 'should return 400 and abort request on invalid request data' , ( ) => {
242
+ const proxyRequest = fakeProxyRequest ( ) ;
243
+ const request = createRequestWithBody ( { 'INVALID \n\r DATA' : '' } ) ;
244
+ const proxyResponse = fakeProxyResponse ( ) ;
245
+ proxyRequest . setHeader ( 'content-type' , 'application/x-www-form-urlencoded' ) ;
246
+
247
+ jest . spyOn ( proxyRequest , 'destroy' ) ;
248
+ jest . spyOn ( request , 'destroy' ) ;
249
+ jest . spyOn ( proxyResponse , 'writeHead' ) ;
250
+ jest . spyOn ( proxyResponse , 'end' ) ;
251
+
252
+ const logger = {
253
+ error : jest . fn ( ) ,
254
+ } ;
255
+
256
+ fixRequestBody ( proxyRequest , request , proxyResponse , { logger } ) ;
257
+
258
+ expect ( proxyResponse . writeHead ) . toHaveBeenCalledWith ( 400 ) ;
259
+ expect ( proxyResponse . end ) . toHaveBeenCalledTimes ( 1 ) ;
260
+ expect ( proxyRequest . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
261
+ expect ( request . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
262
+ expect ( logger . error ) . toHaveBeenCalledWith (
263
+ `[HPM] HPM_INVALID_REQUEST_DATA. Aborted request: /test_path` ,
264
+ ) ;
265
+ } ) ;
172
266
} ) ;
0 commit comments