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 |