Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: tests/standalone/io/http_auth_test.dart

Issue 11118021: Add support for authorization of HTTP client requests (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments from ajohnsen@ Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698