OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 1811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1822 const HttpResponseInfo* response = trans->GetResponseInfo(); | 1822 const HttpResponseInfo* response = trans->GetResponseInfo(); |
1823 ASSERT_TRUE(response != NULL); | 1823 ASSERT_TRUE(response != NULL); |
1824 ASSERT_TRUE(response->headers != NULL); | 1824 ASSERT_TRUE(response->headers != NULL); |
1825 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 1825 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
1826 | 1826 |
1827 std::string response_data; | 1827 std::string response_data; |
1828 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 1828 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
1829 EXPECT_EQ(net::kUploadData, response_data); | 1829 EXPECT_EQ(net::kUploadData, response_data); |
1830 } | 1830 } |
1831 | 1831 |
| 1832 // Test a SPDY CONNECT through an HTTPS Proxy to an HTTPS (non-SPDY) Server. |
| 1833 TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectHttps) { |
| 1834 // Configure against https proxy server "proxy:70". |
| 1835 SessionDependencies session_deps(CreateFixedProxyService("https://proxy:70")); |
| 1836 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 1837 session_deps.net_log = log.bound().net_log(); |
| 1838 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 1839 |
| 1840 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); |
| 1841 |
| 1842 HttpRequestInfo request; |
| 1843 request.method = "GET"; |
| 1844 request.url = GURL("https://www.google.com/"); |
| 1845 request.load_flags = 0; |
| 1846 |
| 1847 // CONNECT to www.google.com:443 via SPDY |
| 1848 scoped_ptr<spdy::SpdyFrame> connect(ConstructSpdyConnect(NULL, 0, 1)); |
| 1849 // fetch https://www.google.com/ via HTTP |
| 1850 |
| 1851 const char get[] = "GET / HTTP/1.1\r\n" |
| 1852 "Host: www.google.com\r\n" |
| 1853 "Connection: keep-alive\r\n\r\n"; |
| 1854 scoped_ptr<spdy::SpdyFrame> wrapped_get( |
| 1855 ConstructSpdyBodyFrame(1, get, strlen(get), false)); |
| 1856 MockWrite spdy_writes[] = { |
| 1857 CreateMockWrite(*connect, 1), |
| 1858 CreateMockWrite(*wrapped_get, 3) |
| 1859 }; |
| 1860 |
| 1861 scoped_ptr<spdy::SpdyFrame> conn_resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 1862 const char resp[] = "HTTP/1.1 200 OK\r\n" |
| 1863 "Content-Length: 10\r\n\r\n"; |
| 1864 |
| 1865 scoped_ptr<spdy::SpdyFrame> wrapped_get_resp( |
| 1866 ConstructSpdyBodyFrame(1, resp, strlen(resp), false)); |
| 1867 scoped_ptr<spdy::SpdyFrame> wrapped_body( |
| 1868 ConstructSpdyBodyFrame(1, "1234567890", 10, false)); |
| 1869 MockRead spdy_reads[] = { |
| 1870 CreateMockRead(*conn_resp, 2, true), |
| 1871 CreateMockRead(*wrapped_get_resp, 4, true), |
| 1872 CreateMockRead(*wrapped_body, 5, true), |
| 1873 CreateMockRead(*wrapped_body, 6, true), |
| 1874 MockRead(true, 0, 7), |
| 1875 }; |
| 1876 |
| 1877 scoped_refptr<OrderedSocketData> spdy_data( |
| 1878 new OrderedSocketData( |
| 1879 spdy_reads, arraysize(spdy_reads), |
| 1880 spdy_writes, arraysize(spdy_writes))); |
| 1881 session_deps.socket_factory.AddSocketDataProvider(spdy_data); |
| 1882 |
| 1883 SSLSocketDataProvider ssl(true, OK); |
| 1884 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 1885 ssl.next_proto = "spdy/2"; |
| 1886 ssl.was_npn_negotiated = true; |
| 1887 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
| 1888 SSLSocketDataProvider ssl2(true, OK); |
| 1889 ssl2.was_npn_negotiated = false; |
| 1890 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl2); |
| 1891 |
| 1892 TestCompletionCallback callback1; |
| 1893 |
| 1894 int rv = trans->Start(&request, &callback1, log.bound()); |
| 1895 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1896 |
| 1897 rv = callback1.WaitForResult(); |
| 1898 EXPECT_EQ(OK, rv); |
| 1899 |
| 1900 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 1901 ASSERT_TRUE(response != NULL); |
| 1902 ASSERT_TRUE(response->headers != NULL); |
| 1903 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 1904 |
| 1905 std::string response_data; |
| 1906 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 1907 EXPECT_EQ("1234567890", response_data); |
| 1908 } |
| 1909 |
| 1910 // Test a SPDY CONNECT through an HTTPS Proxy to a SPDY server. |
| 1911 TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectSpdy) { |
| 1912 // Configure against https proxy server "proxy:70". |
| 1913 SessionDependencies session_deps(CreateFixedProxyService("https://proxy:70")); |
| 1914 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 1915 session_deps.net_log = log.bound().net_log(); |
| 1916 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 1917 |
| 1918 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); |
| 1919 |
| 1920 HttpRequestInfo request; |
| 1921 request.method = "GET"; |
| 1922 request.url = GURL("https://www.google.com/"); |
| 1923 request.load_flags = 0; |
| 1924 |
| 1925 // CONNECT to www.google.com:443 via SPDY |
| 1926 scoped_ptr<spdy::SpdyFrame> connect(ConstructSpdyConnect(NULL, 0, 1)); |
| 1927 // fetch https://www.google.com/ via SPDY |
| 1928 const char* const kMyUrl = "https://www.google.com/"; |
| 1929 scoped_ptr<spdy::SpdyFrame> get(ConstructSpdyGet(kMyUrl, false, 1, LOWEST)); |
| 1930 scoped_ptr<spdy::SpdyFrame> wrapped_get(ConstructWrappedSpdyFrame(get, 1)); |
| 1931 MockWrite spdy_writes[] = { |
| 1932 CreateMockWrite(*connect, 1), |
| 1933 CreateMockWrite(*wrapped_get, 3) |
| 1934 }; |
| 1935 |
| 1936 scoped_ptr<spdy::SpdyFrame> conn_resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 1937 scoped_ptr<spdy::SpdyFrame> get_resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 1938 scoped_ptr<spdy::SpdyFrame> wrapped_get_resp( |
| 1939 ConstructWrappedSpdyFrame(get_resp, 1)); |
| 1940 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
| 1941 scoped_ptr<spdy::SpdyFrame> wrapped_body(ConstructWrappedSpdyFrame(body, 1)); |
| 1942 MockRead spdy_reads[] = { |
| 1943 CreateMockRead(*conn_resp, 2, true), |
| 1944 CreateMockRead(*wrapped_get_resp, 4, true), |
| 1945 CreateMockRead(*wrapped_body, 5, true), |
| 1946 MockRead(true, 0, 1), |
| 1947 }; |
| 1948 |
| 1949 scoped_refptr<OrderedSocketData> spdy_data( |
| 1950 new OrderedSocketData( |
| 1951 spdy_reads, arraysize(spdy_reads), |
| 1952 spdy_writes, arraysize(spdy_writes))); |
| 1953 session_deps.socket_factory.AddSocketDataProvider(spdy_data); |
| 1954 |
| 1955 SSLSocketDataProvider ssl(true, OK); |
| 1956 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 1957 ssl.next_proto = "spdy/2"; |
| 1958 ssl.was_npn_negotiated = true; |
| 1959 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
| 1960 SSLSocketDataProvider ssl2(true, OK); |
| 1961 ssl2.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 1962 ssl2.next_proto = "spdy/2"; |
| 1963 ssl2.was_npn_negotiated = true; |
| 1964 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl2); |
| 1965 |
| 1966 TestCompletionCallback callback1; |
| 1967 |
| 1968 int rv = trans->Start(&request, &callback1, log.bound()); |
| 1969 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1970 |
| 1971 rv = callback1.WaitForResult(); |
| 1972 EXPECT_EQ(OK, rv); |
| 1973 |
| 1974 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 1975 ASSERT_TRUE(response != NULL); |
| 1976 ASSERT_TRUE(response->headers != NULL); |
| 1977 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 1978 |
| 1979 std::string response_data; |
| 1980 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 1981 EXPECT_EQ(net::kUploadData, response_data); |
| 1982 } |
| 1983 |
| 1984 // Test a SPDY CONNECT failure through an HTTPS Proxy. |
| 1985 TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectFailure) { |
| 1986 // Configure against https proxy server "proxy:70". |
| 1987 SessionDependencies session_deps(CreateFixedProxyService("https://proxy:70")); |
| 1988 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 1989 session_deps.net_log = log.bound().net_log(); |
| 1990 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 1991 |
| 1992 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); |
| 1993 |
| 1994 HttpRequestInfo request; |
| 1995 request.method = "GET"; |
| 1996 request.url = GURL("https://www.google.com/"); |
| 1997 request.load_flags = 0; |
| 1998 |
| 1999 // CONNECT to www.google.com:443 via SPDY |
| 2000 scoped_ptr<spdy::SpdyFrame> connect(ConstructSpdyConnect(NULL, 0, 1)); |
| 2001 scoped_ptr<spdy::SpdyFrame> get(ConstructSpdyRstStream(1, spdy::CANCEL)); |
| 2002 |
| 2003 MockWrite spdy_writes[] = { |
| 2004 CreateMockWrite(*connect, 1), |
| 2005 CreateMockWrite(*get, 3), |
| 2006 }; |
| 2007 |
| 2008 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdySynReplyError(1)); |
| 2009 scoped_ptr<spdy::SpdyFrame> data(ConstructSpdyBodyFrame(1, true)); |
| 2010 MockRead spdy_reads[] = { |
| 2011 CreateMockRead(*resp, 2, true), |
| 2012 MockRead(true, 0, 4), |
| 2013 }; |
| 2014 |
| 2015 scoped_refptr<OrderedSocketData> spdy_data( |
| 2016 new OrderedSocketData( |
| 2017 spdy_reads, arraysize(spdy_reads), |
| 2018 spdy_writes, arraysize(spdy_writes))); |
| 2019 session_deps.socket_factory.AddSocketDataProvider(spdy_data); |
| 2020 |
| 2021 SSLSocketDataProvider ssl(true, OK); |
| 2022 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 2023 ssl.next_proto = "spdy/2"; |
| 2024 ssl.was_npn_negotiated = true; |
| 2025 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
| 2026 SSLSocketDataProvider ssl2(true, OK); |
| 2027 ssl2.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 2028 ssl2.next_proto = "spdy/2"; |
| 2029 ssl2.was_npn_negotiated = true; |
| 2030 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl2); |
| 2031 |
| 2032 TestCompletionCallback callback1; |
| 2033 |
| 2034 int rv = trans->Start(&request, &callback1, log.bound()); |
| 2035 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2036 |
| 2037 rv = callback1.WaitForResult(); |
| 2038 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
| 2039 |
| 2040 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 2041 ASSERT_TRUE(response == NULL); |
| 2042 } |
| 2043 |
1832 // Test the challenge-response-retry sequence through an HTTPS Proxy | 2044 // Test the challenge-response-retry sequence through an HTTPS Proxy |
1833 TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetry) { | 2045 TEST_F(HttpNetworkTransactionTest, HttpsProxyAuthRetry) { |
1834 // Configure against https proxy server "proxy:70". | 2046 // Configure against https proxy server "proxy:70". |
1835 SessionDependencies session_deps(CreateFixedProxyService("https://proxy:70")); | 2047 SessionDependencies session_deps(CreateFixedProxyService("https://proxy:70")); |
1836 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 2048 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
1837 session_deps.net_log = log.bound().net_log(); | 2049 session_deps.net_log = log.bound().net_log(); |
1838 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 2050 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
1839 | 2051 |
1840 HttpRequestInfo request; | 2052 HttpRequestInfo request; |
1841 request.method = "GET"; | 2053 request.method = "GET"; |
(...skipping 5613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7455 std::string response_data; | 7667 std::string response_data; |
7456 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 7668 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
7457 EXPECT_EQ("hello world", response_data); | 7669 EXPECT_EQ("hello world", response_data); |
7458 | 7670 |
7459 HttpStreamFactory::set_next_protos(""); | 7671 HttpStreamFactory::set_next_protos(""); |
7460 HttpStreamFactory::set_use_alternate_protocols(false); | 7672 HttpStreamFactory::set_use_alternate_protocols(false); |
7461 HttpStreamFactory::set_create_new_spdy_session_for_http(true); | 7673 HttpStreamFactory::set_create_new_spdy_session_for_http(true); |
7462 } | 7674 } |
7463 | 7675 |
7464 } // namespace net | 7676 } // namespace net |
OLD | NEW |