OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <math.h> // ceil | 7 #include <math.h> // ceil |
8 #include <stdarg.h> | 8 #include <stdarg.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 11012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11023 const net::CompletionCallback& callback, | 11023 const net::CompletionCallback& callback, |
11024 std::unique_ptr<Request>* request) override { | 11024 std::unique_ptr<Request>* request) override { |
11025 resolver->reset(new ForwardingProxyResolver(resolver_)); | 11025 resolver->reset(new ForwardingProxyResolver(resolver_)); |
11026 return OK; | 11026 return OK; |
11027 } | 11027 } |
11028 | 11028 |
11029 private: | 11029 private: |
11030 ProxyResolver* resolver_; | 11030 ProxyResolver* resolver_; |
11031 }; | 11031 }; |
11032 | 11032 |
| 11033 // Test that proxy is resolved using the origin url, |
| 11034 // regardless of the alternative server. |
| 11035 TEST_F(HttpNetworkTransactionTest, UseOriginNotAlternativeForProxy) { |
| 11036 // Configure proxy to bypass www.example.org, which is the origin URL. |
| 11037 ProxyConfig proxy_config; |
| 11038 proxy_config.proxy_rules().ParseFromString("myproxy:70"); |
| 11039 proxy_config.proxy_rules().bypass_rules.AddRuleFromString("www.example.org"); |
| 11040 auto proxy_config_service = |
| 11041 base::MakeUnique<ProxyConfigServiceFixed>(proxy_config); |
| 11042 |
| 11043 CapturingProxyResolver capturing_proxy_resolver; |
| 11044 auto proxy_resolver_factory = base::MakeUnique<CapturingProxyResolverFactory>( |
| 11045 &capturing_proxy_resolver); |
| 11046 |
| 11047 TestNetLog net_log; |
| 11048 |
| 11049 session_deps_.proxy_service = base::MakeUnique<ProxyService>( |
| 11050 std::move(proxy_config_service), std::move(proxy_resolver_factory), |
| 11051 &net_log); |
| 11052 |
| 11053 session_deps_.net_log = &net_log; |
| 11054 |
| 11055 // Configure alternative service with a hostname that is not bypassed by the |
| 11056 // proxy. |
| 11057 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 11058 HttpServerProperties* http_server_properties = |
| 11059 session->http_server_properties(); |
| 11060 url::SchemeHostPort server("https", "www.example.org", 443); |
| 11061 HostPortPair alternative("www.example.com", 443); |
| 11062 AlternativeService alternative_service( |
| 11063 AlternateProtocolFromNextProto(kProtoHTTP2), alternative); |
| 11064 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 11065 http_server_properties->SetAlternativeService(server, alternative_service, |
| 11066 expiration); |
| 11067 |
| 11068 // Non-alternative job should hang. |
| 11069 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 11070 StaticSocketDataProvider hanging_alternate_protocol_socket(nullptr, 0, |
| 11071 nullptr, 0); |
| 11072 hanging_alternate_protocol_socket.set_connect_data(never_finishing_connect); |
| 11073 session_deps_.socket_factory->AddSocketDataProvider( |
| 11074 &hanging_alternate_protocol_socket); |
| 11075 |
| 11076 SSLSocketDataProvider ssl_http2(ASYNC, OK); |
| 11077 ssl_http2.next_proto = kProtoHTTP2; |
| 11078 ssl_http2.cert = |
| 11079 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 11080 ASSERT_TRUE(ssl_http2.cert); |
| 11081 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http2); |
| 11082 |
| 11083 HttpRequestInfo request; |
| 11084 request.method = "GET"; |
| 11085 request.url = GURL("https://www.example.org/"); |
| 11086 request.load_flags = 0; |
| 11087 |
| 11088 SpdySerializedFrame req( |
| 11089 spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST)); |
| 11090 |
| 11091 MockWrite spdy_writes[] = {CreateMockWrite(req, 0)}; |
| 11092 |
| 11093 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| 11094 SpdySerializedFrame data(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 11095 MockRead spdy_reads[] = { |
| 11096 CreateMockRead(resp, 1), CreateMockRead(data, 2), MockRead(ASYNC, 0, 3), |
| 11097 }; |
| 11098 |
| 11099 SequencedSocketData spdy_data(spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 11100 arraysize(spdy_writes)); |
| 11101 session_deps_.socket_factory->AddSocketDataProvider(&spdy_data); |
| 11102 |
| 11103 TestCompletionCallback callback; |
| 11104 |
| 11105 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
| 11106 |
| 11107 int rv = trans.Start(&request, callback.callback(), BoundNetLog()); |
| 11108 EXPECT_THAT(callback.GetResult(rv), IsOk()); |
| 11109 |
| 11110 const HttpResponseInfo* response = trans.GetResponseInfo(); |
| 11111 ASSERT_TRUE(response); |
| 11112 ASSERT_TRUE(response->headers); |
| 11113 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); |
| 11114 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 11115 EXPECT_TRUE(response->was_npn_negotiated); |
| 11116 |
| 11117 std::string response_data; |
| 11118 ASSERT_THAT(ReadTransaction(&trans, &response_data), IsOk()); |
| 11119 EXPECT_EQ("hello!", response_data); |
| 11120 |
| 11121 // Origin host bypasses proxy, no resolution should have happened. |
| 11122 ASSERT_TRUE(capturing_proxy_resolver.resolved().empty()); |
| 11123 } |
| 11124 |
11033 TEST_F(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { | 11125 TEST_F(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { |
11034 ProxyConfig proxy_config; | 11126 ProxyConfig proxy_config; |
11035 proxy_config.set_auto_detect(true); | 11127 proxy_config.set_auto_detect(true); |
11036 proxy_config.set_pac_url(GURL("http://fooproxyurl")); | 11128 proxy_config.set_pac_url(GURL("http://fooproxyurl")); |
11037 | 11129 |
11038 CapturingProxyResolver capturing_proxy_resolver; | 11130 CapturingProxyResolver capturing_proxy_resolver; |
11039 session_deps_.proxy_service.reset(new ProxyService( | 11131 session_deps_.proxy_service.reset(new ProxyService( |
11040 base::WrapUnique(new ProxyConfigServiceFixed(proxy_config)), | 11132 base::WrapUnique(new ProxyConfigServiceFixed(proxy_config)), |
11041 base::WrapUnique( | 11133 base::WrapUnique( |
11042 new CapturingProxyResolverFactory(&capturing_proxy_resolver)), | 11134 new CapturingProxyResolverFactory(&capturing_proxy_resolver)), |
(...skipping 4532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15575 base::RunLoop().RunUntilIdle(); | 15667 base::RunLoop().RunUntilIdle(); |
15576 | 15668 |
15577 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); | 15669 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); |
15578 HttpRequestHeaders headers; | 15670 HttpRequestHeaders headers; |
15579 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); | 15671 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); |
15580 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); | 15672 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); |
15581 } | 15673 } |
15582 #endif // !defined(OS_IOS) | 15674 #endif // !defined(OS_IOS) |
15583 | 15675 |
15584 } // namespace net | 15676 } // namespace net |
OLD | NEW |