Deleted
Added
1import re 2import select 3import socket 4import time 5 6from unit.applications.lang.python import TestApplicationPython 7 8 9class TestProxyChunked(TestApplicationPython): 10 prerequisites = {'modules': {'python': 'any'}} 11 12 SERVER_PORT = 7999 13 14 @staticmethod |
15 def run_server(server_port, temp_dir): |
16 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 17 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 18 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 19 20 server_address = ('127.0.0.1', server_port) 21 sock.bind(server_address) 22 sock.listen(10) 23 --- 52 unchanged lines hidden (view full) --- 76 for l, c in chunks: 77 body = body + l + '\r\n' + c + '\r\n' 78 79 return body + '0\r\n\r\n' 80 81 def get_http10(self, *args, **kwargs): 82 return self.get(*args, http_10=True, **kwargs) 83 |
84 def setup_method(self): 85 super().setup_method() |
86 |
87 self.run_process(self.run_server, self.SERVER_PORT, self.temp_dir) |
88 self.waitforsocket(self.SERVER_PORT) 89 |
90 assert 'success' in self.conf( 91 { 92 "listeners": {"*:7080": {"pass": "routes"},}, 93 "routes": [ 94 { 95 "action": { 96 "proxy": "http://127.0.0.1:" 97 + str(self.SERVER_PORT) |
98 } |
99 } 100 ], 101 } 102 ), 'proxy initial configuration' |
103 104 def test_proxy_chunked(self): 105 for _ in range(10): |
106 assert self.get_http10(body='\r\n\r\n0\r\n\r\n')['status'] == 200 |
107 108 def test_proxy_chunked_body(self): 109 part = '0123456789abcdef' 110 |
111 assert ( |
112 self.get_http10(body=self.chunks([('1000', part + ' X 256')]))[ 113 'body' |
114 ] 115 == part * 256 |
116 ) |
117 assert ( |
118 self.get_http10(body=self.chunks([('100000', part + ' X 65536')]))[ 119 'body' |
120 ] 121 == part * 65536 |
122 ) |
123 assert ( |
124 self.get_http10( 125 body=self.chunks([('1000000', part + ' X 1048576')]), 126 read_buffer_size=4096 * 4096, |
127 )['body'] 128 == part * 1048576 |
129 ) 130 |
131 assert ( |
132 self.get_http10( 133 body=self.chunks( 134 [('1000', part + ' X 256'), ('1000', part + ' X 256')] 135 ) |
136 )['body'] 137 == part * 256 * 2 |
138 ) |
139 assert ( |
140 self.get_http10( 141 body=self.chunks( 142 [ 143 ('100000', part + ' X 65536'), 144 ('100000', part + ' X 65536'), 145 ] 146 ) |
147 )['body'] 148 == part * 65536 * 2 |
149 ) |
150 assert ( |
151 self.get_http10( 152 body=self.chunks( 153 [ 154 ('1000000', part + ' X 1048576'), 155 ('1000000', part + ' X 1048576'), 156 ] 157 ), 158 read_buffer_size=4096 * 4096, |
159 )['body'] 160 == part * 1048576 * 2 |
161 ) 162 163 def test_proxy_chunked_fragmented(self): 164 part = '0123456789abcdef' 165 |
166 assert ( |
167 self.get_http10( 168 body=self.chunks( 169 [('1', hex(i % 16)[2:]) for i in range(4096)] 170 ), |
171 )['body'] 172 == part * 256 |
173 ) 174 175 def test_proxy_chunked_send(self): |
176 assert self.get_http10(body='\r\n\r\n@0@\r\n\r\n')['status'] == 200 177 assert ( |
178 self.get_http10( 179 body='\r@\n\r\n2\r@\na@b\r\n2\r\ncd@\r\n0\r@\n\r\n' |
180 )['body'] 181 == 'abcd' |
182 ) |
183 assert ( |
184 self.get_http10( 185 body='\r\n\r\n2\r#\na#b\r\n##2\r\n#cd\r\n0\r\n#\r#\n' |
186 )['body'] 187 == 'abcd' |
188 ) 189 190 def test_proxy_chunked_invalid(self): 191 def check_invalid(body): |
192 assert self.get_http10(body=body)['status'] != 200 |
193 194 check_invalid('\r\n\r0') 195 check_invalid('\r\n\r\n\r0') 196 check_invalid('\r\n\r\n\r\n0') 197 check_invalid('\r\nContent-Length: 5\r\n\r\n0\r\n\r\n') 198 check_invalid('\r\n\r\n1\r\nXX\r\n0\r\n\r\n') 199 check_invalid('\r\n\r\n2\r\nX\r\n0\r\n\r\n') 200 check_invalid('\r\n\r\nH\r\nXX\r\n0\r\n\r\n') 201 check_invalid('\r\n\r\n0\r\nX') 202 203 resp = self.get_http10(body='\r\n\r\n65#\r\nA X 100') |
204 assert resp['status'] == 200, 'incomplete chunk status' 205 assert resp['body'][-5:] != '0\r\n\r\n', 'incomplete chunk' |
206 207 resp = self.get_http10(body='\r\n\r\n64#\r\nA X 100') |
208 assert resp['status'] == 200, 'no zero chunk status' 209 assert resp['body'][-5:] != '0\r\n\r\n', 'no zero chunk' |
210 |
211 assert ( 212 self.get_http10(body='\r\n\r\n80000000\r\nA X 100')['status'] 213 == 200 |
214 ) |
215 assert ( |
216 self.get_http10(body='\r\n\r\n10000000000000000\r\nA X 100')[ 217 'status' |
218 ] 219 == 502 |
220 ) |
221 assert ( |
222 len( 223 self.get_http10( 224 body='\r\n\r\n1000000\r\nA X 1048576\r\n1000000\r\nA X 100', 225 read_buffer_size=4096 * 4096, 226 )['body'] |
227 ) 228 >= 1048576 |
229 ) |
230 assert ( |
231 len( 232 self.get_http10( 233 body='\r\n\r\n1000000\r\nA X 1048576\r\nXXX\r\nA X 100', 234 read_buffer_size=4096 * 4096, 235 )['body'] |
236 ) 237 >= 1048576 |
238 ) |