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 "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 TransportSecurityState* security_state = | 787 TransportSecurityState* security_state = |
788 request_->context()->transport_security_state(); | 788 request_->context()->transport_security_state(); |
789 const SSLInfo& ssl_info = response_info_->ssl_info; | 789 const SSLInfo& ssl_info = response_info_->ssl_info; |
790 | 790 |
791 // Only accept HSTS headers on HTTPS connections that have no | 791 // Only accept HSTS headers on HTTPS connections that have no |
792 // certificate errors. | 792 // certificate errors. |
793 if (!ssl_info.is_valid() || IsCertStatusError(ssl_info.cert_status) || | 793 if (!ssl_info.is_valid() || IsCertStatusError(ssl_info.cert_status) || |
794 !security_state) | 794 !security_state) |
795 return; | 795 return; |
796 | 796 |
| 797 // Don't accept HSTS headers when the hostname is an IP address. |
| 798 if (request_info_.url.HostIsIPAddress()) |
| 799 return; |
| 800 |
797 // http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec: | 801 // http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec: |
798 // | 802 // |
799 // If a UA receives more than one STS header field in a HTTP response | 803 // If a UA receives more than one STS header field in a HTTP response |
800 // message over secure transport, then the UA MUST process only the | 804 // message over secure transport, then the UA MUST process only the |
801 // first such header field. | 805 // first such header field. |
802 HttpResponseHeaders* headers = GetResponseHeaders(); | 806 HttpResponseHeaders* headers = GetResponseHeaders(); |
803 std::string value; | 807 std::string value; |
804 if (headers->EnumerateHeader(NULL, "Strict-Transport-Security", &value)) | 808 if (headers->EnumerateHeader(NULL, "Strict-Transport-Security", &value)) |
805 security_state->AddHSTSHeader(request_info_.url.host(), value); | 809 security_state->AddHSTSHeader(request_info_.url.host(), value); |
806 } | 810 } |
807 | 811 |
808 void URLRequestHttpJob::ProcessPublicKeyPinsHeader() { | 812 void URLRequestHttpJob::ProcessPublicKeyPinsHeader() { |
809 DCHECK(response_info_); | 813 DCHECK(response_info_); |
810 TransportSecurityState* security_state = | 814 TransportSecurityState* security_state = |
811 request_->context()->transport_security_state(); | 815 request_->context()->transport_security_state(); |
812 const SSLInfo& ssl_info = response_info_->ssl_info; | 816 const SSLInfo& ssl_info = response_info_->ssl_info; |
813 | 817 |
814 // Only accept HPKP headers on HTTPS connections that have no | 818 // Only accept HPKP headers on HTTPS connections that have no |
815 // certificate errors. | 819 // certificate errors. |
816 if (!ssl_info.is_valid() || IsCertStatusError(ssl_info.cert_status) || | 820 if (!ssl_info.is_valid() || IsCertStatusError(ssl_info.cert_status) || |
817 !security_state) | 821 !security_state) |
818 return; | 822 return; |
819 | 823 |
| 824 // Don't accept HSTS headers when the hostname is an IP address. |
| 825 if (request_info_.url.HostIsIPAddress()) |
| 826 return; |
| 827 |
820 // http://tools.ietf.org/html/draft-ietf-websec-key-pinning: | 828 // http://tools.ietf.org/html/draft-ietf-websec-key-pinning: |
821 // | 829 // |
822 // If a UA receives more than one PKP header field in an HTTP | 830 // If a UA receives more than one PKP header field in an HTTP |
823 // response message over secure transport, then the UA MUST process | 831 // response message over secure transport, then the UA MUST process |
824 // only the first such header field. | 832 // only the first such header field. |
825 HttpResponseHeaders* headers = GetResponseHeaders(); | 833 HttpResponseHeaders* headers = GetResponseHeaders(); |
826 std::string value; | 834 std::string value; |
827 if (headers->EnumerateHeader(NULL, "Public-Key-Pins", &value)) | 835 if (headers->EnumerateHeader(NULL, "Public-Key-Pins", &value)) |
828 security_state->AddHPKPHeader(request_info_.url.host(), value, ssl_info); | 836 security_state->AddHPKPHeader(request_info_.url.host(), value, ssl_info); |
829 } | 837 } |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 return override_response_headers_.get() ? | 1495 return override_response_headers_.get() ? |
1488 override_response_headers_.get() : | 1496 override_response_headers_.get() : |
1489 transaction_->GetResponseInfo()->headers.get(); | 1497 transaction_->GetResponseInfo()->headers.get(); |
1490 } | 1498 } |
1491 | 1499 |
1492 void URLRequestHttpJob::NotifyURLRequestDestroyed() { | 1500 void URLRequestHttpJob::NotifyURLRequestDestroyed() { |
1493 awaiting_callback_ = false; | 1501 awaiting_callback_ = false; |
1494 } | 1502 } |
1495 | 1503 |
1496 } // namespace net | 1504 } // namespace net |
OLD | NEW |