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 #include "base/ref_counted.h" | 9 #include "base/ref_counted.h" |
10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 enum State { | 32 enum State { |
33 NONE, | 33 NONE, |
34 PRE_USER, | 34 PRE_USER, |
35 PRE_PASSWD, | 35 PRE_PASSWD, |
36 PRE_SYST, | 36 PRE_SYST, |
37 PRE_PWD, | 37 PRE_PWD, |
38 PRE_TYPE, | 38 PRE_TYPE, |
39 PRE_EPSV, | 39 PRE_EPSV, |
40 PRE_PASV, | 40 PRE_PASV, |
41 PRE_SIZE, | 41 PRE_SIZE, |
42 PRE_MDTM, | |
43 PRE_MLSD, | 42 PRE_MLSD, |
44 PRE_LIST, | 43 PRE_LIST, |
45 PRE_RETR, | 44 PRE_RETR, |
46 PRE_EPSV2, | |
47 PRE_PASV2, | |
48 PRE_CWD, | 45 PRE_CWD, |
49 PRE_QUIT, | 46 PRE_QUIT, |
50 PRE_NOPASV, | 47 PRE_NOPASV, |
51 QUIT | 48 QUIT |
52 }; | 49 }; |
53 | 50 |
54 FtpSocketDataProvider() | 51 FtpSocketDataProvider() |
55 : failure_injection_state_(NONE), | 52 : failure_injection_state_(NONE), |
56 multiline_welcome_(false), | 53 multiline_welcome_(false), |
57 data_type_('I') { | 54 data_type_('I') { |
(...skipping 18 matching lines...) Expand all Loading... |
76 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); | 73 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
77 case PRE_PWD: | 74 case PRE_PWD: |
78 return Verify("PWD\r\n", data, PRE_TYPE, | 75 return Verify("PWD\r\n", data, PRE_TYPE, |
79 "257 \"/\" is your current location\r\n"); | 76 "257 \"/\" is your current location\r\n"); |
80 case PRE_TYPE: | 77 case PRE_TYPE: |
81 return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, | 78 return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, |
82 PRE_EPSV, "200 TYPE set successfully\r\n"); | 79 PRE_EPSV, "200 TYPE set successfully\r\n"); |
83 case PRE_EPSV: | 80 case PRE_EPSV: |
84 return Verify("EPSV\r\n", data, PRE_SIZE, | 81 return Verify("EPSV\r\n", data, PRE_SIZE, |
85 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | 82 "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
86 case PRE_EPSV2: | |
87 return Verify("EPSV\r\n", data, PRE_CWD, | |
88 "227 Entering Extended Passive Mode (|||31744|)\r\n"); | |
89 case PRE_PASV: | |
90 return Verify("PASV\r\n", data, PRE_SIZE, | |
91 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | |
92 case PRE_PASV2: | |
93 // Parser should also accept format without parentheses. | |
94 return Verify("PASV\r\n", data, PRE_CWD, | |
95 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | |
96 case PRE_NOPASV: | 83 case PRE_NOPASV: |
97 return Verify("PASV\r\n", data, PRE_QUIT, | 84 return Verify("PASV\r\n", data, PRE_QUIT, |
98 "500 not going to happen\r\n"); | 85 "500 not going to happen\r\n"); |
99 case PRE_QUIT: | 86 case PRE_QUIT: |
100 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); | 87 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
101 default: | 88 default: |
102 NOTREACHED() << "State not handled " << state(); | 89 NOTREACHED() << "State not handled " << state(); |
103 return MockWriteResult(true, ERR_UNEXPECTED); | 90 return MockWriteResult(true, ERR_UNEXPECTED); |
104 } | 91 } |
105 } | 92 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { | 175 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { |
189 public: | 176 public: |
190 FtpSocketDataProviderDirectoryListing() { | 177 FtpSocketDataProviderDirectoryListing() { |
191 } | 178 } |
192 | 179 |
193 virtual MockWriteResult OnWrite(const std::string& data) { | 180 virtual MockWriteResult OnWrite(const std::string& data) { |
194 if (InjectFault()) | 181 if (InjectFault()) |
195 return MockWriteResult(true, data.length()); | 182 return MockWriteResult(true, data.length()); |
196 switch (state()) { | 183 switch (state()) { |
197 case PRE_SIZE: | 184 case PRE_SIZE: |
198 return Verify("SIZE /\r\n", data, PRE_MDTM, | 185 return Verify("SIZE /\r\n", data, PRE_CWD, |
199 "550 I can only retrieve regular files\r\n"); | 186 "550 I can only retrieve regular files\r\n"); |
200 case PRE_MDTM: | |
201 return Verify("MDTM /\r\n", data, PRE_RETR, | |
202 "213 20070221112533\r\n"); | |
203 case PRE_RETR: | |
204 return Verify("RETR /\r\n", data, PRE_EPSV2, | |
205 "550 Can't download directory\r\n"); | |
206 case PRE_CWD: | 187 case PRE_CWD: |
207 return Verify("CWD /\r\n", data, PRE_MLSD, "200 OK\r\n"); | 188 return Verify("CWD /\r\n", data, PRE_MLSD, "200 OK\r\n"); |
208 case PRE_MLSD: | 189 case PRE_MLSD: |
209 return Verify("MLSD\r\n", data, PRE_QUIT, | 190 return Verify("MLSD\r\n", data, PRE_QUIT, |
210 "150 Accepted data connection\r\n" | 191 "150 Accepted data connection\r\n" |
211 "226 MLSD complete\r\n"); | 192 "226 MLSD complete\r\n"); |
212 case PRE_LIST: | 193 case PRE_LIST: |
213 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); | 194 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); |
214 default: | 195 default: |
215 return FtpSocketDataProvider::OnWrite(data); | 196 return FtpSocketDataProvider::OnWrite(data); |
(...skipping 10 matching lines...) Expand all Loading... |
226 FtpSocketDataProviderDirectoryListingWithPasvFallback() { | 207 FtpSocketDataProviderDirectoryListingWithPasvFallback() { |
227 } | 208 } |
228 | 209 |
229 virtual MockWriteResult OnWrite(const std::string& data) { | 210 virtual MockWriteResult OnWrite(const std::string& data) { |
230 if (InjectFault()) | 211 if (InjectFault()) |
231 return MockWriteResult(true, data.length()); | 212 return MockWriteResult(true, data.length()); |
232 switch (state()) { | 213 switch (state()) { |
233 case PRE_EPSV: | 214 case PRE_EPSV: |
234 return Verify("EPSV\r\n", data, PRE_PASV, | 215 return Verify("EPSV\r\n", data, PRE_PASV, |
235 "500 no EPSV for you\r\n"); | 216 "500 no EPSV for you\r\n"); |
236 case PRE_RETR: | 217 case PRE_PASV: |
237 return Verify("RETR /\r\n", data, PRE_PASV2, | 218 return Verify("PASV\r\n", data, PRE_SIZE, |
238 "550 Can't download directory\r\n"); | 219 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
239 default: | 220 default: |
240 return FtpSocketDataProviderDirectoryListing::OnWrite(data); | 221 return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
241 } | 222 } |
242 } | 223 } |
243 | 224 |
244 private: | 225 private: |
245 DISALLOW_COPY_AND_ASSIGN( | 226 DISALLOW_COPY_AND_ASSIGN( |
246 FtpSocketDataProviderDirectoryListingWithPasvFallback); | 227 FtpSocketDataProviderDirectoryListingWithPasvFallback); |
247 }; | 228 }; |
248 | 229 |
249 class FtpSocketDataProviderDirectoryListingWithTypecode | |
250 : public FtpSocketDataProvider { | |
251 public: | |
252 FtpSocketDataProviderDirectoryListingWithTypecode() { | |
253 } | |
254 | |
255 virtual MockWriteResult OnWrite(const std::string& data) { | |
256 if (InjectFault()) | |
257 return MockWriteResult(true, data.length()); | |
258 switch (state()) { | |
259 case PRE_EPSV: | |
260 return Verify("EPSV\r\n", data, PRE_CWD, | |
261 "227 Entering Passive Mode (|||31744|)\r\n"); | |
262 case PRE_CWD: | |
263 return Verify("CWD /\r\n", data, PRE_MLSD, "200 OK\r\n"); | |
264 case PRE_MLSD: | |
265 return Verify("MLSD\r\n", data, PRE_QUIT, | |
266 "150 Accepted data connection\r\n" | |
267 "226 MLSD complete\r\n"); | |
268 case PRE_LIST: | |
269 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); | |
270 default: | |
271 return FtpSocketDataProvider::OnWrite(data); | |
272 } | |
273 } | |
274 | |
275 private: | |
276 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListingWithTypecode); | |
277 }; | |
278 | |
279 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { | 230 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { |
280 public: | 231 public: |
281 FtpSocketDataProviderVMSDirectoryListing() { | 232 FtpSocketDataProviderVMSDirectoryListing() { |
282 } | 233 } |
283 | 234 |
284 virtual MockWriteResult OnWrite(const std::string& data) { | 235 virtual MockWriteResult OnWrite(const std::string& data) { |
285 if (InjectFault()) | 236 if (InjectFault()) |
286 return MockWriteResult(true, data.length()); | 237 return MockWriteResult(true, data.length()); |
287 switch (state()) { | 238 switch (state()) { |
288 case PRE_SYST: | 239 case PRE_SYST: |
289 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 240 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
290 case PRE_PWD: | 241 case PRE_PWD: |
291 return Verify("PWD\r\n", data, PRE_TYPE, | 242 return Verify("PWD\r\n", data, PRE_TYPE, |
292 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 243 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
| 244 case PRE_EPSV: |
| 245 return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n"); |
| 246 case PRE_PASV: |
| 247 return Verify("PASV\r\n", data, PRE_SIZE, |
| 248 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
293 case PRE_SIZE: | 249 case PRE_SIZE: |
294 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_MDTM, | 250 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, |
295 "550 I can only retrieve regular files\r\n"); | 251 "550 I can only retrieve regular files\r\n"); |
296 case PRE_MDTM: | |
297 return Verify("MDTM ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_RETR, | |
298 "213 20070221112533\r\n"); | |
299 case PRE_RETR: | |
300 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_EPSV2, | |
301 "550 Can't download directory\r\n"); | |
302 case PRE_CWD: | 252 case PRE_CWD: |
303 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_MLSD, | 253 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_MLSD, |
304 "200 OK\r\n"); | 254 "200 OK\r\n"); |
305 case PRE_MLSD: | 255 case PRE_MLSD: |
306 return Verify("MLSD\r\n", data, PRE_LIST, "500 Invalid command\r\n"); | 256 return Verify("MLSD\r\n", data, PRE_LIST, "500 Invalid command\r\n"); |
307 case PRE_LIST: | 257 case PRE_LIST: |
308 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 258 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
309 default: | 259 default: |
310 return FtpSocketDataProvider::OnWrite(data); | 260 return FtpSocketDataProvider::OnWrite(data); |
311 } | 261 } |
(...skipping 14 matching lines...) Expand all Loading... |
326 return MockWriteResult(true, data.length()); | 276 return MockWriteResult(true, data.length()); |
327 switch (state()) { | 277 switch (state()) { |
328 case PRE_SYST: | 278 case PRE_SYST: |
329 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 279 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
330 case PRE_PWD: | 280 case PRE_PWD: |
331 return Verify("PWD\r\n", data, PRE_TYPE, | 281 return Verify("PWD\r\n", data, PRE_TYPE, |
332 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 282 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
333 case PRE_EPSV: | 283 case PRE_EPSV: |
334 return Verify("EPSV\r\n", data, PRE_PASV, | 284 return Verify("EPSV\r\n", data, PRE_PASV, |
335 "500 EPSV command unknown\r\n"); | 285 "500 EPSV command unknown\r\n"); |
| 286 case PRE_PASV: |
| 287 return Verify("PASV\r\n", data, PRE_SIZE, |
| 288 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
336 case PRE_SIZE: | 289 case PRE_SIZE: |
337 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM, | 290 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD, |
338 "550 I can only retrieve regular files\r\n"); | 291 "550 I can only retrieve regular files\r\n"); |
339 case PRE_MDTM: | |
340 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR, | |
341 "213 20070221112533\r\n"); | |
342 case PRE_RETR: | |
343 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_PASV2, | |
344 "550 Can't download directory\r\n"); | |
345 case PRE_CWD: | 292 case PRE_CWD: |
346 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_MLSD, | 293 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_MLSD, |
347 "200 OK\r\n"); | 294 "200 OK\r\n"); |
348 case PRE_MLSD: | 295 case PRE_MLSD: |
349 return Verify("MLSD\r\n", data, PRE_LIST, "500 Invalid command\r\n"); | 296 return Verify("MLSD\r\n", data, PRE_LIST, "500 Invalid command\r\n"); |
350 case PRE_LIST: | 297 case PRE_LIST: |
351 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 298 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
352 default: | 299 default: |
353 return FtpSocketDataProvider::OnWrite(data); | 300 return FtpSocketDataProvider::OnWrite(data); |
354 } | 301 } |
355 } | 302 } |
356 | 303 |
357 private: | 304 private: |
358 DISALLOW_COPY_AND_ASSIGN( | 305 DISALLOW_COPY_AND_ASSIGN( |
359 FtpSocketDataProviderVMSDirectoryListingRootDirectory); | 306 FtpSocketDataProviderVMSDirectoryListingRootDirectory); |
360 }; | 307 }; |
361 | 308 |
362 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { | 309 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { |
363 public: | 310 public: |
364 FtpSocketDataProviderFileDownload() { | 311 FtpSocketDataProviderFileDownload() { |
365 } | 312 } |
366 | 313 |
367 virtual MockWriteResult OnWrite(const std::string& data) { | 314 virtual MockWriteResult OnWrite(const std::string& data) { |
368 if (InjectFault()) | 315 if (InjectFault()) |
369 return MockWriteResult(true, data.length()); | 316 return MockWriteResult(true, data.length()); |
370 switch (state()) { | 317 switch (state()) { |
371 case PRE_SIZE: | 318 case PRE_SIZE: |
372 return Verify("SIZE /file\r\n", data, PRE_MDTM, | 319 return Verify("SIZE /file\r\n", data, PRE_RETR, |
373 "213 18\r\n"); | 320 "213 18\r\n"); |
374 case PRE_MDTM: | |
375 return Verify("MDTM /file\r\n", data, PRE_RETR, | |
376 "213 20070221112533\r\n"); | |
377 case PRE_RETR: | 321 case PRE_RETR: |
378 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); | 322 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
379 default: | 323 default: |
380 return FtpSocketDataProvider::OnWrite(data); | 324 return FtpSocketDataProvider::OnWrite(data); |
381 } | 325 } |
382 } | 326 } |
383 | 327 |
384 private: | 328 private: |
385 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); | 329 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); |
386 }; | 330 }; |
387 | 331 |
388 class FtpSocketDataProviderFileDownloadWithPasvFallback | 332 class FtpSocketDataProviderFileDownloadWithPasvFallback |
389 : public FtpSocketDataProviderFileDownload { | 333 : public FtpSocketDataProviderFileDownload { |
390 public: | 334 public: |
391 FtpSocketDataProviderFileDownloadWithPasvFallback() { | 335 FtpSocketDataProviderFileDownloadWithPasvFallback() { |
392 } | 336 } |
393 | 337 |
394 virtual MockWriteResult OnWrite(const std::string& data) { | 338 virtual MockWriteResult OnWrite(const std::string& data) { |
395 if (InjectFault()) | 339 if (InjectFault()) |
396 return MockWriteResult(true, data.length()); | 340 return MockWriteResult(true, data.length()); |
397 switch (state()) { | 341 switch (state()) { |
398 case PRE_EPSV: | 342 case PRE_EPSV: |
399 return Verify("EPSV\r\n", data, PRE_PASV, | 343 return Verify("EPSV\r\n", data, PRE_PASV, |
400 "500 No can do\r\n"); | 344 "500 No can do\r\n"); |
| 345 case PRE_PASV: |
| 346 return Verify("PASV\r\n", data, PRE_SIZE, |
| 347 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
401 default: | 348 default: |
402 return FtpSocketDataProviderFileDownload::OnWrite(data); | 349 return FtpSocketDataProviderFileDownload::OnWrite(data); |
403 } | 350 } |
404 } | 351 } |
405 | 352 |
406 private: | 353 private: |
407 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); | 354 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); |
408 }; | 355 }; |
409 | 356 |
410 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { | 357 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { |
411 public: | 358 public: |
412 FtpSocketDataProviderVMSFileDownload() { | 359 FtpSocketDataProviderVMSFileDownload() { |
413 } | 360 } |
414 | 361 |
415 virtual MockWriteResult OnWrite(const std::string& data) { | 362 virtual MockWriteResult OnWrite(const std::string& data) { |
416 if (InjectFault()) | 363 if (InjectFault()) |
417 return MockWriteResult(true, data.length()); | 364 return MockWriteResult(true, data.length()); |
418 switch (state()) { | 365 switch (state()) { |
419 case PRE_SYST: | 366 case PRE_SYST: |
420 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 367 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
421 case PRE_PWD: | 368 case PRE_PWD: |
422 return Verify("PWD\r\n", data, PRE_TYPE, | 369 return Verify("PWD\r\n", data, PRE_TYPE, |
423 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 370 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
| 371 case PRE_EPSV: |
| 372 return Verify("EPSV\r\n", data, PRE_PASV, |
| 373 "500 EPSV command unknown\r\n"); |
| 374 case PRE_PASV: |
| 375 return Verify("PASV\r\n", data, PRE_SIZE, |
| 376 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
424 case PRE_SIZE: | 377 case PRE_SIZE: |
425 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_MDTM, | 378 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_RETR, |
426 "213 18\r\n"); | 379 "213 18\r\n"); |
427 case PRE_MDTM: | |
428 return Verify("MDTM ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_RETR, | |
429 "213 20070221112533\r\n"); | |
430 case PRE_RETR: | 380 case PRE_RETR: |
431 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, | 381 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, |
432 "200 OK\r\n"); | 382 "200 OK\r\n"); |
433 default: | 383 default: |
434 return FtpSocketDataProvider::OnWrite(data); | 384 return FtpSocketDataProvider::OnWrite(data); |
435 } | 385 } |
436 } | 386 } |
437 | 387 |
438 private: | 388 private: |
439 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); | 389 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); |
440 }; | 390 }; |
441 | 391 |
442 class FtpSocketDataProviderEscaping : public FtpSocketDataProvider { | 392 class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { |
443 public: | 393 public: |
444 FtpSocketDataProviderEscaping() { | 394 FtpSocketDataProviderEscaping() { |
445 } | 395 } |
446 | 396 |
447 virtual MockWriteResult OnWrite(const std::string& data) { | 397 virtual MockWriteResult OnWrite(const std::string& data) { |
448 if (InjectFault()) | 398 if (InjectFault()) |
449 return MockWriteResult(true, data.length()); | 399 return MockWriteResult(true, data.length()); |
450 switch (state()) { | 400 switch (state()) { |
451 case PRE_SIZE: | 401 case PRE_SIZE: |
452 return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_MDTM, | 402 return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_RETR, |
453 "213 18\r\n"); | 403 "213 18\r\n"); |
454 case PRE_MDTM: | |
455 return Verify("MDTM / !\"#$%y\200\201\r\n", data, PRE_RETR, | |
456 "213 20070221112533\r\n"); | |
457 case PRE_RETR: | 404 case PRE_RETR: |
458 return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, | 405 return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, |
459 "200 OK\r\n"); | 406 "200 OK\r\n"); |
460 default: | 407 default: |
461 return FtpSocketDataProvider::OnWrite(data); | 408 return FtpSocketDataProviderFileDownload::OnWrite(data); |
462 } | 409 } |
463 } | 410 } |
464 | 411 |
465 private: | 412 private: |
466 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); | 413 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); |
467 }; | 414 }; |
468 | 415 |
469 class FtpSocketDataProviderFileDownloadTransferStarting | 416 class FtpSocketDataProviderFileDownloadTransferStarting |
470 : public FtpSocketDataProviderFileDownload { | 417 : public FtpSocketDataProviderFileDownload { |
471 public: | 418 public: |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 "500 More Evil\r\n"); | 478 "500 More Evil\r\n"); |
532 default: | 479 default: |
533 return FtpSocketDataProviderFileDownload::OnWrite(data); | 480 return FtpSocketDataProviderFileDownload::OnWrite(data); |
534 } | 481 } |
535 } | 482 } |
536 | 483 |
537 private: | 484 private: |
538 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); | 485 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); |
539 }; | 486 }; |
540 | 487 |
541 class FtpSocketDataProviderFileDownloadRetrFail | |
542 : public FtpSocketDataProviderFileDownload { | |
543 public: | |
544 FtpSocketDataProviderFileDownloadRetrFail() { | |
545 } | |
546 | |
547 virtual MockWriteResult OnWrite(const std::string& data) { | |
548 if (InjectFault()) | |
549 return MockWriteResult(true, data.length()); | |
550 switch (state()) { | |
551 case PRE_CWD: | |
552 return Verify("CWD /file\r\n", data, PRE_QUIT, | |
553 "550 file is a directory\r\n"); | |
554 default: | |
555 return FtpSocketDataProviderFileDownload::OnWrite(data); | |
556 } | |
557 } | |
558 | |
559 private: | |
560 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadRetrFail); | |
561 }; | |
562 | |
563 class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { | 488 class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { |
564 public: | 489 public: |
565 FtpSocketDataProviderEvilEpsv(const char* epsv_response, | 490 FtpSocketDataProviderEvilEpsv(const char* epsv_response, |
566 State expected_state) | 491 State expected_state) |
567 : epsv_response_(epsv_response), | 492 : epsv_response_(epsv_response), |
568 epsv_response_length_(std::strlen(epsv_response)), | 493 epsv_response_length_(std::strlen(epsv_response)), |
569 expected_state_(expected_state) {} | 494 expected_state_(expected_state) {} |
570 | 495 |
571 FtpSocketDataProviderEvilEpsv(const char* epsv_response, | 496 FtpSocketDataProviderEvilEpsv(const char* epsv_response, |
572 size_t epsv_response_length, | 497 size_t epsv_response_length, |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 | 735 |
811 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { | 736 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { |
812 FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; | 737 FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; |
813 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 738 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
814 | 739 |
815 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); | 740 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
816 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); | 741 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
817 } | 742 } |
818 | 743 |
819 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { | 744 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { |
820 FtpSocketDataProviderDirectoryListingWithTypecode ctrl_socket; | 745 FtpSocketDataProviderDirectoryListing ctrl_socket; |
821 ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", OK); | 746 ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", OK); |
822 | 747 |
823 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); | 748 EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
824 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); | 749 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
825 } | 750 } |
826 | 751 |
827 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { | 752 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { |
828 FtpSocketDataProviderDirectoryListing ctrl_socket; | 753 FtpSocketDataProviderDirectoryListing ctrl_socket; |
829 ctrl_socket.set_multiline_welcome(true); | 754 ctrl_socket.set_multiline_welcome(true); |
830 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 755 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 "213 99999999999999999999999999999999\r\n", | 1095 "213 99999999999999999999999999999999\r\n", |
1171 FtpSocketDataProvider::PRE_QUIT); | 1096 FtpSocketDataProvider::PRE_QUIT); |
1172 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); | 1097 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
1173 } | 1098 } |
1174 | 1099 |
1175 // Test for http://crbug.com/36360. | 1100 // Test for http://crbug.com/36360. |
1176 TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { | 1101 TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { |
1177 // Pass a valid, but large file size. The transaction should not fail. | 1102 // Pass a valid, but large file size. The transaction should not fail. |
1178 FtpSocketDataProviderEvilSize ctrl_socket( | 1103 FtpSocketDataProviderEvilSize ctrl_socket( |
1179 "213 3204427776\r\n", | 1104 "213 3204427776\r\n", |
1180 FtpSocketDataProvider::PRE_MDTM); | 1105 FtpSocketDataProvider::PRE_RETR); |
1181 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 1106 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
1182 EXPECT_EQ(3204427776LL, | 1107 EXPECT_EQ(3204427776LL, |
1183 transaction_.GetResponseInfo()->expected_content_size); | 1108 transaction_.GetResponseInfo()->expected_content_size); |
1184 } | 1109 } |
1185 | 1110 |
1186 // Regression test for http://crbug.com/25023. | 1111 // Regression test for http://crbug.com/25023. |
1187 TEST_F(FtpNetworkTransactionTest, CloseConnection) { | 1112 TEST_F(FtpNetworkTransactionTest, CloseConnection) { |
1188 FtpSocketDataProviderCloseConnection ctrl_socket; | 1113 FtpSocketDataProviderCloseConnection ctrl_socket; |
1189 ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); | 1114 ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); |
1190 } | 1115 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv) { | 1178 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv) { |
1254 FtpSocketDataProviderDirectoryListing ctrl_socket; | 1179 FtpSocketDataProviderDirectoryListing ctrl_socket; |
1255 TransactionFailHelper(&ctrl_socket, | 1180 TransactionFailHelper(&ctrl_socket, |
1256 "ftp://host", | 1181 "ftp://host", |
1257 FtpSocketDataProvider::PRE_EPSV, | 1182 FtpSocketDataProvider::PRE_EPSV, |
1258 FtpSocketDataProvider::PRE_NOPASV, | 1183 FtpSocketDataProvider::PRE_NOPASV, |
1259 "500 failed epsv\r\n", | 1184 "500 failed epsv\r\n", |
1260 ERR_FTP_PASV_COMMAND_FAILED); | 1185 ERR_FTP_PASV_COMMAND_FAILED); |
1261 } | 1186 } |
1262 | 1187 |
1263 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMalformedMdtm) { | |
1264 FtpSocketDataProviderDirectoryListing ctrl_socket; | |
1265 TransactionFailHelper(&ctrl_socket, | |
1266 "ftp://host", | |
1267 FtpSocketDataProvider::PRE_MDTM, | |
1268 FtpSocketDataProvider::PRE_RETR, | |
1269 "213 foobar\r\n", | |
1270 OK); | |
1271 } | |
1272 | |
1273 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { | |
1274 FtpSocketDataProviderDirectoryListing ctrl_socket; | |
1275 TransactionFailHelper(&ctrl_socket, | |
1276 "ftp://host", | |
1277 FtpSocketDataProvider::PRE_MDTM, | |
1278 FtpSocketDataProvider::PRE_RETR, | |
1279 "500 failed mdtm\r\n", | |
1280 OK); | |
1281 } | |
1282 | |
1283 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv2) { | |
1284 FtpSocketDataProviderDirectoryListing ctrl_socket; | |
1285 TransactionFailHelper(&ctrl_socket, | |
1286 "ftp://host", | |
1287 FtpSocketDataProvider::PRE_EPSV2, | |
1288 FtpSocketDataProvider::PRE_NOPASV, | |
1289 "500 failed epsv2\r\n", | |
1290 ERR_FTP_PASV_COMMAND_FAILED); | |
1291 } | |
1292 | |
1293 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { | 1188 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { |
1294 FtpSocketDataProviderDirectoryListing ctrl_socket; | 1189 FtpSocketDataProviderDirectoryListing ctrl_socket; |
1295 TransactionFailHelper(&ctrl_socket, | 1190 TransactionFailHelper(&ctrl_socket, |
1296 "ftp://host", | 1191 "ftp://host", |
1297 FtpSocketDataProvider::PRE_CWD, | 1192 FtpSocketDataProvider::PRE_CWD, |
1298 FtpSocketDataProvider::PRE_QUIT, | 1193 FtpSocketDataProvider::PRE_QUIT, |
1299 "500 failed cwd\r\n", | 1194 "500 failed cwd\r\n", |
1300 ERR_FAILED); | 1195 ERR_FAILED); |
1301 } | 1196 } |
1302 | 1197 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1383 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailEpsv) { | 1278 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailEpsv) { |
1384 FtpSocketDataProviderFileDownload ctrl_socket; | 1279 FtpSocketDataProviderFileDownload ctrl_socket; |
1385 TransactionFailHelper(&ctrl_socket, | 1280 TransactionFailHelper(&ctrl_socket, |
1386 "ftp://host/file", | 1281 "ftp://host/file", |
1387 FtpSocketDataProvider::PRE_EPSV, | 1282 FtpSocketDataProvider::PRE_EPSV, |
1388 FtpSocketDataProvider::PRE_NOPASV, | 1283 FtpSocketDataProvider::PRE_NOPASV, |
1389 "500 failed pasv\r\n", | 1284 "500 failed pasv\r\n", |
1390 ERR_FTP_PASV_COMMAND_FAILED); | 1285 ERR_FTP_PASV_COMMAND_FAILED); |
1391 } | 1286 } |
1392 | 1287 |
1393 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailMdtm) { | 1288 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { |
1394 FtpSocketDataProviderFileDownload ctrl_socket; | 1289 FtpSocketDataProviderFileDownload ctrl_socket; |
1395 TransactionFailHelper(&ctrl_socket, | 1290 TransactionFailHelper(&ctrl_socket, |
1396 "ftp://host/file", | 1291 "ftp://host/file", |
1397 FtpSocketDataProvider::PRE_MDTM, | |
1398 FtpSocketDataProvider::PRE_RETR, | 1292 FtpSocketDataProvider::PRE_RETR, |
1399 "500 failed mdtm\r\n", | |
1400 OK); | |
1401 } | |
1402 | |
1403 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { | |
1404 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; | |
1405 TransactionFailHelper(&ctrl_socket, | |
1406 "ftp://host/file", | |
1407 FtpSocketDataProvider::PRE_RETR, | |
1408 FtpSocketDataProvider::PRE_QUIT, | 1293 FtpSocketDataProvider::PRE_QUIT, |
1409 "500 failed retr\r\n", | 1294 "500 failed retr\r\n", |
1410 ERR_FAILED); | 1295 ERR_FAILED); |
1411 } | 1296 } |
1412 | 1297 |
1413 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { | 1298 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { |
1414 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; | 1299 FtpSocketDataProviderFileDownload ctrl_socket; |
1415 TransactionFailHelper(&ctrl_socket, | 1300 TransactionFailHelper(&ctrl_socket, |
1416 "ftp://host/file", | 1301 "ftp://host/file;type=i", |
1417 FtpSocketDataProvider::PRE_RETR, | 1302 FtpSocketDataProvider::PRE_SIZE, |
1418 FtpSocketDataProvider::PRE_EPSV2, | 1303 FtpSocketDataProvider::PRE_QUIT, |
1419 "550 cannot open file\r\n", | 1304 "550 File Not Found\r\n", |
1420 ERR_FILE_NOT_FOUND); | 1305 ERR_FAILED); |
1421 } | 1306 } |
1422 | 1307 |
1423 // Test for http://crbug.com/38845. | 1308 // Test for http://crbug.com/38845. |
1424 TEST_F(FtpNetworkTransactionTest, ZeroLengthDirInPWD) { | 1309 TEST_F(FtpNetworkTransactionTest, ZeroLengthDirInPWD) { |
1425 FtpSocketDataProviderFileDownload ctrl_socket; | 1310 FtpSocketDataProviderFileDownload ctrl_socket; |
1426 TransactionFailHelper(&ctrl_socket, | 1311 TransactionFailHelper(&ctrl_socket, |
1427 "ftp://host/file", | 1312 "ftp://host/file", |
1428 FtpSocketDataProvider::PRE_PWD, | 1313 FtpSocketDataProvider::PRE_PWD, |
1429 FtpSocketDataProvider::PRE_TYPE, | 1314 FtpSocketDataProvider::PRE_TYPE, |
1430 "257 \"\"\r\n", | 1315 "257 \"\"\r\n", |
1431 OK); | 1316 OK); |
1432 } | 1317 } |
1433 | 1318 |
1434 } // namespace net | 1319 } // namespace net |
OLD | NEW |