Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: net/ftp/ftp_network_transaction_unittest.cc

Issue 2813044: FTP: change order of commands to improve compatibility (Closed)
Patch Set: simplified Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« net/ftp/ftp_network_transaction.cc ('K') | « net/ftp/ftp_network_transaction.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698