| 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 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 StaticSocketDataProvider data1(data_reads, arraysize(data_reads), NULL, 0); | 603 StaticSocketDataProvider data1(data_reads, arraysize(data_reads), NULL, 0); |
| 604 StaticSocketDataProvider data2(data_reads, arraysize(data_reads), NULL, 0); | 604 StaticSocketDataProvider data2(data_reads, arraysize(data_reads), NULL, 0); |
| 605 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); | 605 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
| 606 mock_socket_factory_.AddSocketDataProvider(&data1); | 606 mock_socket_factory_.AddSocketDataProvider(&data1); |
| 607 mock_socket_factory_.AddSocketDataProvider(&data2); | 607 mock_socket_factory_.AddSocketDataProvider(&data2); |
| 608 FtpRequestInfo request_info = GetRequestInfo(request); | 608 FtpRequestInfo request_info = GetRequestInfo(request); |
| 609 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 609 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 610 ASSERT_EQ(ERR_IO_PENDING, | 610 ASSERT_EQ(ERR_IO_PENDING, |
| 611 transaction_.Start(&request_info, &callback_, NULL)); | 611 transaction_.Start(&request_info, &callback_, NULL)); |
| 612 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 612 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 613 EXPECT_EQ(expected_result, callback_.WaitForResult()); | 613 ASSERT_EQ(expected_result, callback_.WaitForResult()); |
| 614 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); | 614 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); |
| 615 if (expected_result == OK) { | 615 if (expected_result == OK) { |
| 616 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 616 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
| 617 memset(io_buffer->data(), 0, kBufferSize); | 617 memset(io_buffer->data(), 0, kBufferSize); |
| 618 ASSERT_EQ(ERR_IO_PENDING, | 618 ASSERT_EQ(ERR_IO_PENDING, |
| 619 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 619 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
| 620 EXPECT_EQ(static_cast<int>(mock_data.length()), | 620 ASSERT_EQ(static_cast<int>(mock_data.length()), |
| 621 callback_.WaitForResult()); | 621 callback_.WaitForResult()); |
| 622 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 622 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
| 623 if (transaction_.GetResponseInfo()->is_directory_listing) { | 623 if (transaction_.GetResponseInfo()->is_directory_listing) { |
| 624 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); | 624 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
| 625 } else { | 625 } else { |
| 626 // We pass an artificial value of 18 as a response to the SIZE command. | 626 // We pass an artificial value of 18 as a response to the SIZE command. |
| 627 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); | 627 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
| 628 } | 628 } |
| 629 } | 629 } |
| 630 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 630 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 646 FtpNetworkTransaction transaction_; | 646 FtpNetworkTransaction transaction_; |
| 647 TestCompletionCallback callback_; | 647 TestCompletionCallback callback_; |
| 648 }; | 648 }; |
| 649 | 649 |
| 650 TEST_F(FtpNetworkTransactionTest, FailedLookup) { | 650 TEST_F(FtpNetworkTransactionTest, FailedLookup) { |
| 651 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 651 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
| 652 host_resolver_->rules()->AddSimulatedFailure("badhost"); | 652 host_resolver_->rules()->AddSimulatedFailure("badhost"); |
| 653 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 653 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 654 ASSERT_EQ(ERR_IO_PENDING, | 654 ASSERT_EQ(ERR_IO_PENDING, |
| 655 transaction_.Start(&request_info, &callback_, NULL)); | 655 transaction_.Start(&request_info, &callback_, NULL)); |
| 656 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 656 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
| 657 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 657 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 658 } | 658 } |
| 659 | 659 |
| 660 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { | 660 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { |
| 661 FtpSocketDataProviderDirectoryListing ctrl_socket; | 661 FtpSocketDataProviderDirectoryListing ctrl_socket; |
| 662 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 662 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
| 663 } | 663 } |
| 664 | 664 |
| 665 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { | 665 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { |
| 666 FtpSocketDataProviderDirectoryListing ctrl_socket; | 666 FtpSocketDataProviderDirectoryListing ctrl_socket; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 }; | 741 }; |
| 742 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), | 742 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), |
| 743 NULL, 0); | 743 NULL, 0); |
| 744 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 744 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
| 745 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 745 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
| 746 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 746 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 747 | 747 |
| 748 // Start the transaction. | 748 // Start the transaction. |
| 749 ASSERT_EQ(ERR_IO_PENDING, | 749 ASSERT_EQ(ERR_IO_PENDING, |
| 750 transaction_.Start(&request_info, &callback_, NULL)); | 750 transaction_.Start(&request_info, &callback_, NULL)); |
| 751 EXPECT_EQ(OK, callback_.WaitForResult()); | 751 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 752 | 752 |
| 753 // The transaction fires the callback when we can start reading data. | 753 // The transaction fires the callback when we can start reading data. |
| 754 EXPECT_EQ(FtpSocketDataProvider::PRE_QUIT, ctrl_socket.state()); | 754 EXPECT_EQ(FtpSocketDataProvider::PRE_QUIT, ctrl_socket.state()); |
| 755 EXPECT_EQ(LOAD_STATE_SENDING_REQUEST, transaction_.GetLoadState()); | 755 EXPECT_EQ(LOAD_STATE_SENDING_REQUEST, transaction_.GetLoadState()); |
| 756 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 756 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
| 757 memset(io_buffer->data(), 0, kBufferSize); | 757 memset(io_buffer->data(), 0, kBufferSize); |
| 758 ASSERT_EQ(ERR_IO_PENDING, | 758 ASSERT_EQ(ERR_IO_PENDING, |
| 759 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 759 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
| 760 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); | 760 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); |
| 761 EXPECT_EQ(static_cast<int>(mock_data.length()), | 761 ASSERT_EQ(static_cast<int>(mock_data.length()), |
| 762 callback_.WaitForResult()); | 762 callback_.WaitForResult()); |
| 763 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); | 763 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); |
| 764 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 764 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
| 765 | 765 |
| 766 // FTP server should disconnect the data socket. It is also a signal for the | 766 // FTP server should disconnect the data socket. It is also a signal for the |
| 767 // FtpNetworkTransaction that the data transfer is finished. | 767 // FtpNetworkTransaction that the data transfer is finished. |
| 768 ClientSocket* data_socket = mock_socket_factory_.GetMockTCPClientSocket(1); | 768 ClientSocket* data_socket = mock_socket_factory_.GetMockTCPClientSocket(1); |
| 769 ASSERT_TRUE(data_socket); | 769 ASSERT_TRUE(data_socket); |
| 770 data_socket->Disconnect(); | 770 data_socket->Disconnect(); |
| 771 | 771 |
| 772 // We should issue Reads until one returns EOF... | 772 // We should issue Reads until one returns EOF... |
| 773 ASSERT_EQ(ERR_IO_PENDING, | 773 ASSERT_EQ(ERR_IO_PENDING, |
| 774 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 774 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
| 775 | 775 |
| 776 // Make sure the transaction finishes cleanly. | 776 // Make sure the transaction finishes cleanly. |
| 777 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 777 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 778 EXPECT_EQ(OK, callback_.WaitForResult()); | 778 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 779 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket.state()); | 779 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket.state()); |
| 780 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 780 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
| 781 } | 781 } |
| 782 | 782 |
| 783 TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { | 783 TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { |
| 784 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; | 784 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; |
| 785 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 785 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
| 786 } | 786 } |
| 787 | 787 |
| 788 TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { | 788 TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 }; | 826 }; |
| 827 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), | 827 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), |
| 828 NULL, 0); | 828 NULL, 0); |
| 829 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 829 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
| 830 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 830 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
| 831 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 831 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 832 | 832 |
| 833 // Start the transaction. | 833 // Start the transaction. |
| 834 ASSERT_EQ(ERR_IO_PENDING, | 834 ASSERT_EQ(ERR_IO_PENDING, |
| 835 transaction_.Start(&request_info, &callback_, NULL)); | 835 transaction_.Start(&request_info, &callback_, NULL)); |
| 836 EXPECT_EQ(OK, callback_.WaitForResult()); | 836 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 837 | 837 |
| 838 // The transaction fires the callback when we can start reading data. That | 838 // The transaction fires the callback when we can start reading data. That |
| 839 // means that the data socket should be open. | 839 // means that the data socket should be open. |
| 840 MockTCPClientSocket* data_socket = | 840 MockTCPClientSocket* data_socket = |
| 841 mock_socket_factory_.GetMockTCPClientSocket(1); | 841 mock_socket_factory_.GetMockTCPClientSocket(1); |
| 842 ASSERT_TRUE(data_socket); | 842 ASSERT_TRUE(data_socket); |
| 843 ASSERT_TRUE(data_socket->IsConnected()); | 843 ASSERT_TRUE(data_socket->IsConnected()); |
| 844 | 844 |
| 845 // Even if the PASV response specified some other address, we connect | 845 // Even if the PASV response specified some other address, we connect |
| 846 // to the address we used for control connection. | 846 // to the address we used for control connection (which could be 127.0.0.1 |
| 847 EXPECT_EQ("127.0.0.1", NetAddressToString(data_socket->addresses().head())); | 847 // or ::1 depending on whether we use IPv6). |
| 848 | 848 const struct addrinfo* addrinfo = data_socket->addresses().head(); |
| 849 // Make sure we have only one host entry in the AddressList. | 849 while (addrinfo) { |
| 850 EXPECT_FALSE(data_socket->addresses().head()->ai_next); | 850 EXPECT_NE("1.2.3.4", NetAddressToString(addrinfo)); |
| 851 addrinfo = addrinfo->ai_next; |
| 852 } |
| 851 } | 853 } |
| 852 | 854 |
| 853 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { | 855 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { |
| 854 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); | 856 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); |
| 855 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); | 857 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); |
| 856 } | 858 } |
| 857 | 859 |
| 858 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { | 860 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { |
| 859 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); | 861 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); |
| 860 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); | 862 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 874 FtpSocketDataProvider ctrl_socket1; | 876 FtpSocketDataProvider ctrl_socket1; |
| 875 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 877 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
| 876 FtpSocketDataProvider::PRE_QUIT, | 878 FtpSocketDataProvider::PRE_QUIT, |
| 877 "530 Login authentication failed\r\n"); | 879 "530 Login authentication failed\r\n"); |
| 878 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 880 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
| 879 | 881 |
| 880 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 882 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 881 | 883 |
| 882 ASSERT_EQ(ERR_IO_PENDING, | 884 ASSERT_EQ(ERR_IO_PENDING, |
| 883 transaction_.Start(&request_info, &callback_, NULL)); | 885 transaction_.Start(&request_info, &callback_, NULL)); |
| 884 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); | 886 ASSERT_EQ(ERR_FAILED, callback_.WaitForResult()); |
| 885 | 887 |
| 886 MockRead ctrl_reads[] = { | 888 MockRead ctrl_reads[] = { |
| 887 MockRead("220 host TestFTPd\r\n"), | 889 MockRead("220 host TestFTPd\r\n"), |
| 888 MockRead("221 Goodbye!\r\n"), | 890 MockRead("221 Goodbye!\r\n"), |
| 889 MockRead(false, OK), | 891 MockRead(false, OK), |
| 890 }; | 892 }; |
| 891 MockWrite ctrl_writes[] = { | 893 MockWrite ctrl_writes[] = { |
| 892 MockWrite("QUIT\r\n"), | 894 MockWrite("QUIT\r\n"), |
| 893 }; | 895 }; |
| 894 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 896 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
| 895 ctrl_writes, arraysize(ctrl_writes)); | 897 ctrl_writes, arraysize(ctrl_writes)); |
| 896 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 898 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
| 897 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"foo\nownz0red", | 899 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"foo\nownz0red", |
| 898 L"innocent", | 900 L"innocent", |
| 899 &callback_)); | 901 &callback_)); |
| 900 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 902 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
| 901 } | 903 } |
| 902 | 904 |
| 903 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { | 905 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { |
| 904 FtpSocketDataProvider ctrl_socket1; | 906 FtpSocketDataProvider ctrl_socket1; |
| 905 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 907 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
| 906 FtpSocketDataProvider::PRE_QUIT, | 908 FtpSocketDataProvider::PRE_QUIT, |
| 907 "530 Login authentication failed\r\n"); | 909 "530 Login authentication failed\r\n"); |
| 908 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 910 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
| 909 | 911 |
| 910 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 912 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
| 911 | 913 |
| 912 ASSERT_EQ(ERR_IO_PENDING, | 914 ASSERT_EQ(ERR_IO_PENDING, |
| 913 transaction_.Start(&request_info, &callback_, NULL)); | 915 transaction_.Start(&request_info, &callback_, NULL)); |
| 914 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); | 916 ASSERT_EQ(ERR_FAILED, callback_.WaitForResult()); |
| 915 | 917 |
| 916 MockRead ctrl_reads[] = { | 918 MockRead ctrl_reads[] = { |
| 917 MockRead("220 host TestFTPd\r\n"), | 919 MockRead("220 host TestFTPd\r\n"), |
| 918 MockRead("331 User okay, send password\r\n"), | 920 MockRead("331 User okay, send password\r\n"), |
| 919 MockRead("221 Goodbye!\r\n"), | 921 MockRead("221 Goodbye!\r\n"), |
| 920 MockRead(false, OK), | 922 MockRead(false, OK), |
| 921 }; | 923 }; |
| 922 MockWrite ctrl_writes[] = { | 924 MockWrite ctrl_writes[] = { |
| 923 MockWrite("USER innocent\r\n"), | 925 MockWrite("USER innocent\r\n"), |
| 924 MockWrite("QUIT\r\n"), | 926 MockWrite("QUIT\r\n"), |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; | 1169 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; |
| 1168 TransactionFailHelper(&ctrl_socket, | 1170 TransactionFailHelper(&ctrl_socket, |
| 1169 "ftp://host/file", | 1171 "ftp://host/file", |
| 1170 FtpSocketDataProvider::PRE_RETR, | 1172 FtpSocketDataProvider::PRE_RETR, |
| 1171 FtpSocketDataProvider::PRE_PASV2, | 1173 FtpSocketDataProvider::PRE_PASV2, |
| 1172 "550 cannot open file\r\n", | 1174 "550 cannot open file\r\n", |
| 1173 ERR_FILE_NOT_FOUND); | 1175 ERR_FILE_NOT_FOUND); |
| 1174 } | 1176 } |
| 1175 | 1177 |
| 1176 } // namespace net | 1178 } // namespace net |
| OLD | NEW |