| 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 library request_test; | 5 library request_test; |
| 6 | 6 |
| 7 import 'dart:convert'; | 7 import 'dart:convert'; |
| 8 import 'dart:io'; | |
| 9 | 8 |
| 10 import 'package:http/http.dart' as http; | 9 import 'package:http/http.dart' as http; |
| 11 import 'package:unittest/unittest.dart'; | 10 import 'package:unittest/unittest.dart'; |
| 12 | 11 |
| 13 import 'utils.dart'; | 12 import 'utils.dart'; |
| 14 | 13 |
| 15 void main() { | 14 void main() { |
| 16 test('.send', () { | |
| 17 expect(startServer().then((_) { | |
| 18 | |
| 19 var request = new http.Request('POST', serverUrl); | |
| 20 request.body = "hello"; | |
| 21 request.headers['User-Agent'] = 'Dart'; | |
| 22 | |
| 23 expect(request.send().then((response) { | |
| 24 expect(response.statusCode, equals(200)); | |
| 25 return response.stream.bytesToString(); | |
| 26 }).whenComplete(stopServer), completion(parse(equals({ | |
| 27 'method': 'POST', | |
| 28 'path': '/', | |
| 29 'headers': { | |
| 30 'content-type': ['text/plain; charset=utf-8'], | |
| 31 'accept-encoding': ['gzip'], | |
| 32 'user-agent': ['Dart'], | |
| 33 'content-length': ['5'] | |
| 34 }, | |
| 35 'body': 'hello' | |
| 36 })))); | |
| 37 }), completes); | |
| 38 }); | |
| 39 | |
| 40 group('#contentLength', () { | 15 group('#contentLength', () { |
| 41 test('is computed from bodyBytes', () { | 16 test('is computed from bodyBytes', () { |
| 42 var request = new http.Request('POST', dummyUrl); | 17 var request = new http.Request('POST', dummyUrl); |
| 43 request.bodyBytes = [1, 2, 3, 4, 5]; | 18 request.bodyBytes = [1, 2, 3, 4, 5]; |
| 44 expect(request.contentLength, equals(5)); | 19 expect(request.contentLength, equals(5)); |
| 45 request.bodyBytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; | 20 request.bodyBytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
| 46 expect(request.contentLength, equals(10)); | 21 expect(request.contentLength, equals(10)); |
| 47 }); | 22 }); |
| 48 | 23 |
| 49 test('is computed from body', () { | 24 test('is computed from body', () { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 67 }); | 42 }); |
| 68 | 43 |
| 69 test('can be set', () { | 44 test('can be set', () { |
| 70 var request = new http.Request('POST', dummyUrl); | 45 var request = new http.Request('POST', dummyUrl); |
| 71 request.encoding = LATIN1; | 46 request.encoding = LATIN1; |
| 72 expect(request.encoding.name, equals(LATIN1.name)); | 47 expect(request.encoding.name, equals(LATIN1.name)); |
| 73 }); | 48 }); |
| 74 | 49 |
| 75 test('is based on the content-type charset if it exists', () { | 50 test('is based on the content-type charset if it exists', () { |
| 76 var request = new http.Request('POST', dummyUrl); | 51 var request = new http.Request('POST', dummyUrl); |
| 77 request.headers[HttpHeaders.CONTENT_TYPE] = | 52 request.headers['Content-Type'] = 'text/plain; charset=iso-8859-1'; |
| 78 'text/plain; charset=iso-8859-1'; | |
| 79 expect(request.encoding.name, equals(LATIN1.name)); | 53 expect(request.encoding.name, equals(LATIN1.name)); |
| 80 }); | 54 }); |
| 81 | 55 |
| 82 test('remains the default if the content-type charset is set and unset', | 56 test('remains the default if the content-type charset is set and unset', |
| 83 () { | 57 () { |
| 84 var request = new http.Request('POST', dummyUrl); | 58 var request = new http.Request('POST', dummyUrl); |
| 85 request.encoding = LATIN1; | 59 request.encoding = LATIN1; |
| 86 request.headers[HttpHeaders.CONTENT_TYPE] = | 60 request.headers['Content-Type'] = 'text/plain; charset=utf-8'; |
| 87 'text/plain; charset=utf-8'; | |
| 88 expect(request.encoding.name, equals(UTF8.name)); | 61 expect(request.encoding.name, equals(UTF8.name)); |
| 89 | 62 |
| 90 request.headers.remove(HttpHeaders.CONTENT_TYPE); | 63 request.headers.remove('Content-Type'); |
| 91 expect(request.encoding.name, equals(LATIN1.name)); | 64 expect(request.encoding.name, equals(LATIN1.name)); |
| 92 }); | 65 }); |
| 93 | 66 |
| 94 test('throws an error if the content-type charset is unknown', () { | 67 test('throws an error if the content-type charset is unknown', () { |
| 95 var request = new http.Request('POST', dummyUrl); | 68 var request = new http.Request('POST', dummyUrl); |
| 96 request.headers[HttpHeaders.CONTENT_TYPE] = | 69 request.headers['Content-Type'] = |
| 97 'text/plain; charset=not-a-real-charset'; | 70 'text/plain; charset=not-a-real-charset'; |
| 98 expect(() => request.encoding, throwsFormatException); | 71 expect(() => request.encoding, throwsFormatException); |
| 99 }); | 72 }); |
| 100 }); | 73 }); |
| 101 | 74 |
| 102 group('#bodyBytes', () { | 75 group('#bodyBytes', () { |
| 103 test('defaults to empty', () { | 76 test('defaults to empty', () { |
| 104 var request = new http.Request('POST', dummyUrl); | 77 var request = new http.Request('POST', dummyUrl); |
| 105 expect(request.bodyBytes, isEmpty); | 78 expect(request.bodyBytes, isEmpty); |
| 106 }); | 79 }); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 }); | 125 }); |
| 153 | 126 |
| 154 group('#bodyFields', () { | 127 group('#bodyFields', () { |
| 155 test("can't be read without setting the content-type", () { | 128 test("can't be read without setting the content-type", () { |
| 156 var request = new http.Request('POST', dummyUrl); | 129 var request = new http.Request('POST', dummyUrl); |
| 157 expect(() => request.bodyFields, throwsStateError); | 130 expect(() => request.bodyFields, throwsStateError); |
| 158 }); | 131 }); |
| 159 | 132 |
| 160 test("can't be read with the wrong content-type", () { | 133 test("can't be read with the wrong content-type", () { |
| 161 var request = new http.Request('POST', dummyUrl); | 134 var request = new http.Request('POST', dummyUrl); |
| 162 request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain'; | 135 request.headers['Content-Type'] = 'text/plain'; |
| 163 expect(() => request.bodyFields, throwsStateError); | 136 expect(() => request.bodyFields, throwsStateError); |
| 164 }); | 137 }); |
| 165 | 138 |
| 166 test("can't be set with the wrong content-type", () { | 139 test("can't be set with the wrong content-type", () { |
| 167 var request = new http.Request('POST', dummyUrl); | 140 var request = new http.Request('POST', dummyUrl); |
| 168 request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain'; | 141 request.headers['Content-Type'] = 'text/plain'; |
| 169 expect(() => request.bodyFields = {}, throwsStateError); | 142 expect(() => request.bodyFields = {}, throwsStateError); |
| 170 }); | 143 }); |
| 171 | 144 |
| 172 test('defaults to empty', () { | 145 test('defaults to empty', () { |
| 173 var request = new http.Request('POST', dummyUrl); | 146 var request = new http.Request('POST', dummyUrl); |
| 174 request.headers[HttpHeaders.CONTENT_TYPE] = | 147 request.headers['Content-Type'] = |
| 175 'application/x-www-form-urlencoded'; | 148 'application/x-www-form-urlencoded'; |
| 176 expect(request.bodyFields, isEmpty); | 149 expect(request.bodyFields, isEmpty); |
| 177 }); | 150 }); |
| 178 | 151 |
| 179 test('can be set with no content-type', () { | 152 test('can be set with no content-type', () { |
| 180 var request = new http.Request('POST', dummyUrl); | 153 var request = new http.Request('POST', dummyUrl); |
| 181 request.bodyFields = {'hello': 'world'}; | 154 request.bodyFields = {'hello': 'world'}; |
| 182 expect(request.bodyFields, equals({'hello': 'world'})); | 155 expect(request.bodyFields, equals({'hello': 'world'})); |
| 183 }); | 156 }); |
| 184 | 157 |
| 185 test('changes when body changes', () { | 158 test('changes when body changes', () { |
| 186 var request = new http.Request('POST', dummyUrl); | 159 var request = new http.Request('POST', dummyUrl); |
| 187 request.headers[HttpHeaders.CONTENT_TYPE] = | 160 request.headers['Content-Type'] = |
| 188 'application/x-www-form-urlencoded'; | 161 'application/x-www-form-urlencoded'; |
| 189 request.body = 'key%201=value&key+2=other%2bvalue'; | 162 request.body = 'key%201=value&key+2=other%2bvalue'; |
| 190 expect(request.bodyFields, | 163 expect(request.bodyFields, |
| 191 equals({'key 1': 'value', 'key 2': 'other+value'})); | 164 equals({'key 1': 'value', 'key 2': 'other+value'})); |
| 192 }); | 165 }); |
| 193 | 166 |
| 194 test('is encoded according to the given encoding', () { | 167 test('is encoded according to the given encoding', () { |
| 195 var request = new http.Request('POST', dummyUrl); | 168 var request = new http.Request('POST', dummyUrl); |
| 196 request.headers[HttpHeaders.CONTENT_TYPE] = | 169 request.headers['Content-Type'] = |
| 197 'application/x-www-form-urlencoded'; | 170 'application/x-www-form-urlencoded'; |
| 198 request.encoding = LATIN1; | 171 request.encoding = LATIN1; |
| 199 request.bodyFields = {"föø": "bãr"}; | 172 request.bodyFields = {"föø": "bãr"}; |
| 200 expect(request.body, equals('f%F6%F8=b%E3r')); | 173 expect(request.body, equals('f%F6%F8=b%E3r')); |
| 201 }); | 174 }); |
| 202 | 175 |
| 203 test('is decoded according to the given encoding', () { | 176 test('is decoded according to the given encoding', () { |
| 204 var request = new http.Request('POST', dummyUrl); | 177 var request = new http.Request('POST', dummyUrl); |
| 205 request.headers[HttpHeaders.CONTENT_TYPE] = | 178 request.headers['Content-Type'] = |
| 206 'application/x-www-form-urlencoded'; | 179 'application/x-www-form-urlencoded'; |
| 207 request.encoding = LATIN1; | 180 request.encoding = LATIN1; |
| 208 request.body = 'f%F6%F8=b%E3r'; | 181 request.body = 'f%F6%F8=b%E3r'; |
| 209 expect(request.bodyFields, equals({"föø": "bãr"})); | 182 expect(request.bodyFields, equals({"föø": "bãr"})); |
| 210 }); | 183 }); |
| 211 }); | 184 }); |
| 212 | 185 |
| 213 test('#followRedirects', () { | |
| 214 print("This test is known to be flaky, please ignore " | |
| 215 "(debug prints below added by sgjesse@)"); | |
| 216 print("#followRedirects test starting server..."); | |
| 217 expect(startServer().then((_) { | |
| 218 print("#followRedirects test server running"); | |
| 219 | |
| 220 var request = new http.Request('POST', serverUrl.resolve('/redirect')) | |
| 221 ..followRedirects = false; | |
| 222 var future = request.send().then((response) { | |
| 223 print("#followRedirects test response received"); | |
| 224 expect(response.statusCode, equals(302)); | |
| 225 }); | |
| 226 expect(future.catchError((_) {}).then((_) { | |
| 227 print("#followRedirects test stopping server..."); | |
| 228 stopServer(); | |
| 229 print("#followRedirects test server stopped"); | |
| 230 }), completes); | |
| 231 | |
| 232 expect(future, completes); | |
| 233 print("#followRedirects test started"); | |
| 234 }), completes); | |
| 235 }); | |
| 236 | |
| 237 test('#maxRedirects', () { | |
| 238 print("This test is known to be flaky, please ignore " | |
| 239 "(debug prints below added by sgjesse@)"); | |
| 240 print("#maxRedirects test starting server..."); | |
| 241 expect(startServer().then((_) { | |
| 242 print("#maxRedirects test server running"); | |
| 243 | |
| 244 var request = new http.Request('POST', serverUrl.resolve('/loop?1')) | |
| 245 ..maxRedirects = 2; | |
| 246 var future = request.send().catchError((error) { | |
| 247 print("#maxRedirects test exception received"); | |
| 248 expect(error, isRedirectLimitExceededException); | |
| 249 expect(error.redirects.length, equals(2)); | |
| 250 }); | |
| 251 expect(future.catchError((_) {}).then((_) { | |
| 252 print("#maxRedirects test stopping server..."); | |
| 253 stopServer(); | |
| 254 print("#maxRedirects test server stopped"); | |
| 255 }), completes); | |
| 256 | |
| 257 expect(future, completes); | |
| 258 print("#maxRedirects test started"); | |
| 259 }), completes); | |
| 260 }); | |
| 261 | |
| 262 group('content-type header', () { | 186 group('content-type header', () { |
| 263 test('defaults to empty', () { | 187 test('defaults to empty', () { |
| 264 var request = new http.Request('POST', dummyUrl); | 188 var request = new http.Request('POST', dummyUrl); |
| 265 expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull); | 189 expect(request.headers['Content-Type'], isNull); |
| 266 }); | 190 }); |
| 267 | 191 |
| 268 test('defaults to empty if only encoding is set', () { | 192 test('defaults to empty if only encoding is set', () { |
| 269 var request = new http.Request('POST', dummyUrl); | 193 var request = new http.Request('POST', dummyUrl); |
| 270 request.encoding = LATIN1; | 194 request.encoding = LATIN1; |
| 271 expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull); | 195 expect(request.headers['Content-Type'], isNull); |
| 272 }); | 196 }); |
| 273 | 197 |
| 274 test('name is case insensitive', () { | 198 test('name is case insensitive', () { |
| 275 var request = new http.Request('POST', dummyUrl); | 199 var request = new http.Request('POST', dummyUrl); |
| 276 request.headers['CoNtEnT-tYpE'] = 'application/json'; | 200 request.headers['CoNtEnT-tYpE'] = 'application/json'; |
| 277 expect(request.headers, | 201 expect(request.headers, |
| 278 containsPair('content-type', 'application/json')); | 202 containsPair('content-type', 'application/json')); |
| 279 }); | 203 }); |
| 280 | 204 |
| 281 test('is set to application/x-www-form-urlencoded with charset utf-8 if ' | 205 test('is set to application/x-www-form-urlencoded with charset utf-8 if ' |
| 282 'bodyFields is set', () { | 206 'bodyFields is set', () { |
| 283 var request = new http.Request('POST', dummyUrl); | 207 var request = new http.Request('POST', dummyUrl); |
| 284 request.bodyFields = {'hello': 'world'}; | 208 request.bodyFields = {'hello': 'world'}; |
| 285 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 209 expect(request.headers['Content-Type'], |
| 286 equals('application/x-www-form-urlencoded; charset=utf-8')); | 210 equals('application/x-www-form-urlencoded; charset=utf-8')); |
| 287 }); | 211 }); |
| 288 | 212 |
| 289 test('is set to application/x-www-form-urlencoded with the given charset ' | 213 test('is set to application/x-www-form-urlencoded with the given charset ' |
| 290 'if bodyFields and encoding are set', () { | 214 'if bodyFields and encoding are set', () { |
| 291 var request = new http.Request('POST', dummyUrl); | 215 var request = new http.Request('POST', dummyUrl); |
| 292 request.encoding = LATIN1; | 216 request.encoding = LATIN1; |
| 293 request.bodyFields = {'hello': 'world'}; | 217 request.bodyFields = {'hello': 'world'}; |
| 294 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 218 expect(request.headers['Content-Type'], |
| 295 equals('application/x-www-form-urlencoded; charset=iso-8859-1')); | 219 equals('application/x-www-form-urlencoded; charset=iso-8859-1')); |
| 296 }); | 220 }); |
| 297 | 221 |
| 298 test('is set to text/plain and the given encoding if body and encoding are ' | 222 test('is set to text/plain and the given encoding if body and encoding are ' |
| 299 'both set', () { | 223 'both set', () { |
| 300 var request = new http.Request('POST', dummyUrl); | 224 var request = new http.Request('POST', dummyUrl); |
| 301 request.encoding = LATIN1; | 225 request.encoding = LATIN1; |
| 302 request.body = 'hello, world'; | 226 request.body = 'hello, world'; |
| 303 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 227 expect(request.headers['Content-Type'], |
| 304 equals('text/plain; charset=iso-8859-1')); | 228 equals('text/plain; charset=iso-8859-1')); |
| 305 }); | 229 }); |
| 306 | 230 |
| 307 test('is modified to include utf-8 if body is set', () { | 231 test('is modified to include utf-8 if body is set', () { |
| 308 var request = new http.Request('POST', dummyUrl); | 232 var request = new http.Request('POST', dummyUrl); |
| 309 request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json'; | 233 request.headers['Content-Type'] = 'application/json'; |
| 310 request.body = '{"hello": "world"}'; | 234 request.body = '{"hello": "world"}'; |
| 311 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 235 expect(request.headers['Content-Type'], |
| 312 equals('application/json; charset=utf-8')); | 236 equals('application/json; charset=utf-8')); |
| 313 }); | 237 }); |
| 314 | 238 |
| 315 test('is modified to include the given encoding if encoding is set', () { | 239 test('is modified to include the given encoding if encoding is set', () { |
| 316 var request = new http.Request('POST', dummyUrl); | 240 var request = new http.Request('POST', dummyUrl); |
| 317 request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json'; | 241 request.headers['Content-Type'] = 'application/json'; |
| 318 request.encoding = LATIN1; | 242 request.encoding = LATIN1; |
| 319 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 243 expect(request.headers['Content-Type'], |
| 320 equals('application/json; charset=iso-8859-1')); | 244 equals('application/json; charset=iso-8859-1')); |
| 321 }); | 245 }); |
| 322 | 246 |
| 323 test('has its charset overridden by an explicit encoding', () { | 247 test('has its charset overridden by an explicit encoding', () { |
| 324 var request = new http.Request('POST', dummyUrl); | 248 var request = new http.Request('POST', dummyUrl); |
| 325 request.headers[HttpHeaders.CONTENT_TYPE] = | 249 request.headers['Content-Type'] = |
| 326 'application/json; charset=utf-8'; | 250 'application/json; charset=utf-8'; |
| 327 request.encoding = LATIN1; | 251 request.encoding = LATIN1; |
| 328 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 252 expect(request.headers['Content-Type'], |
| 329 equals('application/json; charset=iso-8859-1')); | 253 equals('application/json; charset=iso-8859-1')); |
| 330 }); | 254 }); |
| 331 | 255 |
| 332 test("doen't have its charset overridden by setting bodyFields", () { | 256 test("doen't have its charset overridden by setting bodyFields", () { |
| 333 var request = new http.Request('POST', dummyUrl); | 257 var request = new http.Request('POST', dummyUrl); |
| 334 request.headers[HttpHeaders.CONTENT_TYPE] = | 258 request.headers['Content-Type'] = |
| 335 'application/x-www-form-urlencoded; charset=iso-8859-1'; | 259 'application/x-www-form-urlencoded; charset=iso-8859-1'; |
| 336 request.bodyFields = {'hello': 'world'}; | 260 request.bodyFields = {'hello': 'world'}; |
| 337 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 261 expect(request.headers['Content-Type'], |
| 338 equals('application/x-www-form-urlencoded; charset=iso-8859-1')); | 262 equals('application/x-www-form-urlencoded; charset=iso-8859-1')); |
| 339 }); | 263 }); |
| 340 | 264 |
| 341 test("doen't have its charset overridden by setting body", () { | 265 test("doen't have its charset overridden by setting body", () { |
| 342 var request = new http.Request('POST', dummyUrl); | 266 var request = new http.Request('POST', dummyUrl); |
| 343 request.headers[HttpHeaders.CONTENT_TYPE] = | 267 request.headers['Content-Type'] = |
| 344 'application/json; charset=iso-8859-1'; | 268 'application/json; charset=iso-8859-1'; |
| 345 request.body = '{"hello": "world"}'; | 269 request.body = '{"hello": "world"}'; |
| 346 expect(request.headers[HttpHeaders.CONTENT_TYPE], | 270 expect(request.headers['Content-Type'], |
| 347 equals('application/json; charset=iso-8859-1')); | 271 equals('application/json; charset=iso-8859-1')); |
| 348 }); | 272 }); |
| 349 }); | 273 }); |
| 350 | 274 |
| 351 group('#finalize', () { | 275 group('#finalize', () { |
| 352 test('returns a stream that emits the request body', () { | 276 test('returns a stream that emits the request body', () { |
| 353 var request = new http.Request('POST', dummyUrl); | 277 var request = new http.Request('POST', dummyUrl); |
| 354 request.body = "Hello, world!"; | 278 request.body = "Hello, world!"; |
| 355 expect(request.finalize().bytesToString(), | 279 expect(request.finalize().bytesToString(), |
| 356 completion(equals("Hello, world!"))); | 280 completion(equals("Hello, world!"))); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 }); | 347 }); |
| 424 | 348 |
| 425 group('#toString()', () { | 349 group('#toString()', () { |
| 426 test('includes the method and URL', () { | 350 test('includes the method and URL', () { |
| 427 var request = new http.Request('POST', dummyUrl); | 351 var request = new http.Request('POST', dummyUrl); |
| 428 expect(request.toString(), 'POST $dummyUrl'); | 352 expect(request.toString(), 'POST $dummyUrl'); |
| 429 }); | 353 }); |
| 430 }); | 354 }); |
| 431 } | 355 } |
| 432 | 356 |
| OLD | NEW |