| 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 |