1
- import { ClientRequest } from 'http' ;
1
+ import { Socket } from 'net' ;
2
+ import { ClientRequest , ServerResponse , IncomingMessage } from 'http' ;
2
3
import * as querystring from 'querystring' ;
3
4
4
5
import { fixRequestBody } from '../../src/handlers/fix-request-body' ;
@@ -11,14 +12,19 @@ const fakeProxyRequest = () => {
11
12
return proxyRequest ;
12
13
} ;
13
14
15
+ const fakeProxyResponse = ( ) : ServerResponse => {
16
+ const res = new ServerResponse ( new IncomingMessage ( new Socket ( ) ) ) ;
17
+ return res ;
18
+ } ;
19
+
14
20
describe ( 'fixRequestBody' , ( ) => {
15
21
it ( 'should not write when body is undefined' , ( ) => {
16
22
const proxyRequest = fakeProxyRequest ( ) ;
17
23
18
24
jest . spyOn ( proxyRequest , 'setHeader' ) ;
19
25
jest . spyOn ( proxyRequest , 'write' ) ;
20
26
21
- fixRequestBody ( proxyRequest , { body : undefined } as Request ) ;
27
+ fixRequestBody ( proxyRequest , { body : undefined } as Request , fakeProxyResponse ( ) ) ;
22
28
23
29
expect ( proxyRequest . setHeader ) . not . toHaveBeenCalled ( ) ;
24
30
expect ( proxyRequest . write ) . not . toHaveBeenCalled ( ) ;
@@ -31,7 +37,7 @@ describe('fixRequestBody', () => {
31
37
jest . spyOn ( proxyRequest , 'setHeader' ) ;
32
38
jest . spyOn ( proxyRequest , 'write' ) ;
33
39
34
- fixRequestBody ( proxyRequest , { body : { } } as Request ) ;
40
+ fixRequestBody ( proxyRequest , { body : { } } as Request , fakeProxyResponse ( ) ) ;
35
41
36
42
expect ( proxyRequest . setHeader ) . toHaveBeenCalled ( ) ;
37
43
expect ( proxyRequest . write ) . toHaveBeenCalled ( ) ;
@@ -44,7 +50,11 @@ describe('fixRequestBody', () => {
44
50
jest . spyOn ( proxyRequest , 'setHeader' ) ;
45
51
jest . spyOn ( proxyRequest , 'write' ) ;
46
52
47
- fixRequestBody ( proxyRequest , { body : { someField : 'some value' } } as Request ) ;
53
+ fixRequestBody (
54
+ proxyRequest ,
55
+ { body : { someField : 'some value' } } as Request ,
56
+ fakeProxyResponse ( )
57
+ ) ;
48
58
49
59
const expectedBody = JSON . stringify ( { someField : 'some value' } ) ;
50
60
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
@@ -58,7 +68,11 @@ describe('fixRequestBody', () => {
58
68
jest . spyOn ( proxyRequest , 'setHeader' ) ;
59
69
jest . spyOn ( proxyRequest , 'write' ) ;
60
70
61
- fixRequestBody ( proxyRequest , { body : { someField : 'some value' } } as Request ) ;
71
+ fixRequestBody (
72
+ proxyRequest ,
73
+ { body : { someField : 'some value' } } as Request ,
74
+ fakeProxyResponse ( )
75
+ ) ;
62
76
63
77
const expectedBody = querystring . stringify ( { someField : 'some value' } ) ;
64
78
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
@@ -72,7 +86,11 @@ describe('fixRequestBody', () => {
72
86
jest . spyOn ( proxyRequest , 'setHeader' ) ;
73
87
jest . spyOn ( proxyRequest , 'write' ) ;
74
88
75
- fixRequestBody ( proxyRequest , { body : { someField : 'some value' } } as Request ) ;
89
+ fixRequestBody (
90
+ proxyRequest ,
91
+ { body : { someField : 'some value' } } as Request ,
92
+ fakeProxyResponse ( )
93
+ ) ;
76
94
77
95
const expectedBody = querystring . stringify ( { someField : 'some value' } ) ;
78
96
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
@@ -86,11 +104,62 @@ describe('fixRequestBody', () => {
86
104
jest . spyOn ( proxyRequest , 'setHeader' ) ;
87
105
jest . spyOn ( proxyRequest , 'write' ) ;
88
106
89
- fixRequestBody ( proxyRequest , { body : { someField : 'some value' } } as Request ) ;
107
+ fixRequestBody (
108
+ proxyRequest ,
109
+ { body : { someField : 'some value' } } as Request ,
110
+ fakeProxyResponse ( )
111
+ ) ;
90
112
91
113
const expectedBody = JSON . stringify ( { someField : 'some value' } ) ;
92
114
expect ( proxyRequest . setHeader ) . toHaveBeenCalledWith ( 'Content-Length' , expectedBody . length ) ;
93
115
expect ( proxyRequest . write ) . toHaveBeenCalledTimes ( 1 ) ;
94
116
expect ( proxyRequest . write ) . toHaveBeenCalledWith ( expectedBody ) ;
95
117
} ) ;
118
+
119
+ it ( 'should return 400 and abort request on "Connection: Upgrade" header' , ( ) => {
120
+ const proxyRequest = fakeProxyRequest ( ) ;
121
+ const request = { body : { someField : 'some value' } } as Request ;
122
+
123
+ proxyRequest . destroy = jest . fn ( ) ;
124
+ request . destroy = jest . fn ( ) ;
125
+
126
+ const proxyResponse = fakeProxyResponse ( ) ;
127
+ proxyRequest . setHeader ( 'connection' , 'upgrade' ) ;
128
+ proxyRequest . setHeader ( 'content-type' , 'application/x-www-form-urlencoded' ) ;
129
+
130
+ jest . spyOn ( proxyRequest , 'destroy' ) ;
131
+ jest . spyOn ( request , 'destroy' ) ;
132
+ jest . spyOn ( proxyResponse , 'writeHead' ) ;
133
+ jest . spyOn ( proxyResponse , 'end' ) ;
134
+
135
+ fixRequestBody ( proxyRequest , request , proxyResponse ) ;
136
+
137
+ expect ( proxyResponse . writeHead ) . toHaveBeenCalledWith ( 400 ) ;
138
+ expect ( proxyResponse . end ) . toHaveBeenCalledTimes ( 1 ) ;
139
+ expect ( proxyRequest . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
140
+ expect ( request . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
141
+ } ) ;
142
+
143
+ it ( 'should return 400 and abort request on invalid request data' , ( ) => {
144
+ const proxyRequest = fakeProxyRequest ( ) ;
145
+ const request = { body : { 'INVALID \n\r DATA' : '' } } as Request ;
146
+
147
+ proxyRequest . destroy = jest . fn ( ) ;
148
+ request . destroy = jest . fn ( ) ;
149
+
150
+ const proxyResponse = fakeProxyResponse ( ) ;
151
+ proxyRequest . setHeader ( 'content-type' , 'application/x-www-form-urlencoded' ) ;
152
+
153
+ jest . spyOn ( proxyRequest , 'destroy' ) ;
154
+ jest . spyOn ( request , 'destroy' ) ;
155
+ jest . spyOn ( proxyResponse , 'writeHead' ) ;
156
+ jest . spyOn ( proxyResponse , 'end' ) ;
157
+
158
+ fixRequestBody ( proxyRequest , request , proxyResponse ) ;
159
+
160
+ expect ( proxyResponse . writeHead ) . toHaveBeenCalledWith ( 400 ) ;
161
+ expect ( proxyResponse . end ) . toHaveBeenCalledTimes ( 1 ) ;
162
+ expect ( proxyRequest . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
163
+ expect ( request . destroy ) . toHaveBeenCalledTimes ( 1 ) ;
164
+ } ) ;
96
165
} ) ;
0 commit comments