OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:math'; | 5 import 'dart:math'; |
6 import 'dart:scalarlist'; | 6 import 'dart:scalarlist'; |
7 | 7 |
8 part '../../../sdk/lib/io/http_parser.dart'; | 8 part '../../../sdk/lib/io/http_parser.dart'; |
9 | 9 |
10 class HttpParserTest { | 10 class HttpParserTest { |
(...skipping 19 matching lines...) Expand all Loading... |
30 bool headersCompleteCalled; | 30 bool headersCompleteCalled; |
31 bool dataEndCalled; | 31 bool dataEndCalled; |
32 String method; | 32 String method; |
33 String uri; | 33 String uri; |
34 String version; | 34 String version; |
35 Map headers; | 35 Map headers; |
36 int contentLength; | 36 int contentLength; |
37 int bytesReceived; | 37 int bytesReceived; |
38 | 38 |
39 void reset() { | 39 void reset() { |
40 httpParser = new _HttpParser(); | 40 httpParser = new _HttpParser.requestParser(); |
41 httpParser.requestStart = (m, u, v) { method = m; uri = u; version = v; }; | 41 httpParser.requestStart = (m, u, v) { method = m; uri = u; version = v; }; |
42 httpParser.responseStart = (s, r, v) { Expect.fail("Expected request"); }; | 42 httpParser.responseStart = (s, r, v) { Expect.fail("Expected request"); }; |
43 httpParser.headerReceived = (f, v) { | 43 httpParser.headerReceived = (f, v) { |
44 Expect.isFalse(headersCompleteCalled); | 44 Expect.isFalse(headersCompleteCalled); |
45 headers[f] = v; | 45 headers[f] = v; |
46 }; | 46 }; |
47 httpParser.headersComplete = () { | 47 httpParser.headersComplete = () { |
48 Expect.isFalse(headersCompleteCalled); | 48 Expect.isFalse(headersCompleteCalled); |
49 if (!chunked) { | 49 if (!chunked) { |
50 Expect.equals(expectedContentLength, httpParser.contentLength); | 50 Expect.equals(expectedContentLength, httpParser.contentLength); |
(...skipping 10 matching lines...) Expand all Loading... |
61 headersCompleteCalled = true; | 61 headersCompleteCalled = true; |
62 }; | 62 }; |
63 httpParser.dataReceived = (List<int> data) { | 63 httpParser.dataReceived = (List<int> data) { |
64 Expect.isTrue(headersCompleteCalled); | 64 Expect.isTrue(headersCompleteCalled); |
65 bytesReceived += data.length; | 65 bytesReceived += data.length; |
66 }; | 66 }; |
67 httpParser.dataEnd = (close) { | 67 httpParser.dataEnd = (close) { |
68 Expect.isFalse(close); | 68 Expect.isFalse(close); |
69 dataEndCalled = true; | 69 dataEndCalled = true; |
70 }; | 70 }; |
| 71 httpParser.closed = () { }; |
71 | 72 |
72 headersCompleteCalled = false; | 73 headersCompleteCalled = false; |
73 dataEndCalled = false; | 74 dataEndCalled = false; |
74 method = null; | 75 method = null; |
75 uri = null; | 76 uri = null; |
76 headers = new Map(); | 77 headers = new Map(); |
77 bytesReceived = 0; | 78 bytesReceived = 0; |
78 } | 79 } |
79 | 80 |
80 void testWrite(List<int> requestData, [int chunkSize = -1]) { | 81 void testWrite(List<int> requestData, [int chunkSize = -1]) { |
81 if (chunkSize == -1) chunkSize = requestData.length; | 82 if (chunkSize == -1) chunkSize = requestData.length; |
82 reset(); | 83 reset(); |
83 int written = 0; | 84 int written = 0; |
84 int unparsed; | 85 int unparsed; |
85 for (int pos = 0; pos < requestData.length; pos += chunkSize) { | 86 for (int pos = 0; pos < requestData.length; pos += chunkSize) { |
86 int remaining = requestData.length - pos; | 87 int remaining = requestData.length - pos; |
87 int writeLength = min(chunkSize, remaining); | 88 int writeLength = min(chunkSize, remaining); |
88 written += writeLength; | 89 written += writeLength; |
89 httpParser.writeList(requestData, pos, writeLength); | 90 httpParser.streamData(requestData.getRange(pos, writeLength)); |
90 unparsed = httpParser.readUnparsedData().length; | 91 unparsed = httpParser.readUnparsedData().length; |
91 if (httpParser.upgrade) { | 92 if (httpParser.upgrade) { |
92 unparsed += requestData.length - written; | 93 unparsed += requestData.length - written; |
93 break; | 94 break; |
94 } else { | 95 } else { |
95 Expect.equals(0, unparsed); | 96 Expect.equals(0, unparsed); |
96 } | 97 } |
97 } | 98 } |
98 Expect.equals(expectedMethod, method); | 99 Expect.equals(expectedMethod, method); |
99 Expect.equals(expectedUri, uri); | 100 Expect.equals(expectedUri, uri); |
(...skipping 14 matching lines...) Expand all Loading... |
114 testWrite(requestData); | 115 testWrite(requestData); |
115 testWrite(requestData, 10); | 116 testWrite(requestData, 10); |
116 testWrite(requestData, 1); | 117 testWrite(requestData, 1); |
117 } | 118 } |
118 | 119 |
119 static void _testParseInvalidRequest(String request) { | 120 static void _testParseInvalidRequest(String request) { |
120 _HttpParser httpParser; | 121 _HttpParser httpParser; |
121 bool errorCalled; | 122 bool errorCalled; |
122 | 123 |
123 void reset() { | 124 void reset() { |
124 httpParser = new _HttpParser(); | 125 httpParser = new _HttpParser.requestParser(); |
125 httpParser.responseStart = (s, r) { Expect.fail("Expected request"); }; | 126 httpParser.responseStart = (s, r) { Expect.fail("Expected request"); }; |
126 httpParser.error = (e) { | 127 httpParser.error = (e) { |
127 errorCalled = true; | 128 errorCalled = true; |
128 }; | 129 }; |
| 130 httpParser.closed = () { }; |
129 | 131 |
130 errorCalled = false; | 132 errorCalled = false; |
131 } | 133 } |
132 | 134 |
133 void testWrite(List<int> requestData, [int chunkSize = -1]) { | 135 void testWrite(List<int> requestData, [int chunkSize = -1]) { |
134 if (chunkSize == -1) chunkSize = requestData.length; | 136 if (chunkSize == -1) chunkSize = requestData.length; |
135 reset(); | 137 reset(); |
136 for (int pos = 0; | 138 for (int pos = 0; |
137 pos < requestData.length && !errorCalled; | 139 pos < requestData.length && !errorCalled; |
138 pos += chunkSize) { | 140 pos += chunkSize) { |
139 int remaining = requestData.length - pos; | 141 int remaining = requestData.length - pos; |
140 int writeLength = min(chunkSize, remaining); | 142 int writeLength = min(chunkSize, remaining); |
141 httpParser.writeList(requestData, pos, writeLength); | 143 httpParser.streamData(requestData.getRange(pos, writeLength)); |
142 } | 144 } |
143 Expect.isTrue(errorCalled); | 145 Expect.isTrue(errorCalled); |
144 } | 146 } |
145 | 147 |
146 // Test parsing the request three times delivering the data in | 148 // Test parsing the request three times delivering the data in |
147 // different chunks. | 149 // different chunks. |
148 List<int> requestData = request.charCodes; | 150 List<int> requestData = request.charCodes; |
149 testWrite(requestData); | 151 testWrite(requestData); |
150 testWrite(requestData, 10); | 152 testWrite(requestData, 10); |
151 testWrite(requestData, 1); | 153 testWrite(requestData, 1); |
(...skipping 17 matching lines...) Expand all Loading... |
169 bool dataEndCalled; | 171 bool dataEndCalled; |
170 bool dataEndClose; | 172 bool dataEndClose; |
171 int statusCode; | 173 int statusCode; |
172 String reasonPhrase; | 174 String reasonPhrase; |
173 String version; | 175 String version; |
174 Map headers; | 176 Map headers; |
175 int contentLength; | 177 int contentLength; |
176 int bytesReceived; | 178 int bytesReceived; |
177 | 179 |
178 void reset() { | 180 void reset() { |
179 httpParser = new _HttpParser(); | 181 httpParser = new _HttpParser.responseParser(); |
180 if (responseToMethod != null) { | 182 if (responseToMethod != null) { |
181 httpParser.responseToMethod = responseToMethod; | 183 httpParser.responseToMethod = responseToMethod; |
182 } | 184 } |
183 httpParser.requestStart = (m, u, v) => Expect.fail("Expected response"); | 185 httpParser.requestStart = (m, u, v) => Expect.fail("Expected response"); |
184 httpParser.responseStart = (s, r, v) { | 186 httpParser.responseStart = (s, r, v) { |
185 statusCode = s; | 187 statusCode = s; |
186 reasonPhrase = r; | 188 reasonPhrase = r; |
187 version = v; | 189 version = v; |
188 }; | 190 }; |
189 httpParser.headerReceived = (f, v) { | 191 httpParser.headerReceived = (f, v) { |
(...skipping 16 matching lines...) Expand all Loading... |
206 headersCompleteCalled = true; | 208 headersCompleteCalled = true; |
207 }; | 209 }; |
208 httpParser.dataReceived = (List<int> data) { | 210 httpParser.dataReceived = (List<int> data) { |
209 Expect.isTrue(headersCompleteCalled); | 211 Expect.isTrue(headersCompleteCalled); |
210 bytesReceived += data.length; | 212 bytesReceived += data.length; |
211 }; | 213 }; |
212 httpParser.dataEnd = (close) { | 214 httpParser.dataEnd = (close) { |
213 dataEndCalled = true; | 215 dataEndCalled = true; |
214 dataEndClose = close; | 216 dataEndClose = close; |
215 }; | 217 }; |
| 218 httpParser.closed = () { }; |
216 | 219 |
217 headersCompleteCalled = false; | 220 headersCompleteCalled = false; |
218 dataEndCalled = false; | 221 dataEndCalled = false; |
219 dataEndClose = null; | 222 dataEndClose = null; |
220 statusCode = -1; | 223 statusCode = -1; |
221 reasonPhrase = null; | 224 reasonPhrase = null; |
222 headers = new Map(); | 225 headers = new Map(); |
223 bytesReceived = 0; | 226 bytesReceived = 0; |
224 } | 227 } |
225 | 228 |
226 void testWrite(List<int> requestData, [int chunkSize = -1]) { | 229 void testWrite(List<int> requestData, [int chunkSize = -1]) { |
227 if (chunkSize == -1) chunkSize = requestData.length; | 230 if (chunkSize == -1) chunkSize = requestData.length; |
228 reset(); | 231 reset(); |
229 int written = 0; | 232 int written = 0; |
230 int unparsed; | 233 int unparsed; |
231 for (int pos = 0; pos < requestData.length; pos += chunkSize) { | 234 for (int pos = 0; pos < requestData.length; pos += chunkSize) { |
232 int remaining = requestData.length - pos; | 235 int remaining = requestData.length - pos; |
233 int writeLength = min(chunkSize, remaining); | 236 int writeLength = min(chunkSize, remaining); |
234 written += writeLength; | 237 written += writeLength; |
235 httpParser.writeList(requestData, pos, writeLength); | 238 httpParser.streamData(requestData.getRange(pos, writeLength)); |
236 unparsed = httpParser.readUnparsedData().length; | 239 unparsed = httpParser.readUnparsedData().length; |
237 if (httpParser.upgrade) { | 240 if (httpParser.upgrade) { |
238 unparsed += requestData.length - written; | 241 unparsed += requestData.length - written; |
239 break; | 242 break; |
240 } else { | 243 } else { |
241 Expect.equals(0, unparsed); | 244 Expect.equals(0, unparsed); |
242 } | 245 } |
243 } | 246 } |
244 if (close) httpParser.connectionClosed(); | 247 if (close) httpParser.streamDone(); |
245 Expect.equals(expectedVersion, version); | 248 Expect.equals(expectedVersion, version); |
246 Expect.equals(expectedStatusCode, statusCode); | 249 Expect.equals(expectedStatusCode, statusCode); |
247 Expect.equals(expectedReasonPhrase, reasonPhrase); | 250 Expect.equals(expectedReasonPhrase, reasonPhrase); |
248 Expect.isTrue(headersCompleteCalled); | 251 Expect.isTrue(headersCompleteCalled); |
249 Expect.equals(expectedBytesReceived, bytesReceived); | 252 Expect.equals(expectedBytesReceived, bytesReceived); |
250 if (!upgrade) { | 253 if (!upgrade) { |
251 Expect.isTrue(dataEndCalled); | 254 Expect.isTrue(dataEndCalled); |
252 if (close) Expect.isTrue(dataEndClose); | 255 if (close) Expect.isTrue(dataEndClose); |
253 Expect.equals(dataEndClose, connectionClose); | 256 Expect.equals(dataEndClose, connectionClose); |
254 } | 257 } |
(...skipping 10 matching lines...) Expand all Loading... |
265 testWrite(responseData); | 268 testWrite(responseData); |
266 testWrite(responseData, 10); | 269 testWrite(responseData, 10); |
267 testWrite(responseData, 1); | 270 testWrite(responseData, 1); |
268 } | 271 } |
269 | 272 |
270 static void _testParseInvalidResponse(String response, [bool close = false]) { | 273 static void _testParseInvalidResponse(String response, [bool close = false]) { |
271 _HttpParser httpParser; | 274 _HttpParser httpParser; |
272 bool errorCalled; | 275 bool errorCalled; |
273 | 276 |
274 void reset() { | 277 void reset() { |
275 httpParser = new _HttpParser(); | 278 httpParser = new _HttpParser.responseParser(); |
276 httpParser.requestStart = (m, u) => Expect.fail("Expected response"); | 279 httpParser.requestStart = (m, u) => Expect.fail("Expected response"); |
277 httpParser.error = (e) => errorCalled = true; | 280 httpParser.error = (e) => errorCalled = true; |
| 281 httpParser.closed = () { }; |
278 | 282 |
279 errorCalled = false; | 283 errorCalled = false; |
280 } | 284 } |
281 | 285 |
282 void testWrite(List<int> requestData, [int chunkSize = -1]) { | 286 void testWrite(List<int> requestData, [int chunkSize = -1]) { |
283 if (chunkSize == -1) chunkSize = requestData.length; | 287 if (chunkSize == -1) chunkSize = requestData.length; |
284 reset(); | 288 reset(); |
285 for (int pos = 0; | 289 for (int pos = 0; |
286 pos < requestData.length && !errorCalled; | 290 pos < requestData.length && !errorCalled; |
287 pos += chunkSize) { | 291 pos += chunkSize) { |
288 int remaining = requestData.length - pos; | 292 int remaining = requestData.length - pos; |
289 int writeLength = min(chunkSize, remaining); | 293 int writeLength = min(chunkSize, remaining); |
290 httpParser.writeList(requestData, pos, writeLength); | 294 httpParser.streamData(requestData.getRange(pos, writeLength)); |
291 } | 295 } |
292 if (close) httpParser.connectionClosed(); | 296 if (close) httpParser.streamDone(); |
293 Expect.isTrue(errorCalled); | 297 Expect.isTrue(errorCalled); |
294 } | 298 } |
295 | 299 |
296 // Test parsing the request three times delivering the data in | 300 // Test parsing the request three times delivering the data in |
297 // different chunks. | 301 // different chunks. |
298 List<int> responseData = response.charCodes; | 302 List<int> responseData = response.charCodes; |
299 testWrite(responseData); | 303 testWrite(responseData); |
300 testWrite(responseData, 10); | 304 testWrite(responseData, 10); |
301 testWrite(responseData, 1); | 305 testWrite(responseData, 1); |
302 } | 306 } |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 0123456789012345678901234567890\r | 845 0123456789012345678901234567890\r |
842 0\r\n\r\n"""; | 846 0\r\n\r\n"""; |
843 _testParseInvalidResponse(response); | 847 _testParseInvalidResponse(response); |
844 } | 848 } |
845 } | 849 } |
846 | 850 |
847 | 851 |
848 void main() { | 852 void main() { |
849 HttpParserTest.runAllTests(); | 853 HttpParserTest.runAllTests(); |
850 } | 854 } |
OLD | NEW |