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

Side by Side Diff: sdk/lib/io/http_impl.dart

Issue 11366169: Fix multiple onRequest callbacks during redirect. (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
« no previous file with comments | « no previous file | tests/standalone/io/http_redirect_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 class _HttpHeaders implements HttpHeaders { 5 class _HttpHeaders implements HttpHeaders {
6 _HttpHeaders() : _headers = new Map<String, List<String>>(); 6 _HttpHeaders() : _headers = new Map<String, List<String>>();
7 7
8 List<String> operator[](String name) { 8 List<String> operator[](String name) {
9 name = name.toLowerCase(); 9 name = name.toLowerCase();
10 return _headers[name]; 10 return _headers[name];
(...skipping 2311 matching lines...) Expand 10 before | Expand all | Expand 10 after
2322 } 2322 }
2323 2323
2324 HttpClientConnection _prepareHttpClientConnection( 2324 HttpClientConnection _prepareHttpClientConnection(
2325 String method, 2325 String method,
2326 Uri url, 2326 Uri url,
2327 [_HttpClientConnection connection]) { 2327 [_HttpClientConnection connection]) {
2328 2328
2329 void _establishConnection(String host, 2329 void _establishConnection(String host,
2330 int port, 2330 int port,
2331 _ProxyConfiguration proxyConfiguration, 2331 _ProxyConfiguration proxyConfiguration,
2332 int proxyIndex) { 2332 int proxyIndex,
2333 bool reusedConnection) {
2333 2334
2334 void _connectionOpened(_SocketConnection socketConn, 2335 void _connectionOpened(_SocketConnection socketConn,
2335 _HttpClientConnection connection, 2336 _HttpClientConnection connection,
2336 bool usingProxy) { 2337 bool usingProxy) {
2337 connection._usingProxy = usingProxy; 2338 connection._usingProxy = usingProxy;
2338 connection._connectionEstablished(socketConn); 2339 connection._connectionEstablished(socketConn);
2339 HttpClientRequest request = connection.open(method, url); 2340 HttpClientRequest request = connection.open(method, url);
2340 request.headers.host = host; 2341 request.headers.host = host;
2341 request.headers.port = port; 2342 request.headers.port = port;
2342 if (url.userInfo != null && !url.userInfo.isEmpty) { 2343 if (url.userInfo != null && !url.userInfo.isEmpty) {
2343 // If the URL contains user information use that for basic 2344 // If the URL contains user information use that for basic
2344 // authorization 2345 // authorization
2345 _UTF8Encoder encoder = new _UTF8Encoder(); 2346 _UTF8Encoder encoder = new _UTF8Encoder();
2346 String auth = 2347 String auth =
2347 CryptoUtils.bytesToBase64(encoder.encodeString(url.userInfo)); 2348 CryptoUtils.bytesToBase64(encoder.encodeString(url.userInfo));
2348 request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth"); 2349 request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
2349 } else { 2350 } else {
2350 // Look for credentials. 2351 // Look for credentials.
2351 _Credentials cr = _findCredentials(url); 2352 _Credentials cr = _findCredentials(url);
2352 if (cr != null) { 2353 if (cr != null) {
2353 cr.authorize(request); 2354 cr.authorize(request);
2354 } 2355 }
2355 } 2356 }
2356 if (connection._onRequest != null) { 2357 // A reused connection is indicating either redirect or retry
2358 // where the onRequest callback should not be issued again.
2359 if (connection._onRequest != null && !reusedConnection) {
2357 connection._onRequest(request); 2360 connection._onRequest(request);
2358 } else { 2361 } else {
2359 request.outputStream.close(); 2362 request.outputStream.close();
2360 } 2363 }
2361 } 2364 }
2362 2365
2363 assert(proxyIndex < proxyConfiguration.proxies.length); 2366 assert(proxyIndex < proxyConfiguration.proxies.length);
2364 2367
2365 // Determine the actual host to connect to. 2368 // Determine the actual host to connect to.
2366 String connectHost; 2369 String connectHost;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2415 if (socketConnections.isEmpty) _openSockets.remove(key); 2418 if (socketConnections.isEmpty) _openSockets.remove(key);
2416 if (_openSockets.isEmpty) _cancelEvictionTimer(); 2419 if (_openSockets.isEmpty) _cancelEvictionTimer();
2417 } 2420 }
2418 } 2421 }
2419 2422
2420 // Find the TCP host and port. 2423 // Find the TCP host and port.
2421 String host = url.domain; 2424 String host = url.domain;
2422 int port = url.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : url.port; 2425 int port = url.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : url.port;
2423 2426
2424 // Create a new connection object if we are not re-using an existing one. 2427 // Create a new connection object if we are not re-using an existing one.
2428 var reusedConnection = false;
2425 if (connection == null) { 2429 if (connection == null) {
2426 connection = new _HttpClientConnection(this); 2430 connection = new _HttpClientConnection(this);
2431 } else {
2432 reusedConnection = true;
2427 } 2433 }
2428 connection.onDetach = () => _activeSockets.remove(connection._socketConn); 2434 connection.onDetach = () => _activeSockets.remove(connection._socketConn);
2429 2435
2430 // Check to see if a proxy server should be used for this connection. 2436 // Check to see if a proxy server should be used for this connection.
2431 _ProxyConfiguration proxyConfiguration = const _ProxyConfiguration.direct(); 2437 _ProxyConfiguration proxyConfiguration = const _ProxyConfiguration.direct();
2432 if (_findProxy != null) { 2438 if (_findProxy != null) {
2433 // TODO(sgjesse): Keep a map of these as normally only a few 2439 // TODO(sgjesse): Keep a map of these as normally only a few
2434 // configuration strings will be used. 2440 // configuration strings will be used.
2435 proxyConfiguration = new _ProxyConfiguration(_findProxy(url)); 2441 proxyConfiguration = new _ProxyConfiguration(_findProxy(url));
2436 } 2442 }
2437 2443
2438 // Establish the connection starting with the first proxy configured. 2444 // Establish the connection starting with the first proxy configured.
2439 _establishConnection(host, port, proxyConfiguration, 0); 2445 _establishConnection(host, port, proxyConfiguration, 0, reusedConnection);
2440 2446
2441 return connection; 2447 return connection;
2442 } 2448 }
2443 2449
2444 void _returnSocketConnection(_SocketConnection socketConn) { 2450 void _returnSocketConnection(_SocketConnection socketConn) {
2445 // Mark socket as returned to unregister from the old connection. 2451 // Mark socket as returned to unregister from the old connection.
2446 socketConn._markReturned(); 2452 socketConn._markReturned();
2447 2453
2448 // If the HTTP client is beeing shutdown don't return the connection. 2454 // If the HTTP client is beeing shutdown don't return the connection.
2449 if (_shutdown) { 2455 if (_shutdown) {
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
2648 2654
2649 2655
2650 class _RedirectInfo implements RedirectInfo { 2656 class _RedirectInfo implements RedirectInfo {
2651 const _RedirectInfo(int this.statusCode, 2657 const _RedirectInfo(int this.statusCode,
2652 String this.method, 2658 String this.method,
2653 Uri this.location); 2659 Uri this.location);
2654 final int statusCode; 2660 final int statusCode;
2655 final String method; 2661 final String method;
2656 final Uri location; 2662 final Uri location;
2657 } 2663 }
OLDNEW
« no previous file with comments | « no previous file | tests/standalone/io/http_redirect_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698