Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
| 10 #include <ws2tcpip.h> | 10 #include <ws2tcpip.h> |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 40 PRE_USER, | 40 PRE_USER, |
| 41 PRE_PASSWD, | 41 PRE_PASSWD, |
| 42 PRE_SYST, | 42 PRE_SYST, |
| 43 PRE_PWD, | 43 PRE_PWD, |
| 44 PRE_TYPE, | 44 PRE_TYPE, |
| 45 PRE_PASV, | 45 PRE_PASV, |
| 46 PRE_SIZE, | 46 PRE_SIZE, |
| 47 PRE_MDTM, | 47 PRE_MDTM, |
| 48 PRE_LIST, | 48 PRE_LIST, |
| 49 PRE_RETR, | 49 PRE_RETR, |
| 50 PRE_PASV2, | |
| 50 PRE_CWD, | 51 PRE_CWD, |
| 51 PRE_QUIT, | 52 PRE_QUIT, |
| 52 QUIT | 53 QUIT |
| 53 }; | 54 }; |
| 54 | 55 |
| 55 FtpMockControlSocket() | 56 FtpMockControlSocket() |
| 56 : failure_injection_state_(NONE), | 57 : failure_injection_state_(NONE), |
| 57 multiline_welcome_(false) { | 58 multiline_welcome_(false) { |
| 58 Init(); | 59 Init(); |
| 59 } | 60 } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 76 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); | 77 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
| 77 case PRE_PWD: | 78 case PRE_PWD: |
| 78 return Verify("PWD\r\n", data, PRE_TYPE, | 79 return Verify("PWD\r\n", data, PRE_TYPE, |
| 79 "257 \"/\" is your current location\r\n"); | 80 "257 \"/\" is your current location\r\n"); |
| 80 case PRE_TYPE: | 81 case PRE_TYPE: |
| 81 return Verify("TYPE I\r\n", data, PRE_PASV, | 82 return Verify("TYPE I\r\n", data, PRE_PASV, |
| 82 "200 TYPE is now 8-bit binary\r\n"); | 83 "200 TYPE is now 8-bit binary\r\n"); |
| 83 case PRE_PASV: | 84 case PRE_PASV: |
| 84 return Verify("PASV\r\n", data, PRE_SIZE, | 85 return Verify("PASV\r\n", data, PRE_SIZE, |
| 85 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 86 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
| 87 case PRE_PASV2: | |
| 88 // Parser should also accept format without parentheses. | |
| 89 return Verify("PASV\r\n", data, PRE_CWD, | |
| 90 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | |
| 86 case PRE_QUIT: | 91 case PRE_QUIT: |
| 87 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); | 92 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
| 88 default: | 93 default: |
| 94 NOTREACHED() << "State not handled " << state(); | |
| 89 return MockWriteResult(true, ERR_UNEXPECTED); | 95 return MockWriteResult(true, ERR_UNEXPECTED); |
| 90 } | 96 } |
| 91 } | 97 } |
| 92 | 98 |
| 93 void InjectFailure(State state, State next_state, const char* response) { | 99 void InjectFailure(State state, State next_state, const char* response) { |
| 94 DCHECK_EQ(NONE, failure_injection_state_); | 100 DCHECK_EQ(NONE, failure_injection_state_); |
| 95 DCHECK_NE(NONE, state); | 101 DCHECK_NE(NONE, state); |
| 96 DCHECK_NE(NONE, next_state); | 102 DCHECK_NE(NONE, next_state); |
| 97 DCHECK_NE(state, next_state); | 103 DCHECK_NE(state, next_state); |
| 98 failure_injection_state_ = state; | 104 failure_injection_state_ = state; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 if (InjectFault()) | 169 if (InjectFault()) |
| 164 return MockWriteResult(true, data.length()); | 170 return MockWriteResult(true, data.length()); |
| 165 switch (state()) { | 171 switch (state()) { |
| 166 case PRE_SIZE: | 172 case PRE_SIZE: |
| 167 return Verify("SIZE /\r\n", data, PRE_MDTM, | 173 return Verify("SIZE /\r\n", data, PRE_MDTM, |
| 168 "550 I can only retrieve regular files\r\n"); | 174 "550 I can only retrieve regular files\r\n"); |
| 169 case PRE_MDTM: | 175 case PRE_MDTM: |
| 170 return Verify("MDTM /\r\n", data, PRE_RETR, | 176 return Verify("MDTM /\r\n", data, PRE_RETR, |
| 171 "213 20070221112533\r\n"); | 177 "213 20070221112533\r\n"); |
| 172 case PRE_RETR: | 178 case PRE_RETR: |
| 173 return Verify("RETR /\r\n", data, PRE_CWD, | 179 return Verify("RETR /\r\n", data, PRE_PASV2, |
| 174 "550 Can't download directory\r\n"); | 180 "550 Can't download directory\r\n"); |
| 181 | |
| 175 case PRE_CWD: | 182 case PRE_CWD: |
| 176 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); | 183 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); |
| 177 case PRE_LIST: | 184 case PRE_LIST: |
| 178 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". | 185 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". |
| 179 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); | 186 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); |
| 180 default: | 187 default: |
| 181 return FtpMockControlSocket::OnWrite(data); | 188 return FtpMockControlSocket::OnWrite(data); |
| 182 } | 189 } |
| 183 } | 190 } |
| 184 | 191 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 200 case PRE_PWD: | 207 case PRE_PWD: |
| 201 return Verify("PWD\r\n", data, PRE_TYPE, | 208 return Verify("PWD\r\n", data, PRE_TYPE, |
| 202 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 209 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
| 203 case PRE_SIZE: | 210 case PRE_SIZE: |
| 204 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_MDTM, | 211 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_MDTM, |
| 205 "550 I can only retrieve regular files\r\n"); | 212 "550 I can only retrieve regular files\r\n"); |
| 206 case PRE_MDTM: | 213 case PRE_MDTM: |
| 207 return Verify("MDTM ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_RETR, | 214 return Verify("MDTM ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_RETR, |
| 208 "213 20070221112533\r\n"); | 215 "213 20070221112533\r\n"); |
| 209 case PRE_RETR: | 216 case PRE_RETR: |
| 210 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, | 217 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_PASV2, |
| 211 "550 Can't download directory\r\n"); | 218 "550 Can't download directory\r\n"); |
| 212 case PRE_CWD: | 219 case PRE_CWD: |
| 213 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, | 220 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, |
| 214 "200 OK\r\n"); | 221 "200 OK\r\n"); |
| 215 case PRE_LIST: | 222 case PRE_LIST: |
| 216 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 223 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
| 217 default: | 224 default: |
| 218 return FtpMockControlSocket::OnWrite(data); | 225 return FtpMockControlSocket::OnWrite(data); |
| 219 } | 226 } |
| 220 } | 227 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 238 case PRE_PWD: | 245 case PRE_PWD: |
| 239 return Verify("PWD\r\n", data, PRE_TYPE, | 246 return Verify("PWD\r\n", data, PRE_TYPE, |
| 240 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 247 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
| 241 case PRE_SIZE: | 248 case PRE_SIZE: |
| 242 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM, | 249 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM, |
| 243 "550 I can only retrieve regular files\r\n"); | 250 "550 I can only retrieve regular files\r\n"); |
| 244 case PRE_MDTM: | 251 case PRE_MDTM: |
| 245 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR, | 252 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR, |
| 246 "213 20070221112533\r\n"); | 253 "213 20070221112533\r\n"); |
| 247 case PRE_RETR: | 254 case PRE_RETR: |
| 248 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_CWD, | 255 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_PASV2, |
| 249 "550 Can't download directory\r\n"); | 256 "550 Can't download directory\r\n"); |
| 250 case PRE_CWD: | 257 case PRE_CWD: |
| 251 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, | 258 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, |
| 252 "200 OK\r\n"); | 259 "200 OK\r\n"); |
| 253 case PRE_LIST: | 260 case PRE_LIST: |
| 254 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 261 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
| 255 default: | 262 default: |
| 256 return FtpMockControlSocket::OnWrite(data); | 263 return FtpMockControlSocket::OnWrite(data); |
| 257 } | 264 } |
| 258 } | 265 } |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 510 return info; | 517 return info; |
| 511 } | 518 } |
| 512 | 519 |
| 513 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, | 520 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, |
| 514 const char* request, | 521 const char* request, |
| 515 int expected_result) { | 522 int expected_result) { |
| 516 std::string mock_data("mock-data"); | 523 std::string mock_data("mock-data"); |
| 517 MockRead data_reads[] = { | 524 MockRead data_reads[] = { |
| 518 MockRead(mock_data.c_str()), | 525 MockRead(mock_data.c_str()), |
| 519 }; | 526 }; |
| 520 StaticMockSocket data_socket(data_reads, NULL); | 527 // For compatibility with FileZilla, the transaction code will use two data |
| 528 // socket for directory requests. For more info see http://crbug.com/25316. | |
|
eroman
2009/10/21 16:57:52
nit: socket --> sockets
| |
| 529 StaticMockSocket data_socket1(data_reads, NULL); | |
| 530 StaticMockSocket data_socket2(data_reads, NULL); | |
| 521 mock_socket_factory_.AddMockSocket(ctrl_socket); | 531 mock_socket_factory_.AddMockSocket(ctrl_socket); |
| 522 mock_socket_factory_.AddMockSocket(&data_socket); | 532 mock_socket_factory_.AddMockSocket(&data_socket1); |
| 533 mock_socket_factory_.AddMockSocket(&data_socket2); | |
| 523 FtpRequestInfo request_info = GetRequestInfo(request); | 534 FtpRequestInfo request_info = GetRequestInfo(request); |
| 524 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 535 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 525 ASSERT_EQ(ERR_IO_PENDING, | 536 ASSERT_EQ(ERR_IO_PENDING, |
| 526 transaction_.Start(&request_info, &callback_, NULL)); | 537 transaction_.Start(&request_info, &callback_, NULL)); |
| 527 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 538 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 528 EXPECT_EQ(expected_result, callback_.WaitForResult()); | 539 EXPECT_EQ(expected_result, callback_.WaitForResult()); |
| 529 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); | 540 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); |
| 530 if (expected_result == OK) { | 541 if (expected_result == OK) { |
| 531 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 542 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
| 532 memset(io_buffer->data(), 0, kBufferSize); | 543 memset(io_buffer->data(), 0, kBufferSize); |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 911 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { | 922 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { |
| 912 FtpMockControlSocketDirectoryListing ctrl_socket; | 923 FtpMockControlSocketDirectoryListing ctrl_socket; |
| 913 TransactionFailHelper(&ctrl_socket, | 924 TransactionFailHelper(&ctrl_socket, |
| 914 "ftp://host", | 925 "ftp://host", |
| 915 FtpMockControlSocket::PRE_MDTM, | 926 FtpMockControlSocket::PRE_MDTM, |
| 916 FtpMockControlSocket::PRE_RETR, | 927 FtpMockControlSocket::PRE_RETR, |
| 917 "500 failed mdtm\r\n", | 928 "500 failed mdtm\r\n", |
| 918 OK); | 929 OK); |
| 919 } | 930 } |
| 920 | 931 |
| 932 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv2) { | |
| 933 FtpMockControlSocketDirectoryListing ctrl_socket; | |
| 934 TransactionFailHelper(&ctrl_socket, | |
| 935 "ftp://host", | |
| 936 FtpMockControlSocket::PRE_PASV2, | |
| 937 FtpMockControlSocket::PRE_QUIT, | |
| 938 "500 failed pasv2\r\n", | |
| 939 ERR_FAILED); | |
| 940 } | |
| 941 | |
| 921 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { | 942 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { |
| 922 FtpMockControlSocketDirectoryListing ctrl_socket; | 943 FtpMockControlSocketDirectoryListing ctrl_socket; |
| 923 TransactionFailHelper(&ctrl_socket, | 944 TransactionFailHelper(&ctrl_socket, |
| 924 "ftp://host", | 945 "ftp://host", |
| 925 FtpMockControlSocket::PRE_CWD, | 946 FtpMockControlSocket::PRE_CWD, |
| 926 FtpMockControlSocket::PRE_QUIT, | 947 FtpMockControlSocket::PRE_QUIT, |
| 927 "500 failed cwd\r\n", | 948 "500 failed cwd\r\n", |
| 928 ERR_FAILED); | 949 ERR_FAILED); |
| 929 } | 950 } |
| 930 | 951 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1026 FtpMockControlSocket::PRE_QUIT, | 1047 FtpMockControlSocket::PRE_QUIT, |
| 1027 "500 failed retr\r\n", | 1048 "500 failed retr\r\n", |
| 1028 ERR_FAILED); | 1049 ERR_FAILED); |
| 1029 } | 1050 } |
| 1030 | 1051 |
| 1031 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { | 1052 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { |
| 1032 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; | 1053 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; |
| 1033 TransactionFailHelper(&ctrl_socket, | 1054 TransactionFailHelper(&ctrl_socket, |
| 1034 "ftp://host/file", | 1055 "ftp://host/file", |
| 1035 FtpMockControlSocket::PRE_RETR, | 1056 FtpMockControlSocket::PRE_RETR, |
| 1036 FtpMockControlSocket::PRE_CWD, | 1057 FtpMockControlSocket::PRE_PASV2, |
| 1037 "550 cannot open file\r\n", | 1058 "550 cannot open file\r\n", |
| 1038 ERR_FILE_NOT_FOUND); | 1059 ERR_FILE_NOT_FOUND); |
| 1039 } | 1060 } |
| 1040 | 1061 |
| 1041 } // namespace net | 1062 } // namespace net |
| OLD | NEW |