| 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 |