@@ -17,13 +17,22 @@ class Server {
17
17
int nonceCount = 0 ; // Counter of use of current nonce.
18
18
var ha1;
19
19
20
- static Future <Server > start (String ? algorithm, String ? qop,
21
- {int ? nonceStaleAfter, bool useNextNonce = false }) {
20
+ static Future <Server > start (
21
+ String ? algorithm,
22
+ String ? qop, {
23
+ int ? nonceStaleAfter,
24
+ bool useNextNonce = false ,
25
+ }) {
26
+ asyncStart ();
22
27
return new Server ()._start (algorithm, qop, nonceStaleAfter, useNextNonce);
23
28
}
24
29
25
- Future <Server > _start (String ? serverAlgorithm, String ? serverQop,
26
- int ? nonceStaleAfter, bool useNextNonce) {
30
+ Future <Server > _start (
31
+ String ? serverAlgorithm,
32
+ String ? serverQop,
33
+ int ? nonceStaleAfter,
34
+ bool useNextNonce,
35
+ ) {
27
36
Set ncs = new Set ();
28
37
// Calculate ha1.
29
38
String realm = "test" ;
@@ -41,8 +50,10 @@ class Server {
41
50
if (request.uri.path == "/malformedAuthenticate" ) {
42
51
request.response.statusCode = HttpStatus .unauthorized;
43
52
// This authenticate header is malformed because of missing commas
44
- request.response.headers.set (HttpHeaders .wwwAuthenticateHeader,
45
- 'Digest realm="$realm " nonce="$nonce " domain="/digest/"' );
53
+ request.response.headers.set (
54
+ HttpHeaders .wwwAuthenticateHeader,
55
+ 'Digest realm="$realm " nonce="$nonce " domain="/digest/"' ,
56
+ );
46
57
request.response.close ();
47
58
return ;
48
59
}
@@ -66,11 +77,15 @@ class Server {
66
77
var response = request.response;
67
78
if (request.headers[HttpHeaders .authorizationHeader] != null ) {
68
79
Expect .equals (
69
- 1 , request.headers[HttpHeaders .authorizationHeader]! .length);
80
+ 1 ,
81
+ request.headers[HttpHeaders .authorizationHeader]! .length,
82
+ );
70
83
String authorization =
71
84
request.headers[HttpHeaders .authorizationHeader]! [0 ];
72
- HeaderValue header =
73
- HeaderValue .parse (authorization, parameterSeparator: "," );
85
+ HeaderValue header = HeaderValue .parse (
86
+ authorization,
87
+ parameterSeparator: "," ,
88
+ );
74
89
if (header.value.toLowerCase () == "basic" ) {
75
90
sendUnauthorizedResponse (response);
76
91
} else if (! useNextNonce && nonceCount == nonceStaleAfter) {
@@ -111,16 +126,20 @@ class Server {
111
126
digest = md5.convert ("$ha1 :${nonce }:$ha2 " .codeUnits);
112
127
} else {
113
128
digest = md5.convert (
114
- "$ha1 :${nonce }:${nc }:${cnonce }:${qop }:$ha2 " .codeUnits);
129
+ "$ha1 :${nonce }:${nc }:${cnonce }:${qop }:$ha2 " .codeUnits,
130
+ );
115
131
}
116
132
Expect .equals (
117
- hex.encode (digest.bytes), header.parameters["response" ]);
133
+ hex.encode (digest.bytes),
134
+ header.parameters["response" ],
135
+ );
118
136
119
137
successCount++ ;
120
138
nonceCount++ ;
121
139
122
140
// Add a bogus Authentication-Info for testing.
123
- var info = 'rspauth="77180d1ab3d6c9de084766977790f482", '
141
+ var info =
142
+ 'rspauth="77180d1ab3d6c9de084766977790f482", '
124
143
'cnonce="8f971178", '
125
144
'nc=000002c74, '
126
145
'qop=auth' ;
@@ -142,6 +161,7 @@ class Server {
142
161
143
162
void shutdown () {
144
163
server.close ();
164
+ asyncEnd ();
145
165
}
146
166
147
167
int get port => server.port;
@@ -152,27 +172,34 @@ void testNoCredentials(String? algorithm, String? qop) {
152
172
HttpClient client = new HttpClient ();
153
173
154
174
// Add digest credentials which does not match the path requested.
155
- client.addCredentials (Uri .parse ("http://127.0.0.1:${server .port }/xxx" ),
156
- "test" , new HttpClientDigestCredentials ("dart" , "password" ));
175
+ client.addCredentials (
176
+ Uri .parse ("http://127.0.0.1:${server .port }/xxx" ),
177
+ "test" ,
178
+ new HttpClientDigestCredentials ("dart" , "password" ),
179
+ );
157
180
158
181
// Add basic credentials for the path requested.
159
- client.addCredentials (Uri .parse ("http://127.0.0.1:${server .port }/digest" ),
160
- "test" , new HttpClientBasicCredentials ("dart" , "password" ));
182
+ client.addCredentials (
183
+ Uri .parse ("http://127.0.0.1:${server .port }/digest" ),
184
+ "test" ,
185
+ new HttpClientBasicCredentials ("dart" , "password" ),
186
+ );
161
187
162
188
Future makeRequest (Uri url) {
163
189
return client
164
190
.getUrl (url)
165
191
.then ((HttpClientRequest request) => request.close ())
166
192
.then ((HttpClientResponse response) {
167
- Expect .equals (HttpStatus .unauthorized, response.statusCode);
168
- return response.fold (null , (x, y) {});
169
- });
193
+ Expect .equals (HttpStatus .unauthorized, response.statusCode);
194
+ return response.fold (null , (x, y) {});
195
+ });
170
196
}
171
197
172
198
var futures = < Future > [];
173
199
for (int i = 0 ; i < 5 ; i++ ) {
174
200
futures.add (
175
- makeRequest (Uri .parse ("http://127.0.0.1:${server .port }/digest" )));
201
+ makeRequest (Uri .parse ("http://127.0.0.1:${server .port }/digest" )),
202
+ );
176
203
}
177
204
Future .wait (futures).then ((_) {
178
205
server.shutdown ();
@@ -190,14 +217,17 @@ void testCredentials(String? algorithm, String? qop) {
190
217
.getUrl (url)
191
218
.then ((HttpClientRequest request) => request.close ())
192
219
.then ((HttpClientResponse response) {
193
- Expect .equals (HttpStatus .ok, response.statusCode);
194
- Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
195
- return response.fold (null , (x, y) {});
196
- });
220
+ Expect .equals (HttpStatus .ok, response.statusCode);
221
+ Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
222
+ return response.fold (null , (x, y) {});
223
+ });
197
224
}
198
225
199
- client.addCredentials (Uri .parse ("http://127.0.0.1:${server .port }/digest" ),
200
- "test" , new HttpClientDigestCredentials ("dart" , "password" ));
226
+ client.addCredentials (
227
+ Uri .parse ("http://127.0.0.1:${server .port }/digest" ),
228
+ "test" ,
229
+ new HttpClientDigestCredentials ("dart" , "password" ),
230
+ );
201
231
202
232
var futures = < Future > [];
203
233
for (int i = 0 ; i < 2 ; i++ ) {
@@ -223,9 +253,10 @@ void testAuthenticateCallback(String? algorithm, String? qop) {
223
253
final completer = new Completer <bool >();
224
254
new Timer (const Duration (milliseconds: 10 ), () {
225
255
client.addCredentials (
226
- Uri .parse ("http://127.0.0.1:${server .port }/digest" ),
227
- "test" ,
228
- new HttpClientDigestCredentials ("dart" , "password" ));
256
+ Uri .parse ("http://127.0.0.1:${server .port }/digest" ),
257
+ "test" ,
258
+ new HttpClientDigestCredentials ("dart" , "password" ),
259
+ );
229
260
completer.complete (true );
230
261
});
231
262
return completer.future;
@@ -236,16 +267,17 @@ void testAuthenticateCallback(String? algorithm, String? qop) {
236
267
.getUrl (url)
237
268
.then ((HttpClientRequest request) => request.close ())
238
269
.then ((HttpClientResponse response) {
239
- Expect .equals (HttpStatus .ok, response.statusCode);
240
- Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
241
- return response.fold (null , (x, y) {});
242
- });
270
+ Expect .equals (HttpStatus .ok, response.statusCode);
271
+ Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
272
+ return response.fold (null , (x, y) {});
273
+ });
243
274
}
244
275
245
276
var futures = < Future > [];
246
277
for (int i = 0 ; i < 5 ; i++ ) {
247
278
futures.add (
248
- makeRequest (Uri .parse ("http://127.0.0.1:${server .port }/digest" )));
279
+ makeRequest (Uri .parse ("http://127.0.0.1:${server .port }/digest" )),
280
+ );
249
281
}
250
282
Future .wait (futures).then ((_) {
251
283
server.shutdown ();
@@ -263,10 +295,10 @@ void testStaleNonce() {
263
295
.getUrl (url)
264
296
.then ((HttpClientRequest request) => request.close ())
265
297
.then ((HttpClientResponse response) {
266
- Expect .equals (HttpStatus .ok, response.statusCode);
267
- Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
268
- return response.fold (null , (x, y) {});
269
- });
298
+ Expect .equals (HttpStatus .ok, response.statusCode);
299
+ Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
300
+ return response.fold (null , (x, y) {});
301
+ });
270
302
}
271
303
272
304
Uri uri = Uri .parse ("http://127.0.0.1:${server .port }/digest" );
@@ -278,28 +310,29 @@ void testStaleNonce() {
278
310
.then ((_) => makeRequest (uri))
279
311
.then ((_) => makeRequest (uri))
280
312
.then ((_) {
281
- Expect .equals (2 , server.unauthCount);
282
- Expect .equals (4 , server.successCount);
283
- server.shutdown ();
284
- client.close ();
285
- });
313
+ Expect .equals (2 , server.unauthCount);
314
+ Expect .equals (4 , server.successCount);
315
+ server.shutdown ();
316
+ client.close ();
317
+ });
286
318
});
287
319
}
288
320
289
321
void testNextNonce () {
290
- Server .start ("MD5" , "auth" , nonceStaleAfter: 2 , useNextNonce: true )
291
- .then ((server) {
322
+ Server .start ("MD5" , "auth" , nonceStaleAfter: 2 , useNextNonce: true ).then ((
323
+ server,
324
+ ) {
292
325
HttpClient client = new HttpClient ();
293
326
294
327
Future makeRequest (Uri url) {
295
328
return client
296
329
.getUrl (url)
297
330
.then ((HttpClientRequest request) => request.close ())
298
331
.then ((HttpClientResponse response) {
299
- Expect .equals (HttpStatus .ok, response.statusCode);
300
- Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
301
- return response.fold (null , (x, y) {});
302
- });
332
+ Expect .equals (HttpStatus .ok, response.statusCode);
333
+ Expect .equals (1 , response.headers["Authentication-Info" ]? .length);
334
+ return response.fold (null , (x, y) {});
335
+ });
303
336
}
304
337
305
338
Uri uri = Uri .parse ("http://127.0.0.1:${server .port }/digest" );
@@ -311,19 +344,20 @@ void testNextNonce() {
311
344
.then ((_) => makeRequest (uri))
312
345
.then ((_) => makeRequest (uri))
313
346
.then ((_) {
314
- Expect .equals (1 , server.unauthCount);
315
- Expect .equals (4 , server.successCount);
316
- server.shutdown ();
317
- client.close ();
318
- });
347
+ Expect .equals (1 , server.unauthCount);
348
+ Expect .equals (4 , server.successCount);
349
+ server.shutdown ();
350
+ client.close ();
351
+ });
319
352
});
320
353
}
321
354
322
355
void testMalformedAuthenticateHeaderNoAuthHandler () {
323
356
Server .start ('MD5' , 'auth' ).then ((server) async {
324
357
HttpClient client = new HttpClient ();
325
358
final uri = Uri .parse (
326
- 'http://${InternetAddress .loopbackIPv4 .address }:${server .port }/malformedAuthenticate' );
359
+ 'http://${InternetAddress .loopbackIPv4 .address }:${server .port }/malformedAuthenticate' ,
360
+ );
327
361
328
362
// Request should resolve normally if no authentication is configured
329
363
await client.getUrl (uri).then ((request) => request.close ());
@@ -337,13 +371,15 @@ void testMalformedAuthenticateHeaderWithAuthHandler() {
337
371
Server .start ('MD5' , 'auth' ).then ((server) async {
338
372
HttpClient client = new HttpClient ();
339
373
final uri = Uri .parse (
340
- 'http://${InternetAddress .loopbackIPv4 .address }:${server .port }/malformedAuthenticate' );
374
+ 'http://${InternetAddress .loopbackIPv4 .address }:${server .port }/malformedAuthenticate' ,
375
+ );
341
376
342
377
// Request should throw an exception if the authenticate handler is set
343
378
client.authenticate =
344
379
(Uri url, String scheme, String ? realm) async => false ;
345
380
await asyncExpectThrows <HttpException >(
346
- client.getUrl (uri).then ((request) => request.close ()));
381
+ client.getUrl (uri).then ((request) => request.close ()),
382
+ );
347
383
348
384
server.shutdown ();
349
385
client.close ();
@@ -354,13 +390,18 @@ void testMalformedAuthenticateHeaderWithCredentials() {
354
390
Server .start ('MD5' , 'auth' ).then ((server) async {
355
391
HttpClient client = new HttpClient ();
356
392
final uri = Uri .parse (
357
- 'http://${InternetAddress .loopbackIPv4 .address }:${server .port }/malformedAuthenticate' );
393
+ 'http://${InternetAddress .loopbackIPv4 .address }:${server .port }/malformedAuthenticate' ,
394
+ );
358
395
359
396
// Request should throw an exception if credentials have been added
360
397
client.addCredentials (
361
- uri, 'realm' , HttpClientDigestCredentials ('dart' , 'password' ));
398
+ uri,
399
+ 'realm' ,
400
+ HttpClientDigestCredentials ('dart' , 'password' ),
401
+ );
362
402
await asyncExpectThrows <HttpException >(
363
- client.getUrl (uri).then ((request) => request.close ()));
403
+ client.getUrl (uri).then ((request) => request.close ()),
404
+ );
364
405
365
406
server.shutdown ();
366
407
client.close ();
@@ -396,19 +437,25 @@ void testLocalServerDigest() {
396
437
.getUrl (Uri .parse ("http://127.0.0.1/digest/test" ))
397
438
.then ((HttpClientRequest request) => request.close ())
398
439
.then ((HttpClientResponse response) {
399
- count++ ;
400
- if (count % 100 == 0 ) print (count);
401
- Expect .equals (HttpStatus .ok, response.statusCode);
402
- return response.fold (null , (x, y) {});
403
- });
440
+ count++ ;
441
+ if (count % 100 == 0 ) print (count);
442
+ Expect .equals (HttpStatus .ok, response.statusCode);
443
+ return response.fold (null , (x, y) {});
444
+ });
404
445
}
405
446
406
- client.addCredentials (Uri .parse ("http://127.0.0.1/digest" ), "test" ,
407
- new HttpClientDigestCredentials ("dart" , "password" ));
447
+ client.addCredentials (
448
+ Uri .parse ("http://127.0.0.1/digest" ),
449
+ "test" ,
450
+ new HttpClientDigestCredentials ("dart" , "password" ),
451
+ );
408
452
409
453
client.authenticate = (url, scheme, realm) {
410
- client.addCredentials (Uri .parse ("http://127.0.0.1/digest" ), "test" ,
411
- new HttpClientDigestCredentials ("dart" , "password" ));
454
+ client.addCredentials (
455
+ Uri .parse ("http://127.0.0.1/digest" ),
456
+ "test" ,
457
+ new HttpClientDigestCredentials ("dart" , "password" ),
458
+ );
412
459
return new Future .value (true );
413
460
};
414
461
@@ -420,6 +467,8 @@ void testLocalServerDigest() {
420
467
}
421
468
422
469
main () {
470
+ asyncStart ();
471
+
423
472
testNoCredentials (null , null );
424
473
testNoCredentials ("MD5" , null );
425
474
testNoCredentials ("MD5" , "auth" );
@@ -439,4 +488,6 @@ main() {
439
488
// These teste are not normally run. They can be used for locally
440
489
// testing with another web server (e.g. Apache).
441
490
//testLocalServerDigest();
491
+
492
+ asyncEnd ();
442
493
}
0 commit comments