Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/url_request/url_request_http_job.h" | 5 #include "net/url_request/url_request_http_job.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 #include "net/url_request/http_user_agent_settings.h" | 60 #include "net/url_request/http_user_agent_settings.h" |
| 61 #include "net/url_request/url_request.h" | 61 #include "net/url_request/url_request.h" |
| 62 #include "net/url_request/url_request_context.h" | 62 #include "net/url_request/url_request_context.h" |
| 63 #include "net/url_request/url_request_error_job.h" | 63 #include "net/url_request/url_request_error_job.h" |
| 64 #include "net/url_request/url_request_job_factory.h" | 64 #include "net/url_request/url_request_job_factory.h" |
| 65 #include "net/url_request/url_request_redirect_job.h" | 65 #include "net/url_request/url_request_redirect_job.h" |
| 66 #include "net/url_request/url_request_throttler_manager.h" | 66 #include "net/url_request/url_request_throttler_manager.h" |
| 67 #include "net/websockets/websocket_handshake_stream_base.h" | 67 #include "net/websockets/websocket_handshake_stream_base.h" |
| 68 #include "url/origin.h" | 68 #include "url/origin.h" |
| 69 | 69 |
| 70 #if defined(OS_ANDROID) | |
| 71 #include "net/android/network_library.h" | |
| 72 #endif | |
| 73 | |
| 70 static const char kAvailDictionaryHeader[] = "Avail-Dictionary"; | 74 static const char kAvailDictionaryHeader[] = "Avail-Dictionary"; |
| 71 | 75 |
| 72 namespace { | 76 namespace { |
| 73 | 77 |
| 74 const char kDeflate[] = "deflate"; | 78 const char kDeflate[] = "deflate"; |
| 75 const char kGZip[] = "gzip"; | 79 const char kGZip[] = "gzip"; |
| 76 const char kSdch[] = "sdch"; | 80 const char kSdch[] = "sdch"; |
| 77 const char kXGZip[] = "x-gzip"; | 81 const char kXGZip[] = "x-gzip"; |
| 78 const char kBrotli[] = "br"; | 82 const char kBrotli[] = "br"; |
| 79 | 83 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 params->channel_id_service->GetUniqueID()) { | 165 params->channel_id_service->GetUniqueID()) { |
| 162 ephemerality = PERSISTENT_MATCH; | 166 ephemerality = PERSISTENT_MATCH; |
| 163 } else { | 167 } else { |
| 164 NOTREACHED(); | 168 NOTREACHED(); |
| 165 ephemerality = PERSISTENT_MISMATCH; | 169 ephemerality = PERSISTENT_MISMATCH; |
| 166 } | 170 } |
| 167 UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.StoreEphemerality", ephemerality, | 171 UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.StoreEphemerality", ephemerality, |
| 168 EPHEMERALITY_MAX); | 172 EPHEMERALITY_MAX); |
| 169 } | 173 } |
| 170 | 174 |
| 171 net::URLRequestRedirectJob* MaybeInternallyRedirect( | 175 // Checks for reasons not to return a URLRequestHttpJob, and if one is found, |
| 176 // returns a URLRequestRedirectJob or URLRequestErrorJob as necessary. | |
| 177 net::URLRequestJob* MaybeInternallyRedirectOrFail( | |
|
mmenke
2016/12/13 18:39:14
I think this does enough weird stuff that we shoul
mgersh
2016/12/13 19:01:58
Done.
| |
| 172 net::URLRequest* request, | 178 net::URLRequest* request, |
| 173 net::NetworkDelegate* network_delegate) { | 179 net::NetworkDelegate* network_delegate) { |
| 174 const GURL& url = request->url(); | 180 const GURL& url = request->url(); |
| 181 | |
| 182 // Neither check applies to https and wss requests | |
|
mmenke
2016/12/13 18:39:14
nit: End these comments with periods.
mgersh
2016/12/13 19:01:58
Done.
| |
| 175 if (url.SchemeIsCryptographic()) | 183 if (url.SchemeIsCryptographic()) |
| 176 return nullptr; | 184 return nullptr; |
| 177 | 185 |
| 186 // Check for HSTS upgrade | |
| 178 net::TransportSecurityState* hsts = | 187 net::TransportSecurityState* hsts = |
| 179 request->context()->transport_security_state(); | 188 request->context()->transport_security_state(); |
| 180 if (!hsts || !hsts->ShouldUpgradeToSSL(url.host())) | 189 if (hsts && hsts->ShouldUpgradeToSSL(url.host())) { |
| 181 return nullptr; | 190 GURL::Replacements replacements; |
| 191 replacements.SetSchemeStr(url.SchemeIs(url::kHttpScheme) ? url::kHttpsScheme | |
| 192 : url::kWssScheme); | |
| 193 return new net::URLRequestRedirectJob( | |
| 194 request, network_delegate, url.ReplaceComponents(replacements), | |
| 195 // Use status code 307 to preserve the method, so POST requests work. | |
| 196 net::URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "HSTS"); | |
| 197 } | |
| 182 | 198 |
| 183 GURL::Replacements replacements; | 199 #if defined(OS_ANDROID) |
| 184 replacements.SetSchemeStr(url.SchemeIs(url::kHttpScheme) ? url::kHttpsScheme | 200 // Check whether the app allows cleartext traffic to this host, and return |
| 185 : url::kWssScheme); | 201 // ERR_BLOCKED_BY_CLIENT if not |
| 186 return new net::URLRequestRedirectJob( | 202 if (request->context()->check_cleartext_permitted() && |
| 187 request, network_delegate, url.ReplaceComponents(replacements), | 203 !net::android::IsCleartextPermitted(url.host())) { |
| 188 // Use status code 307 to preserve the method, so POST requests work. | 204 return new net::URLRequestErrorJob(request, network_delegate, |
| 189 net::URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "HSTS"); | 205 net::ERR_BLOCKED_BY_CLIENT); |
| 206 } | |
| 207 #endif | |
| 208 | |
| 209 return nullptr; | |
| 190 } | 210 } |
| 191 | 211 |
| 192 } // namespace | 212 } // namespace |
| 193 | 213 |
| 194 namespace net { | 214 namespace net { |
| 195 | 215 |
| 196 // TODO(darin): make sure the port blocking code is not lost | 216 // TODO(darin): make sure the port blocking code is not lost |
| 197 // static | 217 // static |
| 198 URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request, | 218 URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request, |
| 199 NetworkDelegate* network_delegate, | 219 NetworkDelegate* network_delegate, |
| 200 const std::string& scheme) { | 220 const std::string& scheme) { |
| 201 DCHECK(scheme == "http" || scheme == "https" || scheme == "ws" || | 221 DCHECK(scheme == "http" || scheme == "https" || scheme == "ws" || |
| 202 scheme == "wss"); | 222 scheme == "wss"); |
| 203 | 223 |
| 204 if (!request->context()->http_transaction_factory()) { | 224 if (!request->context()->http_transaction_factory()) { |
| 205 NOTREACHED() << "requires a valid context"; | 225 NOTREACHED() << "requires a valid context"; |
| 206 return new URLRequestErrorJob( | 226 return new URLRequestErrorJob( |
| 207 request, network_delegate, ERR_INVALID_ARGUMENT); | 227 request, network_delegate, ERR_INVALID_ARGUMENT); |
| 208 } | 228 } |
| 209 | 229 |
| 210 URLRequestRedirectJob* redirect = | 230 URLRequestJob* redirect_or_error = |
| 211 MaybeInternallyRedirect(request, network_delegate); | 231 MaybeInternallyRedirectOrFail(request, network_delegate); |
| 212 if (redirect) | 232 if (redirect_or_error) |
| 213 return redirect; | 233 return redirect_or_error; |
| 214 | 234 |
| 215 return new URLRequestHttpJob(request, | 235 return new URLRequestHttpJob(request, |
| 216 network_delegate, | 236 network_delegate, |
| 217 request->context()->http_user_agent_settings()); | 237 request->context()->http_user_agent_settings()); |
| 218 } | 238 } |
| 219 | 239 |
| 220 URLRequestHttpJob::URLRequestHttpJob( | 240 URLRequestHttpJob::URLRequestHttpJob( |
| 221 URLRequest* request, | 241 URLRequest* request, |
| 222 NetworkDelegate* network_delegate, | 242 NetworkDelegate* network_delegate, |
| 223 const HttpUserAgentSettings* http_user_agent_settings) | 243 const HttpUserAgentSettings* http_user_agent_settings) |
| (...skipping 1317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1541 awaiting_callback_ = false; | 1561 awaiting_callback_ = false; |
| 1542 | 1562 |
| 1543 // Notify NetworkQualityEstimator. | 1563 // Notify NetworkQualityEstimator. |
| 1544 NetworkQualityEstimator* network_quality_estimator = | 1564 NetworkQualityEstimator* network_quality_estimator = |
| 1545 request()->context()->network_quality_estimator(); | 1565 request()->context()->network_quality_estimator(); |
| 1546 if (network_quality_estimator) | 1566 if (network_quality_estimator) |
| 1547 network_quality_estimator->NotifyURLRequestDestroyed(*request()); | 1567 network_quality_estimator->NotifyURLRequestDestroyed(*request()); |
| 1548 } | 1568 } |
| 1549 | 1569 |
| 1550 } // namespace net | 1570 } // namespace net |
| OLD | NEW |