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/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 <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 3707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3718 | 3718 |
3719 std::string response_data; | 3719 std::string response_data; |
3720 rv = ReadTransaction(trans.get(), &response_data); | 3720 rv = ReadTransaction(trans.get(), &response_data); |
3721 EXPECT_EQ(OK, rv); | 3721 EXPECT_EQ(OK, rv); |
3722 EXPECT_EQ(kExpectedResponseData[i], response_data); | 3722 EXPECT_EQ(kExpectedResponseData[i], response_data); |
3723 } | 3723 } |
3724 } | 3724 } |
3725 | 3725 |
3726 // Test the request-challenge-retry sequence for basic auth when there is | 3726 // Test the request-challenge-retry sequence for basic auth when there is |
3727 // an identity in the URL. The request should be sent as normal, but when | 3727 // an identity in the URL. The request should be sent as normal, but when |
3728 // it fails the identity from the URL is no longer used. | 3728 // it fails the identity from the URL is used to answer the challenge. |
3729 TEST_F(HttpNetworkTransactionSpdy3Test, IgnoreAuthIdentityInURL) { | 3729 TEST_F(HttpNetworkTransactionSpdy3Test, AuthIdentityInURL) { |
3730 HttpRequestInfo request; | 3730 HttpRequestInfo request; |
3731 request.method = "GET"; | 3731 request.method = "GET"; |
3732 request.url = GURL("http://foo:b@r@www.google.com/"); | 3732 request.url = GURL("http://foo:b@r@www.google.com/"); |
3733 request.load_flags = LOAD_NORMAL; | 3733 request.load_flags = LOAD_NORMAL; |
3734 | 3734 |
3735 SessionDependencies session_deps; | 3735 SessionDependencies session_deps; |
3736 scoped_ptr<HttpTransaction> trans( | 3736 scoped_ptr<HttpTransaction> trans( |
3737 new HttpNetworkTransaction(CreateSession(&session_deps))); | 3737 new HttpNetworkTransaction(CreateSession(&session_deps))); |
3738 | 3738 |
3739 // The password contains an escaped character -- for this test to pass it | 3739 // The password contains an escaped character -- for this test to pass it |
3740 // will need to be unescaped by HttpNetworkTransaction. | 3740 // will need to be unescaped by HttpNetworkTransaction. |
3741 EXPECT_EQ("b%40r", request.url.password()); | 3741 EXPECT_EQ("b%40r", request.url.password()); |
3742 | 3742 |
3743 MockWrite data_writes1[] = { | 3743 MockWrite data_writes1[] = { |
3744 MockWrite("GET / HTTP/1.1\r\n" | 3744 MockWrite("GET / HTTP/1.1\r\n" |
3745 "Host: www.google.com\r\n" | 3745 "Host: www.google.com\r\n" |
3746 "Connection: keep-alive\r\n\r\n"), | 3746 "Connection: keep-alive\r\n\r\n"), |
3747 }; | 3747 }; |
3748 | 3748 |
3749 MockRead data_reads1[] = { | 3749 MockRead data_reads1[] = { |
3750 MockRead("HTTP/1.0 401 Unauthorized\r\n"), | 3750 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
3751 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 3751 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
3752 MockRead("Content-Length: 10\r\n\r\n"), | 3752 MockRead("Content-Length: 10\r\n\r\n"), |
3753 MockRead(SYNCHRONOUS, ERR_FAILED), | 3753 MockRead(SYNCHRONOUS, ERR_FAILED), |
3754 }; | 3754 }; |
3755 | 3755 |
| 3756 // After the challenge above, the transaction will be restarted using the |
| 3757 // identity from the url (foo, b@r) to answer the challenge. |
| 3758 MockWrite data_writes2[] = { |
| 3759 MockWrite("GET / HTTP/1.1\r\n" |
| 3760 "Host: www.google.com\r\n" |
| 3761 "Connection: keep-alive\r\n" |
| 3762 "Authorization: Basic Zm9vOmJAcg==\r\n\r\n"), |
| 3763 }; |
| 3764 |
| 3765 MockRead data_reads2[] = { |
| 3766 MockRead("HTTP/1.0 200 OK\r\n"), |
| 3767 MockRead("Content-Length: 100\r\n\r\n"), |
| 3768 MockRead(SYNCHRONOUS, OK), |
| 3769 }; |
| 3770 |
3756 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 3771 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), |
3757 data_writes1, arraysize(data_writes1)); | 3772 data_writes1, arraysize(data_writes1)); |
| 3773 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), |
| 3774 data_writes2, arraysize(data_writes2)); |
3758 session_deps.socket_factory.AddSocketDataProvider(&data1); | 3775 session_deps.socket_factory.AddSocketDataProvider(&data1); |
| 3776 session_deps.socket_factory.AddSocketDataProvider(&data2); |
3759 | 3777 |
3760 TestCompletionCallback callback1; | 3778 TestCompletionCallback callback1; |
3761 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); | 3779 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
3762 EXPECT_EQ(ERR_IO_PENDING, rv); | 3780 EXPECT_EQ(ERR_IO_PENDING, rv); |
3763 rv = callback1.WaitForResult(); | 3781 rv = callback1.WaitForResult(); |
3764 EXPECT_EQ(OK, rv); | 3782 EXPECT_EQ(OK, rv); |
| 3783 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); |
| 3784 |
| 3785 TestCompletionCallback callback2; |
| 3786 rv = trans->RestartWithAuth(AuthCredentials(), callback2.callback()); |
| 3787 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 3788 rv = callback2.WaitForResult(); |
| 3789 EXPECT_EQ(OK, rv); |
3765 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); | 3790 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
3766 | 3791 |
| 3792 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 3793 ASSERT_TRUE(response != NULL); |
| 3794 |
| 3795 // There is no challenge info, since the identity in URL worked. |
| 3796 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 3797 |
| 3798 EXPECT_EQ(100, response->headers->GetContentLength()); |
| 3799 |
| 3800 // Empty the current queue. |
| 3801 MessageLoop::current()->RunAllPending(); |
| 3802 } |
| 3803 |
| 3804 // Test the request-challenge-retry sequence for basic auth when there is an |
| 3805 // incorrect identity in the URL. The identity from the URL should be used only |
| 3806 // once. |
| 3807 TEST_F(HttpNetworkTransactionSpdy3Test, WrongAuthIdentityInURL) { |
| 3808 HttpRequestInfo request; |
| 3809 request.method = "GET"; |
| 3810 // Note: the URL has a username:password in it. The password "baz" is |
| 3811 // wrong (should be "bar"). |
| 3812 request.url = GURL("http://foo:baz@www.google.com/"); |
| 3813 |
| 3814 request.load_flags = LOAD_NORMAL; |
| 3815 |
| 3816 SessionDependencies session_deps; |
| 3817 scoped_ptr<HttpTransaction> trans( |
| 3818 new HttpNetworkTransaction(CreateSession(&session_deps))); |
| 3819 |
| 3820 MockWrite data_writes1[] = { |
| 3821 MockWrite("GET / HTTP/1.1\r\n" |
| 3822 "Host: www.google.com\r\n" |
| 3823 "Connection: keep-alive\r\n\r\n"), |
| 3824 }; |
| 3825 |
| 3826 MockRead data_reads1[] = { |
| 3827 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
| 3828 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
| 3829 MockRead("Content-Length: 10\r\n\r\n"), |
| 3830 MockRead(SYNCHRONOUS, ERR_FAILED), |
| 3831 }; |
| 3832 |
| 3833 // After the challenge above, the transaction will be restarted using the |
| 3834 // identity from the url (foo, baz) to answer the challenge. |
| 3835 MockWrite data_writes2[] = { |
| 3836 MockWrite("GET / HTTP/1.1\r\n" |
| 3837 "Host: www.google.com\r\n" |
| 3838 "Connection: keep-alive\r\n" |
| 3839 "Authorization: Basic Zm9vOmJheg==\r\n\r\n"), |
| 3840 }; |
| 3841 |
| 3842 MockRead data_reads2[] = { |
| 3843 MockRead("HTTP/1.0 401 Unauthorized\r\n"), |
| 3844 MockRead("WWW-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
| 3845 MockRead("Content-Length: 10\r\n\r\n"), |
| 3846 MockRead(SYNCHRONOUS, ERR_FAILED), |
| 3847 }; |
| 3848 |
| 3849 // After the challenge above, the transaction will be restarted using the |
| 3850 // identity supplied by the user (foo, bar) to answer the challenge. |
| 3851 MockWrite data_writes3[] = { |
| 3852 MockWrite("GET / HTTP/1.1\r\n" |
| 3853 "Host: www.google.com\r\n" |
| 3854 "Connection: keep-alive\r\n" |
| 3855 "Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 3856 }; |
| 3857 |
| 3858 MockRead data_reads3[] = { |
| 3859 MockRead("HTTP/1.0 200 OK\r\n"), |
| 3860 MockRead("Content-Length: 100\r\n\r\n"), |
| 3861 MockRead(SYNCHRONOUS, OK), |
| 3862 }; |
| 3863 |
| 3864 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), |
| 3865 data_writes1, arraysize(data_writes1)); |
| 3866 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), |
| 3867 data_writes2, arraysize(data_writes2)); |
| 3868 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3), |
| 3869 data_writes3, arraysize(data_writes3)); |
| 3870 session_deps.socket_factory.AddSocketDataProvider(&data1); |
| 3871 session_deps.socket_factory.AddSocketDataProvider(&data2); |
| 3872 session_deps.socket_factory.AddSocketDataProvider(&data3); |
| 3873 |
| 3874 TestCompletionCallback callback1; |
| 3875 |
| 3876 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); |
| 3877 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 3878 |
| 3879 rv = callback1.WaitForResult(); |
| 3880 EXPECT_EQ(OK, rv); |
| 3881 |
| 3882 EXPECT_TRUE(trans->IsReadyToRestartForAuth()); |
| 3883 TestCompletionCallback callback2; |
| 3884 rv = trans->RestartWithAuth(AuthCredentials(), callback2.callback()); |
| 3885 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 3886 rv = callback2.WaitForResult(); |
| 3887 EXPECT_EQ(OK, rv); |
| 3888 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
| 3889 |
| 3890 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 3891 ASSERT_TRUE(response != NULL); |
| 3892 EXPECT_TRUE(CheckBasicServerAuth(response->auth_challenge.get())); |
| 3893 |
| 3894 TestCompletionCallback callback3; |
| 3895 rv = trans->RestartWithAuth( |
| 3896 AuthCredentials(kFoo, kBar), callback3.callback()); |
| 3897 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 3898 rv = callback3.WaitForResult(); |
| 3899 EXPECT_EQ(OK, rv); |
| 3900 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); |
| 3901 |
| 3902 response = trans->GetResponseInfo(); |
| 3903 ASSERT_TRUE(response != NULL); |
| 3904 |
| 3905 // There is no challenge info, since the identity worked. |
| 3906 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 3907 |
| 3908 EXPECT_EQ(100, response->headers->GetContentLength()); |
| 3909 |
3767 // Empty the current queue. | 3910 // Empty the current queue. |
3768 MessageLoop::current()->RunAllPending(); | 3911 MessageLoop::current()->RunAllPending(); |
3769 } | 3912 } |
3770 | 3913 |
3771 // Test that previously tried username/passwords for a realm get re-used. | 3914 // Test that previously tried username/passwords for a realm get re-used. |
3772 TEST_F(HttpNetworkTransactionSpdy3Test, BasicAuthCacheAndPreauth) { | 3915 TEST_F(HttpNetworkTransactionSpdy3Test, BasicAuthCacheAndPreauth) { |
3773 SessionDependencies session_deps; | 3916 SessionDependencies session_deps; |
3774 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 3917 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
3775 | 3918 |
3776 // Transaction 1: authenticate (foo, bar) on MyRealm1 | 3919 // Transaction 1: authenticate (foo, bar) on MyRealm1 |
(...skipping 5592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9369 StaticSocketDataProvider* data[] = { &data1, &data2 }; | 9512 StaticSocketDataProvider* data[] = { &data1, &data2 }; |
9370 | 9513 |
9371 SimpleGetHelperResult out = SimpleGetHelperForData(data, arraysize(data)); | 9514 SimpleGetHelperResult out = SimpleGetHelperForData(data, arraysize(data)); |
9372 | 9515 |
9373 EXPECT_EQ(OK, out.rv); | 9516 EXPECT_EQ(OK, out.rv); |
9374 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 9517 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
9375 EXPECT_EQ("hello world", out.response_data); | 9518 EXPECT_EQ("hello world", out.response_data); |
9376 } | 9519 } |
9377 | 9520 |
9378 } // namespace net | 9521 } // namespace net |
OLD | NEW |