OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include "base/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/trace_event.h" | 10 #include "base/trace_event.h" |
11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
12 #include "net/base/client_socket_factory.h" | 12 #include "net/base/client_socket_factory.h" |
| 13 #include "net/base/connection_type_histograms.h" |
13 #include "net/base/dns_resolution_observer.h" | 14 #include "net/base/dns_resolution_observer.h" |
14 #include "net/base/host_resolver.h" | 15 #include "net/base/host_resolver.h" |
15 #include "net/base/load_flags.h" | 16 #include "net/base/load_flags.h" |
16 #include "net/base/net_util.h" | 17 #include "net/base/net_util.h" |
17 #include "net/base/ssl_client_socket.h" | 18 #include "net/base/ssl_client_socket.h" |
18 #include "net/base/upload_data_stream.h" | 19 #include "net/base/upload_data_stream.h" |
19 #include "net/http/http_auth.h" | 20 #include "net/http/http_auth.h" |
20 #include "net/http/http_auth_handler.h" | 21 #include "net/http/http_auth_handler.h" |
21 #include "net/http/http_chunked_decoder.h" | 22 #include "net/http/http_chunked_decoder.h" |
22 #include "net/http/http_network_session.h" | 23 #include "net/http/http_network_session.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 read_buf_len_(0), | 56 read_buf_len_(0), |
56 next_state_(STATE_NONE) { | 57 next_state_(STATE_NONE) { |
57 #if defined(OS_WIN) | 58 #if defined(OS_WIN) |
58 // TODO(port): Port the SSLConfigService class to Linux and Mac OS X. | 59 // TODO(port): Port the SSLConfigService class to Linux and Mac OS X. |
59 session->ssl_config_service()->GetSSLConfig(&ssl_config_); | 60 session->ssl_config_service()->GetSSLConfig(&ssl_config_); |
60 #endif | 61 #endif |
61 } | 62 } |
62 | 63 |
63 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, | 64 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, |
64 CompletionCallback* callback) { | 65 CompletionCallback* callback) { |
| 66 UpdateConnectionTypeHistograms(CONNECTION_ANY); |
| 67 |
65 request_ = request_info; | 68 request_ = request_info; |
66 | 69 |
67 next_state_ = STATE_RESOLVE_PROXY; | 70 next_state_ = STATE_RESOLVE_PROXY; |
68 int rv = DoLoop(OK); | 71 int rv = DoLoop(OK); |
69 if (rv == ERR_IO_PENDING) | 72 if (rv == ERR_IO_PENDING) |
70 user_callback_ = callback; | 73 user_callback_ = callback; |
71 return rv; | 74 return rv; |
72 } | 75 } |
73 | 76 |
74 int HttpNetworkTransaction::RestartIgnoringLastError( | 77 int HttpNetworkTransaction::RestartIgnoringLastError( |
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 } else { | 1050 } else { |
1048 rv = error; | 1051 rv = error; |
1049 } | 1052 } |
1050 | 1053 |
1051 return rv; | 1054 return rv; |
1052 } | 1055 } |
1053 | 1056 |
1054 void HttpNetworkTransaction::AddAuthorizationHeader(HttpAuth::Target target) { | 1057 void HttpNetworkTransaction::AddAuthorizationHeader(HttpAuth::Target target) { |
1055 // If we have no authentication information, check if we can select | 1058 // If we have no authentication information, check if we can select |
1056 // a cache entry preemptively (based on the path). | 1059 // a cache entry preemptively (based on the path). |
1057 if(!HaveAuth(target) && !SelectPreemptiveAuth(target)) | 1060 if (!HaveAuth(target) && !SelectPreemptiveAuth(target)) |
1058 return; | 1061 return; |
1059 | 1062 |
1060 DCHECK(HaveAuth(target)); | 1063 DCHECK(HaveAuth(target)); |
1061 | 1064 |
1062 // Add a Authorization/Proxy-Authorization header line. | 1065 // Add a Authorization/Proxy-Authorization header line. |
1063 std::string credentials = auth_handler_[target]->GenerateCredentials( | 1066 std::string credentials = auth_handler_[target]->GenerateCredentials( |
1064 auth_identity_[target].username, | 1067 auth_identity_[target].username, |
1065 auth_identity_[target].password, | 1068 auth_identity_[target].password, |
1066 request_, | 1069 request_, |
1067 &proxy_info_); | 1070 &proxy_info_); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 // the preemptively used auth entry matches the realm of the subsequent | 1110 // the preemptively used auth entry matches the realm of the subsequent |
1108 // challenge, then we can invalidate the preemptively used entry. | 1111 // challenge, then we can invalidate the preemptively used entry. |
1109 // Otherwise as-is we may send the failed credentials one extra time. | 1112 // Otherwise as-is we may send the failed credentials one extra time. |
1110 if (auth_identity_[target].source == HttpAuth::IDENT_SRC_PATH_LOOKUP) | 1113 if (auth_identity_[target].source == HttpAuth::IDENT_SRC_PATH_LOOKUP) |
1111 return; | 1114 return; |
1112 | 1115 |
1113 // Clear the cache entry for the identity we just failed on. | 1116 // Clear the cache entry for the identity we just failed on. |
1114 // Note: we require the username/password to match before invalidating | 1117 // Note: we require the username/password to match before invalidating |
1115 // since the entry in the cache may be newer than what we used last time. | 1118 // since the entry in the cache may be newer than what we used last time. |
1116 session_->auth_cache()->Remove(AuthOrigin(target), | 1119 session_->auth_cache()->Remove(AuthOrigin(target), |
1117 auth_handler_[target]->realm(), | 1120 auth_handler_[target]->realm(), |
1118 auth_identity_[target].username, | 1121 auth_identity_[target].username, |
1119 auth_identity_[target].password); | 1122 auth_identity_[target].password); |
1120 } | 1123 } |
1121 | 1124 |
1122 bool HttpNetworkTransaction::SelectPreemptiveAuth(HttpAuth::Target target) { | 1125 bool HttpNetworkTransaction::SelectPreemptiveAuth(HttpAuth::Target target) { |
1123 DCHECK(!HaveAuth(target)); | 1126 DCHECK(!HaveAuth(target)); |
1124 | 1127 |
1125 // Don't do preemptive authorization if the URL contains a username/password, | 1128 // Don't do preemptive authorization if the URL contains a username/password, |
1126 // since we must first be challenged in order to use the URL's identity. | 1129 // since we must first be challenged in order to use the URL's identity. |
1127 if (request_->url.has_username()) | 1130 if (request_->url.has_username()) |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1258 if (target == HttpAuth::AUTH_PROXY) { | 1261 if (target == HttpAuth::AUTH_PROXY) { |
1259 auth_info->host = ASCIIToWide(proxy_info_.proxy_server()); | 1262 auth_info->host = ASCIIToWide(proxy_info_.proxy_server()); |
1260 } else { | 1263 } else { |
1261 DCHECK(target == HttpAuth::AUTH_SERVER); | 1264 DCHECK(target == HttpAuth::AUTH_SERVER); |
1262 auth_info->host = ASCIIToWide(request_->url.host()); | 1265 auth_info->host = ASCIIToWide(request_->url.host()); |
1263 } | 1266 } |
1264 response_.auth_challenge = auth_info; | 1267 response_.auth_challenge = auth_info; |
1265 } | 1268 } |
1266 | 1269 |
1267 } // namespace net | 1270 } // namespace net |
OLD | NEW |