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

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

Powered by Google App Engine
This is Rietveld 408576698