| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/ftp/ftp_network_transaction.h" | 5 #include "net/ftp/ftp_network_transaction.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 MockRead(false, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 775 MockRead(false, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 776 MockRead(mock_data.c_str()), | 776 MockRead(mock_data.c_str()), |
| 777 }; | 777 }; |
| 778 StaticSocketDataProvider data_socket(data_reads, arraysize(data_reads), | 778 StaticSocketDataProvider data_socket(data_reads, arraysize(data_reads), |
| 779 NULL, 0); | 779 NULL, 0); |
| 780 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); | 780 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
| 781 mock_socket_factory_.AddSocketDataProvider(&data_socket); | 781 mock_socket_factory_.AddSocketDataProvider(&data_socket); |
| 782 FtpRequestInfo request_info = GetRequestInfo(request); | 782 FtpRequestInfo request_info = GetRequestInfo(request); |
| 783 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 783 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 784 ASSERT_EQ(ERR_IO_PENDING, | 784 ASSERT_EQ(ERR_IO_PENDING, |
| 785 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 785 transaction_.Start(&request_info, callback_.callback(), |
| 786 BoundNetLog())); |
| 786 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 787 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 787 ASSERT_EQ(expected_result, callback_.WaitForResult()); | 788 ASSERT_EQ(expected_result, callback_.WaitForResult()); |
| 788 if (expected_result == OK) { | 789 if (expected_result == OK) { |
| 789 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 790 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
| 790 memset(io_buffer->data(), 0, kBufferSize); | 791 memset(io_buffer->data(), 0, kBufferSize); |
| 791 ASSERT_EQ(ERR_IO_PENDING, | 792 ASSERT_EQ(ERR_IO_PENDING, |
| 792 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 793 transaction_.Read(io_buffer.get(), kBufferSize, |
| 794 callback_.callback())); |
| 793 ASSERT_EQ(static_cast<int>(mock_data.length()), | 795 ASSERT_EQ(static_cast<int>(mock_data.length()), |
| 794 callback_.WaitForResult()); | 796 callback_.WaitForResult()); |
| 795 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 797 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
| 796 | 798 |
| 797 // Do another Read to detect that the data socket is now closed. | 799 // Do another Read to detect that the data socket is now closed. |
| 798 int rv = transaction_.Read(io_buffer.get(), kBufferSize, &callback_); | 800 int rv = transaction_.Read(io_buffer.get(), kBufferSize, |
| 801 callback_.callback()); |
| 799 if (rv == ERR_IO_PENDING) { | 802 if (rv == ERR_IO_PENDING) { |
| 800 EXPECT_EQ(0, callback_.WaitForResult()); | 803 EXPECT_EQ(0, callback_.WaitForResult()); |
| 801 } else { | 804 } else { |
| 802 EXPECT_EQ(0, rv); | 805 EXPECT_EQ(0, rv); |
| 803 } | 806 } |
| 804 } | 807 } |
| 805 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); | 808 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); |
| 806 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 809 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 807 } | 810 } |
| 808 | 811 |
| 809 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, | 812 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, |
| 810 const char* request, | 813 const char* request, |
| 811 FtpSocketDataProvider::State state, | 814 FtpSocketDataProvider::State state, |
| 812 FtpSocketDataProvider::State next_state, | 815 FtpSocketDataProvider::State next_state, |
| 813 const char* response, | 816 const char* response, |
| 814 int expected_result) { | 817 int expected_result) { |
| 815 ctrl_socket->InjectFailure(state, next_state, response); | 818 ctrl_socket->InjectFailure(state, next_state, response); |
| 816 ExecuteTransaction(ctrl_socket, request, expected_result); | 819 ExecuteTransaction(ctrl_socket, request, expected_result); |
| 817 } | 820 } |
| 818 | 821 |
| 819 scoped_ptr<MockHostResolver> host_resolver_; | 822 scoped_ptr<MockHostResolver> host_resolver_; |
| 820 scoped_refptr<FtpNetworkSession> session_; | 823 scoped_refptr<FtpNetworkSession> session_; |
| 821 MockClientSocketFactory mock_socket_factory_; | 824 MockClientSocketFactory mock_socket_factory_; |
| 822 FtpNetworkTransaction transaction_; | 825 FtpNetworkTransaction transaction_; |
| 823 TestOldCompletionCallback callback_; | 826 TestCompletionCallback callback_; |
| 824 }; | 827 }; |
| 825 | 828 |
| 826 TEST_F(FtpNetworkTransactionTest, FailedLookup) { | 829 TEST_F(FtpNetworkTransactionTest, FailedLookup) { |
| 827 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 830 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
| 828 host_resolver_->rules()->AddSimulatedFailure("badhost"); | 831 host_resolver_->rules()->AddSimulatedFailure("badhost"); |
| 829 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 832 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 830 ASSERT_EQ(ERR_IO_PENDING, | 833 ASSERT_EQ(ERR_IO_PENDING, |
| 831 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 834 transaction_.Start(&request_info, callback_.callback(), |
| 835 BoundNetLog())); |
| 832 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 836 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
| 833 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 837 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 834 } | 838 } |
| 835 | 839 |
| 836 // Check that when determining the host, the square brackets decorating IPv6 | 840 // Check that when determining the host, the square brackets decorating IPv6 |
| 837 // literals in URLs are stripped. | 841 // literals in URLs are stripped. |
| 838 TEST_F(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { | 842 TEST_F(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { |
| 839 host_resolver_->rules()->AddSimulatedFailure("[::1]"); | 843 host_resolver_->rules()->AddSimulatedFailure("[::1]"); |
| 840 | 844 |
| 841 // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. | 845 // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 MockRead(mock_data.c_str()), | 1048 MockRead(mock_data.c_str()), |
| 1045 }; | 1049 }; |
| 1046 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), | 1050 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), |
| 1047 NULL, 0); | 1051 NULL, 0); |
| 1048 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 1052 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
| 1049 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 1053 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
| 1050 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1054 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 1051 | 1055 |
| 1052 // Start the transaction. | 1056 // Start the transaction. |
| 1053 ASSERT_EQ(ERR_IO_PENDING, | 1057 ASSERT_EQ(ERR_IO_PENDING, |
| 1054 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 1058 transaction_.Start(&request_info, callback_.callback(), |
| 1059 BoundNetLog())); |
| 1055 ASSERT_EQ(OK, callback_.WaitForResult()); | 1060 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 1056 | 1061 |
| 1057 // The transaction fires the callback when we can start reading data. That | 1062 // The transaction fires the callback when we can start reading data. That |
| 1058 // means that the data socket should be open. | 1063 // means that the data socket should be open. |
| 1059 MockTCPClientSocket* data_socket = | 1064 MockTCPClientSocket* data_socket = |
| 1060 mock_socket_factory_.GetMockTCPClientSocket(1); | 1065 mock_socket_factory_.GetMockTCPClientSocket(1); |
| 1061 ASSERT_TRUE(data_socket); | 1066 ASSERT_TRUE(data_socket); |
| 1062 ASSERT_TRUE(data_socket->IsConnected()); | 1067 ASSERT_TRUE(data_socket->IsConnected()); |
| 1063 | 1068 |
| 1064 // Even if the PASV response specified some other address, we connect | 1069 // Even if the PASV response specified some other address, we connect |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { | 1173 TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { |
| 1169 FtpSocketDataProvider ctrl_socket1; | 1174 FtpSocketDataProvider ctrl_socket1; |
| 1170 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1175 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
| 1171 FtpSocketDataProvider::PRE_QUIT, | 1176 FtpSocketDataProvider::PRE_QUIT, |
| 1172 "530 Login authentication failed\r\n"); | 1177 "530 Login authentication failed\r\n"); |
| 1173 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1178 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
| 1174 | 1179 |
| 1175 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1180 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 1176 | 1181 |
| 1177 ASSERT_EQ(ERR_IO_PENDING, | 1182 ASSERT_EQ(ERR_IO_PENDING, |
| 1178 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 1183 transaction_.Start(&request_info, callback_.callback(), |
| 1184 BoundNetLog())); |
| 1179 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1185 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
| 1180 | 1186 |
| 1181 MockRead ctrl_reads[] = { | 1187 MockRead ctrl_reads[] = { |
| 1182 MockRead("220 host TestFTPd\r\n"), | 1188 MockRead("220 host TestFTPd\r\n"), |
| 1183 MockRead("221 Goodbye!\r\n"), | 1189 MockRead("221 Goodbye!\r\n"), |
| 1184 MockRead(false, OK), | 1190 MockRead(false, OK), |
| 1185 }; | 1191 }; |
| 1186 MockWrite ctrl_writes[] = { | 1192 MockWrite ctrl_writes[] = { |
| 1187 MockWrite("QUIT\r\n"), | 1193 MockWrite("QUIT\r\n"), |
| 1188 }; | 1194 }; |
| 1189 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1195 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
| 1190 ctrl_writes, arraysize(ctrl_writes)); | 1196 ctrl_writes, arraysize(ctrl_writes)); |
| 1191 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1197 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
| 1192 ASSERT_EQ(ERR_IO_PENDING, | 1198 ASSERT_EQ(ERR_IO_PENDING, |
| 1193 transaction_.RestartWithAuth( | 1199 transaction_.RestartWithAuth( |
| 1194 AuthCredentials( | 1200 AuthCredentials( |
| 1195 ASCIIToUTF16("foo\nownz0red"), | 1201 ASCIIToUTF16("foo\nownz0red"), |
| 1196 ASCIIToUTF16("innocent")), | 1202 ASCIIToUTF16("innocent")), |
| 1197 &callback_)); | 1203 callback_.callback())); |
| 1198 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1204 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
| 1199 } | 1205 } |
| 1200 | 1206 |
| 1201 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { | 1207 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { |
| 1202 FtpSocketDataProvider ctrl_socket1; | 1208 FtpSocketDataProvider ctrl_socket1; |
| 1203 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1209 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
| 1204 FtpSocketDataProvider::PRE_QUIT, | 1210 FtpSocketDataProvider::PRE_QUIT, |
| 1205 "530 Login authentication failed\r\n"); | 1211 "530 Login authentication failed\r\n"); |
| 1206 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1212 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
| 1207 | 1213 |
| 1208 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1214 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 1209 | 1215 |
| 1210 ASSERT_EQ(ERR_IO_PENDING, | 1216 ASSERT_EQ(ERR_IO_PENDING, |
| 1211 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 1217 transaction_.Start(&request_info, callback_.callback(), |
| 1218 BoundNetLog())); |
| 1212 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1219 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
| 1213 | 1220 |
| 1214 MockRead ctrl_reads[] = { | 1221 MockRead ctrl_reads[] = { |
| 1215 MockRead("220 host TestFTPd\r\n"), | 1222 MockRead("220 host TestFTPd\r\n"), |
| 1216 MockRead("331 User okay, send password\r\n"), | 1223 MockRead("331 User okay, send password\r\n"), |
| 1217 MockRead("221 Goodbye!\r\n"), | 1224 MockRead("221 Goodbye!\r\n"), |
| 1218 MockRead(false, OK), | 1225 MockRead(false, OK), |
| 1219 }; | 1226 }; |
| 1220 MockWrite ctrl_writes[] = { | 1227 MockWrite ctrl_writes[] = { |
| 1221 MockWrite("USER innocent\r\n"), | 1228 MockWrite("USER innocent\r\n"), |
| 1222 MockWrite("QUIT\r\n"), | 1229 MockWrite("QUIT\r\n"), |
| 1223 }; | 1230 }; |
| 1224 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1231 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
| 1225 ctrl_writes, arraysize(ctrl_writes)); | 1232 ctrl_writes, arraysize(ctrl_writes)); |
| 1226 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1233 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
| 1227 ASSERT_EQ(ERR_IO_PENDING, | 1234 ASSERT_EQ(ERR_IO_PENDING, |
| 1228 transaction_.RestartWithAuth( | 1235 transaction_.RestartWithAuth( |
| 1229 AuthCredentials(ASCIIToUTF16("innocent"), | 1236 AuthCredentials(ASCIIToUTF16("innocent"), |
| 1230 ASCIIToUTF16("foo\nownz0red")), | 1237 ASCIIToUTF16("foo\nownz0red")), |
| 1231 &callback_)); | 1238 callback_.callback())); |
| 1232 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1239 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
| 1233 } | 1240 } |
| 1234 | 1241 |
| 1235 TEST_F(FtpNetworkTransactionTest, Escaping) { | 1242 TEST_F(FtpNetworkTransactionTest, Escaping) { |
| 1236 FtpSocketDataProviderEscaping ctrl_socket; | 1243 FtpSocketDataProviderEscaping ctrl_socket; |
| 1237 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", | 1244 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", |
| 1238 OK); | 1245 OK); |
| 1239 } | 1246 } |
| 1240 | 1247 |
| 1241 // Test for http://crbug.com/23794. | 1248 // Test for http://crbug.com/23794. |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1461 FtpSocketDataProviderFileDownload ctrl_socket; | 1468 FtpSocketDataProviderFileDownload ctrl_socket; |
| 1462 TransactionFailHelper(&ctrl_socket, | 1469 TransactionFailHelper(&ctrl_socket, |
| 1463 "ftp://host/file", | 1470 "ftp://host/file", |
| 1464 FtpSocketDataProvider::PRE_PWD, | 1471 FtpSocketDataProvider::PRE_PWD, |
| 1465 FtpSocketDataProvider::PRE_TYPE, | 1472 FtpSocketDataProvider::PRE_TYPE, |
| 1466 "257 \"\"\r\n", | 1473 "257 \"\"\r\n", |
| 1467 OK); | 1474 OK); |
| 1468 } | 1475 } |
| 1469 | 1476 |
| 1470 } // namespace net | 1477 } // namespace net |
| OLD | NEW |