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

Side by Side Diff: net/url_request/url_request_http_job.cc

Issue 193067: Strict transport security: come out from behind the flag. (Closed)
Patch Set: Created 11 years, 3 months 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
« no previous file with comments | « base/base_switches.cc ('k') | no next file » | 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) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2009 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 "base/base_switches.h" 7 #include "base/base_switches.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 28 matching lines...) Expand all
39 int port = request->url().IntPort(); 39 int port = request->url().IntPort();
40 if (!net::IsPortAllowedByDefault(port) && !net::IsPortAllowedByOverride(port)) 40 if (!net::IsPortAllowedByDefault(port) && !net::IsPortAllowedByOverride(port))
41 return new URLRequestErrorJob(request, net::ERR_UNSAFE_PORT); 41 return new URLRequestErrorJob(request, net::ERR_UNSAFE_PORT);
42 42
43 if (!request->context() || 43 if (!request->context() ||
44 !request->context()->http_transaction_factory()) { 44 !request->context()->http_transaction_factory()) {
45 NOTREACHED() << "requires a valid context"; 45 NOTREACHED() << "requires a valid context";
46 return new URLRequestErrorJob(request, net::ERR_INVALID_ARGUMENT); 46 return new URLRequestErrorJob(request, net::ERR_INVALID_ARGUMENT);
47 } 47 }
48 48
49 // We cache the value of the switch because this code path is hit on every 49 if (scheme == "http" &&
50 // network request.
51 static const bool kForceHTTPS =
52 CommandLine::ForCurrentProcess()->HasSwitch(switches::kForceHTTPS);
53 if (kForceHTTPS && scheme == "http" &&
54 request->context()->strict_transport_security_state() && 50 request->context()->strict_transport_security_state() &&
55 request->context()->strict_transport_security_state()->IsEnabledForHost( 51 request->context()->strict_transport_security_state()->IsEnabledForHost(
56 request->url().host())) { 52 request->url().host())) {
abarth-chromium 2009/09/10 00:59:02 I'm slightly worried about the performance implica
57 DCHECK_EQ(request->url().scheme(), "http"); 53 DCHECK_EQ(request->url().scheme(), "http");
58 url_canon::Replacements<char> replacements; 54 url_canon::Replacements<char> replacements;
59 static const char kNewScheme[] = "https"; 55 static const char kNewScheme[] = "https";
60 replacements.SetScheme(kNewScheme, 56 replacements.SetScheme(kNewScheme,
61 url_parse::Component(0, strlen(kNewScheme))); 57 url_parse::Component(0, strlen(kNewScheme)));
62 GURL new_location = request->url().ReplaceComponents(replacements); 58 GURL new_location = request->url().ReplaceComponents(replacements);
63 return new URLRequestRedirectJob(request, new_location); 59 return new URLRequestRedirectJob(request, new_location);
64 } 60 }
65 61
66 return new URLRequestHttpJob(request); 62 return new URLRequestHttpJob(request);
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 SetStatus(URLRequestStatus()); 475 SetStatus(URLRequestStatus());
480 } 476 }
481 477
482 NotifyReadComplete(result); 478 NotifyReadComplete(result);
483 } 479 }
484 480
485 bool URLRequestHttpJob::ShouldTreatAsCertificateError(int result) { 481 bool URLRequestHttpJob::ShouldTreatAsCertificateError(int result) {
486 if (!net::IsCertificateError(result)) 482 if (!net::IsCertificateError(result))
487 return false; 483 return false;
488 484
489 // Hide the fancy processing behind a command line switch.
490 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kForceHTTPS))
491 return true;
492
493 // Check whether our context is using Strict-Transport-Security. 485 // Check whether our context is using Strict-Transport-Security.
494 if (!context_->strict_transport_security_state()) 486 if (!context_->strict_transport_security_state())
495 return true; 487 return true;
496 488
497 return !context_->strict_transport_security_state()->IsEnabledForHost( 489 return !context_->strict_transport_security_state()->IsEnabledForHost(
498 request_info_.url.host()); 490 request_info_.url.host());
499 } 491 }
500 492
501 void URLRequestHttpJob::NotifyHeadersComplete() { 493 void URLRequestHttpJob::NotifyHeadersComplete() {
502 DCHECK(!response_info_); 494 DCHECK(!response_info_);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 void* iter = NULL; 683 void* iter = NULL;
692 while (response_info_->headers->EnumerateHeader(&iter, name, &value)) 684 while (response_info_->headers->EnumerateHeader(&iter, name, &value))
693 if (request_->context()->InterceptCookie(request_, &value)) 685 if (request_->context()->InterceptCookie(request_, &value))
694 response_cookies_.push_back(value); 686 response_cookies_.push_back(value);
695 } 687 }
696 688
697 689
698 void URLRequestHttpJob::ProcessStrictTransportSecurityHeader() { 690 void URLRequestHttpJob::ProcessStrictTransportSecurityHeader() {
699 DCHECK(response_info_); 691 DCHECK(response_info_);
700 692
701 // Hide processing behind a command line flag.
702 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kForceHTTPS))
703 return;
704
705 // Only process Strict-Transport-Security from HTTPS responses. 693 // Only process Strict-Transport-Security from HTTPS responses.
706 if (request_info_.url.scheme() != "https") 694 if (request_info_.url.scheme() != "https")
707 return; 695 return;
708 696
709 // Only process Strict-Transport-Security from responses with valid certificat es. 697 // Only process Strict-Transport-Security from responses with valid certificat es.
710 if (response_info_->ssl_info.cert_status & net::CERT_STATUS_ALL_ERRORS) 698 if (response_info_->ssl_info.cert_status & net::CERT_STATUS_ALL_ERRORS)
711 return; 699 return;
712 700
713 URLRequestContext* ctx = request_->context(); 701 URLRequestContext* ctx = request_->context();
714 if (!ctx || !ctx->strict_transport_security_state()) 702 if (!ctx || !ctx->strict_transport_security_state())
715 return; 703 return;
716 704
717 std::string name = "Strict-Transport-Security"; 705 std::string name = "Strict-Transport-Security";
718 std::string value; 706 std::string value;
719 707
720 void* iter = NULL; 708 void* iter = NULL;
721 while (response_info_->headers->EnumerateHeader(&iter, name, &value)) { 709 while (response_info_->headers->EnumerateHeader(&iter, name, &value)) {
722 ctx->strict_transport_security_state()->DidReceiveHeader( 710 ctx->strict_transport_security_state()->DidReceiveHeader(
723 request_info_.url, value); 711 request_info_.url, value);
724 } 712 }
725 } 713 }
OLDNEW
« no previous file with comments | « base/base_switches.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698