| 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/socket/socks5_client_socket.h" | 5 #include "net/socket/socks5_client_socket.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| 11 #include "net/base/load_log.h" | 11 #include "net/base/net_log.h" |
| 12 #include "net/base/load_log_unittest.h" | 12 #include "net/base/net_log_unittest.h" |
| 13 #include "net/base/mock_host_resolver.h" | 13 #include "net/base/mock_host_resolver.h" |
| 14 #include "net/base/sys_addrinfo.h" | 14 #include "net/base/sys_addrinfo.h" |
| 15 #include "net/base/test_completion_callback.h" | 15 #include "net/base/test_completion_callback.h" |
| 16 #include "net/base/winsock_init.h" | 16 #include "net/base/winsock_init.h" |
| 17 #include "net/socket/client_socket_factory.h" | 17 #include "net/socket/client_socket_factory.h" |
| 18 #include "net/socket/socket_test_util.h" | 18 #include "net/socket/socket_test_util.h" |
| 19 #include "net/socket/tcp_client_socket.h" | 19 #include "net/socket/tcp_client_socket.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "testing/platform_test.h" | 21 #include "testing/platform_test.h" |
| 22 | 22 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 MockRead(true, payload_read.data(), payload_read.size()) }; | 121 MockRead(true, payload_read.data(), payload_read.size()) }; |
| 122 | 122 |
| 123 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 123 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 124 data_writes, arraysize(data_writes), | 124 data_writes, arraysize(data_writes), |
| 125 "localhost", 80)); | 125 "localhost", 80)); |
| 126 | 126 |
| 127 // At this state the TCP connection is completed but not the SOCKS handshake. | 127 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 128 EXPECT_TRUE(tcp_sock_->IsConnected()); | 128 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 129 EXPECT_FALSE(user_sock_->IsConnected()); | 129 EXPECT_FALSE(user_sock_->IsConnected()); |
| 130 | 130 |
| 131 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 131 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 132 int rv = user_sock_->Connect(&callback_, log); | 132 int rv = user_sock_->Connect(&callback_, log.bound()); |
| 133 EXPECT_EQ(ERR_IO_PENDING, rv); | 133 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 134 EXPECT_FALSE(user_sock_->IsConnected()); | 134 EXPECT_FALSE(user_sock_->IsConnected()); |
| 135 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); | 135 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONNEC
T)); |
| 136 | 136 |
| 137 rv = callback_.WaitForResult(); | 137 rv = callback_.WaitForResult(); |
| 138 | 138 |
| 139 EXPECT_EQ(OK, rv); | 139 EXPECT_EQ(OK, rv); |
| 140 EXPECT_TRUE(user_sock_->IsConnected()); | 140 EXPECT_TRUE(user_sock_->IsConnected()); |
| 141 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); | 141 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNECT
)); |
| 142 | 142 |
| 143 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); | 143 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); |
| 144 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 144 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
| 145 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 145 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
| 146 EXPECT_EQ(ERR_IO_PENDING, rv); | 146 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 147 rv = callback_.WaitForResult(); | 147 rv = callback_.WaitForResult(); |
| 148 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 148 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
| 149 | 149 |
| 150 buffer = new IOBuffer(payload_read.size()); | 150 buffer = new IOBuffer(payload_read.size()); |
| 151 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); | 151 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 MockWrite data_writes[] = { | 238 MockWrite data_writes[] = { |
| 239 MockWrite(true, arraysize(partial1)), | 239 MockWrite(true, arraysize(partial1)), |
| 240 MockWrite(true, partial2, arraysize(partial2)), | 240 MockWrite(true, partial2, arraysize(partial2)), |
| 241 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 241 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 242 MockRead data_reads[] = { | 242 MockRead data_reads[] = { |
| 243 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 243 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 244 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 244 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 245 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 245 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 246 data_writes, arraysize(data_writes), | 246 data_writes, arraysize(data_writes), |
| 247 hostname, 80)); | 247 hostname, 80)); |
| 248 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 248 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 249 int rv = user_sock_->Connect(&callback_, log); | 249 int rv = user_sock_->Connect(&callback_, log.bound()); |
| 250 EXPECT_EQ(ERR_IO_PENDING, rv); | 250 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 251 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); | 251 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); |
| 252 rv = callback_.WaitForResult(); | 252 rv = callback_.WaitForResult(); |
| 253 EXPECT_EQ(OK, rv); | 253 EXPECT_EQ(OK, rv); |
| 254 EXPECT_TRUE(user_sock_->IsConnected()); | 254 EXPECT_TRUE(user_sock_->IsConnected()); |
| 255 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); | 255 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); |
| 256 } | 256 } |
| 257 | 257 |
| 258 // Test for partial greet response read | 258 // Test for partial greet response read |
| 259 { | 259 { |
| 260 const char partial1[] = { 0x05 }; | 260 const char partial1[] = { 0x05 }; |
| 261 const char partial2[] = { 0x00 }; | 261 const char partial2[] = { 0x00 }; |
| 262 MockWrite data_writes[] = { | 262 MockWrite data_writes[] = { |
| 263 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 263 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 264 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 264 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 265 MockRead data_reads[] = { | 265 MockRead data_reads[] = { |
| 266 MockRead(true, partial1, arraysize(partial1)), | 266 MockRead(true, partial1, arraysize(partial1)), |
| 267 MockRead(true, partial2, arraysize(partial2)), | 267 MockRead(true, partial2, arraysize(partial2)), |
| 268 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 268 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 269 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 269 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 270 data_writes, arraysize(data_writes), | 270 data_writes, arraysize(data_writes), |
| 271 hostname, 80)); | 271 hostname, 80)); |
| 272 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 272 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 273 int rv = user_sock_->Connect(&callback_, log); | 273 int rv = user_sock_->Connect(&callback_, log.bound()); |
| 274 EXPECT_EQ(ERR_IO_PENDING, rv); | 274 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 275 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); | 275 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); |
| 276 rv = callback_.WaitForResult(); | 276 rv = callback_.WaitForResult(); |
| 277 EXPECT_EQ(OK, rv); | 277 EXPECT_EQ(OK, rv); |
| 278 EXPECT_TRUE(user_sock_->IsConnected()); | 278 EXPECT_TRUE(user_sock_->IsConnected()); |
| 279 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); | 279 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); |
| 280 } | 280 } |
| 281 | 281 |
| 282 // Test for partial handshake request write. | 282 // Test for partial handshake request write. |
| 283 { | 283 { |
| 284 const int kSplitPoint = 3; // Break handshake write into two parts. | 284 const int kSplitPoint = 3; // Break handshake write into two parts. |
| 285 MockWrite data_writes[] = { | 285 MockWrite data_writes[] = { |
| 286 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 286 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 287 MockWrite(true, kSOCKS5OkRequest, kSplitPoint), | 287 MockWrite(true, kSOCKS5OkRequest, kSplitPoint), |
| 288 MockWrite(true, kSOCKS5OkRequest + kSplitPoint, | 288 MockWrite(true, kSOCKS5OkRequest + kSplitPoint, |
| 289 arraysize(kSOCKS5OkRequest) - kSplitPoint) | 289 arraysize(kSOCKS5OkRequest) - kSplitPoint) |
| 290 }; | 290 }; |
| 291 MockRead data_reads[] = { | 291 MockRead data_reads[] = { |
| 292 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 292 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 293 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 293 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 294 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 294 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 295 data_writes, arraysize(data_writes), | 295 data_writes, arraysize(data_writes), |
| 296 hostname, 80)); | 296 hostname, 80)); |
| 297 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 297 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 298 int rv = user_sock_->Connect(&callback_, log); | 298 int rv = user_sock_->Connect(&callback_, log.bound()); |
| 299 EXPECT_EQ(ERR_IO_PENDING, rv); | 299 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 300 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); | 300 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); |
| 301 rv = callback_.WaitForResult(); | 301 rv = callback_.WaitForResult(); |
| 302 EXPECT_EQ(OK, rv); | 302 EXPECT_EQ(OK, rv); |
| 303 EXPECT_TRUE(user_sock_->IsConnected()); | 303 EXPECT_TRUE(user_sock_->IsConnected()); |
| 304 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); | 304 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); |
| 305 } | 305 } |
| 306 | 306 |
| 307 // Test for partial handshake response read | 307 // Test for partial handshake response read |
| 308 { | 308 { |
| 309 const int kSplitPoint = 6; // Break the handshake read into two parts. | 309 const int kSplitPoint = 6; // Break the handshake read into two parts. |
| 310 MockWrite data_writes[] = { | 310 MockWrite data_writes[] = { |
| 311 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 311 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 312 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) | 312 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) |
| 313 }; | 313 }; |
| 314 MockRead data_reads[] = { | 314 MockRead data_reads[] = { |
| 315 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 315 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 316 MockRead(true, kSOCKS5OkResponse, kSplitPoint), | 316 MockRead(true, kSOCKS5OkResponse, kSplitPoint), |
| 317 MockRead(true, kSOCKS5OkResponse + kSplitPoint, | 317 MockRead(true, kSOCKS5OkResponse + kSplitPoint, |
| 318 arraysize(kSOCKS5OkResponse) - kSplitPoint) | 318 arraysize(kSOCKS5OkResponse) - kSplitPoint) |
| 319 }; | 319 }; |
| 320 | 320 |
| 321 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 321 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 322 data_writes, arraysize(data_writes), | 322 data_writes, arraysize(data_writes), |
| 323 hostname, 80)); | 323 hostname, 80)); |
| 324 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 324 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 325 int rv = user_sock_->Connect(&callback_, log); | 325 int rv = user_sock_->Connect(&callback_, log.bound()); |
| 326 EXPECT_EQ(ERR_IO_PENDING, rv); | 326 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 327 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); | 327 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); |
| 328 rv = callback_.WaitForResult(); | 328 rv = callback_.WaitForResult(); |
| 329 EXPECT_EQ(OK, rv); | 329 EXPECT_EQ(OK, rv); |
| 330 EXPECT_TRUE(user_sock_->IsConnected()); | 330 EXPECT_TRUE(user_sock_->IsConnected()); |
| 331 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); | 331 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 | 334 |
| 335 } // namespace | 335 } // namespace |
| 336 | 336 |
| 337 } // namespace net | 337 } // namespace net |
| OLD | NEW |