| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #import("dart:isolate"); |
| 6 #import("dart:crypto"); |
| 7 #import("dart:io"); |
| 8 #import("dart:uri"); |
| 9 #import("dart:utf"); |
| 10 |
| 11 class Server { |
| 12 HttpServer server; |
| 13 bool passwordChanged = false; |
| 14 |
| 15 Server() : server = new HttpServer(); |
| 16 |
| 17 void start() { |
| 18 server.listen("127.0.0.1", 0); |
| 19 server.defaultRequestHandler = |
| 20 (HttpRequest request, HttpResponse response) { |
| 21 String username; |
| 22 String password; |
| 23 if (request.path == "/") { |
| 24 username = "username"; |
| 25 password = "password"; |
| 26 } else { |
| 27 username = request.path.substring(1, 6); |
| 28 password = request.path.substring(1, 6); |
| 29 } |
| 30 if (passwordChanged) password = "${password}1"; |
| 31 if (request.headers[HttpHeaders.AUTHORIZATION] != null) { |
| 32 Expect.equals(1, request.headers[HttpHeaders.AUTHORIZATION].length); |
| 33 String authorization = |
| 34 request.headers[HttpHeaders.AUTHORIZATION][0]; |
| 35 List<String> tokens = authorization.split(" "); |
| 36 Expect.equals("Basic", tokens[0]); |
| 37 String auth = |
| 38 CryptoUtils.bytesToBase64(encodeUtf8("$username:$password")); |
| 39 if (passwordChanged && auth != tokens[1]) { |
| 40 response.statusCode = HttpStatus.UNAUTHORIZED; |
| 41 response.headers.set(HttpHeaders.WWW_AUTHENTICATE, |
| 42 "Basic, realm=realm"); |
| 43 } else { |
| 44 Expect.equals(auth, tokens[1]); |
| 45 } |
| 46 } else { |
| 47 response.statusCode = HttpStatus.UNAUTHORIZED; |
| 48 response.headers.set(HttpHeaders.WWW_AUTHENTICATE, |
| 49 "Basic, realm=realm"); |
| 50 } |
| 51 response.outputStream.close(); |
| 52 }; |
| 53 server.addRequestHandler( |
| 54 (HttpRequest request) => request.path == "/passwdchg", |
| 55 (HttpRequest request, HttpResponse response) { |
| 56 passwordChanged = true; |
| 57 response.outputStream.close(); |
| 58 }); |
| 59 } |
| 60 |
| 61 void shutdown() { |
| 62 server.close(); |
| 63 } |
| 64 |
| 65 int get port => server.port; |
| 66 } |
| 67 |
| 68 Server setupServer() { |
| 69 Server server = new Server(); |
| 70 server.start(); |
| 71 return server; |
| 72 } |
| 73 |
| 74 void testUrlUserInfo() { |
| 75 Server server = setupServer(); |
| 76 HttpClient client = new HttpClient(); |
| 77 |
| 78 HttpClientConnection conn = |
| 79 client.getUrl( |
| 80 new Uri.fromString( |
| 81 "http://username:password@127.0.0.1:${server.port}/")); |
| 82 conn.onResponse = (HttpClientResponse response) { |
| 83 server.shutdown(); |
| 84 client.shutdown(); |
| 85 }; |
| 86 } |
| 87 |
| 88 void testBasicNoCredentials() { |
| 89 Server server = setupServer(); |
| 90 HttpClient client = new HttpClient(); |
| 91 |
| 92 Future makeRequest(Uri url) { |
| 93 Completer completer = new Completer(); |
| 94 HttpClientConnection conn = client.getUrl(url); |
| 95 conn.onResponse = (HttpClientResponse response) { |
| 96 Expect.equals(HttpStatus.UNAUTHORIZED, response.statusCode); |
| 97 completer.complete(null); |
| 98 }; |
| 99 return completer.future; |
| 100 } |
| 101 |
| 102 var futures = []; |
| 103 for (int i = 0; i < 5; i++) { |
| 104 futures.add( |
| 105 makeRequest( |
| 106 new Uri.fromString("http://127.0.0.1:${server.port}/test$i"))); |
| 107 futures.add( |
| 108 makeRequest( |
| 109 new Uri.fromString("http://127.0.0.1:${server.port}/test$i/xxx"))); |
| 110 } |
| 111 Futures.wait(futures).then((_) { |
| 112 server.shutdown(); |
| 113 client.shutdown(); |
| 114 }); |
| 115 } |
| 116 |
| 117 void testBasicCredentials() { |
| 118 Server server = setupServer(); |
| 119 HttpClient client = new HttpClient(); |
| 120 |
| 121 Future makeRequest(Uri url) { |
| 122 Completer completer = new Completer(); |
| 123 HttpClientConnection conn = client.getUrl(url); |
| 124 conn.onResponse = (HttpClientResponse response) { |
| 125 Expect.equals(HttpStatus.OK, response.statusCode); |
| 126 completer.complete(null); |
| 127 }; |
| 128 return completer.future; |
| 129 } |
| 130 |
| 131 for (int i = 0; i < 5; i++) { |
| 132 client.addCredentials( |
| 133 new Uri.fromString("http://127.0.0.1:${server.port}/test$i"), |
| 134 "realm", |
| 135 new HttpClientBasicCredentials("test$i", "test$i")); |
| 136 } |
| 137 |
| 138 var futures = []; |
| 139 for (int i = 0; i < 5; i++) { |
| 140 futures.add( |
| 141 makeRequest( |
| 142 new Uri.fromString("http://127.0.0.1:${server.port}/test$i"))); |
| 143 futures.add( |
| 144 makeRequest( |
| 145 new Uri.fromString("http://127.0.0.1:${server.port}/test$i/xxx"))); |
| 146 } |
| 147 Futures.wait(futures).then((_) { |
| 148 server.shutdown(); |
| 149 client.shutdown(); |
| 150 }); |
| 151 } |
| 152 |
| 153 void testBasicAuthenticateCallback() { |
| 154 Server server = setupServer(); |
| 155 HttpClient client = new HttpClient(); |
| 156 bool passwordChanged = false; |
| 157 |
| 158 client.authenticate = (Uri url, String scheme, String realm) { |
| 159 Expect.equals("Basic", scheme); |
| 160 Expect.equals("realm", realm); |
| 161 String username = url.path.substring(1, 6); |
| 162 String password = url.path.substring(1, 6); |
| 163 if (passwordChanged) password = "${password}1"; |
| 164 Completer completer = new Completer(); |
| 165 new Timer(10, (_) { |
| 166 client.addCredentials( |
| 167 url, realm, new HttpClientBasicCredentials(username, password)); |
| 168 completer.complete(true); |
| 169 }); |
| 170 return completer.future; |
| 171 }; |
| 172 |
| 173 Future makeRequest(Uri url) { |
| 174 Completer completer = new Completer(); |
| 175 HttpClientConnection conn = client.getUrl(url); |
| 176 conn.onResponse = (HttpClientResponse response) { |
| 177 Expect.equals(HttpStatus.OK, response.statusCode); |
| 178 completer.complete(null); |
| 179 }; |
| 180 return completer.future; |
| 181 } |
| 182 |
| 183 List<Future> makeRequests() { |
| 184 var futures = []; |
| 185 for (int i = 0; i < 5; i++) { |
| 186 futures.add( |
| 187 makeRequest( |
| 188 new Uri.fromString("http://127.0.0.1:${server.port}/test$i"))); |
| 189 futures.add( |
| 190 makeRequest( |
| 191 new Uri.fromString( |
| 192 "http://127.0.0.1:${server.port}/test$i/xxx"))); |
| 193 } |
| 194 return futures; |
| 195 } |
| 196 |
| 197 Futures.wait(makeRequests()).then((_) { |
| 198 makeRequest( |
| 199 new Uri.fromString( |
| 200 "http://127.0.0.1:${server.port}/passwdchg")).then((_) { |
| 201 passwordChanged = true; |
| 202 Futures.wait(makeRequests()).then((_) { |
| 203 server.shutdown(); |
| 204 client.shutdown(); |
| 205 }); |
| 206 }); |
| 207 }); |
| 208 } |
| 209 |
| 210 void testLocalServerBasic() { |
| 211 HttpClient client = new HttpClient(); |
| 212 |
| 213 client.authenticate = (Uri url, String scheme, String realm) { |
| 214 client.addCredentials( |
| 215 new Uri.fromString("http://127.0.0.1/basic"), |
| 216 "test", |
| 217 new HttpClientBasicCredentials("test", "test")); |
| 218 return new Future.immediate(true); |
| 219 }; |
| 220 |
| 221 HttpClientConnection conn = |
| 222 client.getUrl(new Uri.fromString("http://127.0.0.1/basic/test")); |
| 223 conn.onResponse = (HttpClientResponse response) { |
| 224 Expect.equals(HttpStatus.OK, response.statusCode); |
| 225 response.inputStream.onData = () => response.inputStream.read(); |
| 226 response.inputStream.onClosed = () { |
| 227 client.shutdown(); |
| 228 }; |
| 229 }; |
| 230 } |
| 231 |
| 232 void testLocalServerDigest() { |
| 233 HttpClient client = new HttpClient(); |
| 234 |
| 235 client.authenticate = (Uri url, String scheme, String realm) { |
| 236 print("url: $url, scheme: $scheme, realm: $realm"); |
| 237 client.addCredentials( |
| 238 new Uri.fromString("http://127.0.0.1/digest"), |
| 239 "test", |
| 240 new HttpClientDigestCredentials("test", "test")); |
| 241 return new Future.immediate(true); |
| 242 }; |
| 243 |
| 244 HttpClientConnection conn = |
| 245 client.getUrl(new Uri.fromString("http://127.0.0.1/digest/test")); |
| 246 conn.onResponse = (HttpClientResponse response) { |
| 247 Expect.equals(HttpStatus.OK, response.statusCode); |
| 248 response.inputStream.onData = () => response.inputStream.read(); |
| 249 response.inputStream.onClosed = () { |
| 250 client.shutdown(); |
| 251 }; |
| 252 }; |
| 253 } |
| 254 |
| 255 main() { |
| 256 testUrlUserInfo(); |
| 257 testBasicNoCredentials(); |
| 258 testBasicCredentials(); |
| 259 testBasicAuthenticateCallback(); |
| 260 // These teste are not normally run. They can be used for locally |
| 261 // testing with another web server (e.g. Apache). |
| 262 //testLocalServerBasic(); |
| 263 //testLocalServerDigest(); |
| 264 } |
| OLD | NEW |