| 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" |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 118 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
| 119 | 119 |
| 120 // At this state the TCP connection is completed but not the SOCKS handshake. | 120 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 121 EXPECT_TRUE(tcp_sock_->IsConnected()); | 121 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 122 EXPECT_FALSE(user_sock_->IsConnected()); | 122 EXPECT_FALSE(user_sock_->IsConnected()); |
| 123 | 123 |
| 124 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 124 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 125 int rv = user_sock_->Connect(&callback_, log); | 125 int rv = user_sock_->Connect(&callback_, log); |
| 126 EXPECT_EQ(ERR_IO_PENDING, rv); | 126 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 127 EXPECT_FALSE(user_sock_->IsConnected()); | 127 EXPECT_FALSE(user_sock_->IsConnected()); |
| 128 EXPECT_TRUE( | 128 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 129 LogContains(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | |
| 130 | 129 |
| 131 rv = callback_.WaitForResult(); | 130 rv = callback_.WaitForResult(); |
| 132 | 131 |
| 133 EXPECT_EQ(OK, rv); | 132 EXPECT_EQ(OK, rv); |
| 134 EXPECT_TRUE(user_sock_->IsConnected()); | 133 EXPECT_TRUE(user_sock_->IsConnected()); |
| 135 EXPECT_TRUE(LogContains( | 134 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 136 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | |
| 137 | 135 |
| 138 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); | 136 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); |
| 139 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 137 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
| 140 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 138 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
| 141 EXPECT_EQ(ERR_IO_PENDING, rv); | 139 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 142 rv = callback_.WaitForResult(); | 140 rv = callback_.WaitForResult(); |
| 143 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 141 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
| 144 | 142 |
| 145 buffer = new IOBuffer(payload_read.size()); | 143 buffer = new IOBuffer(payload_read.size()); |
| 146 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); | 144 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 MockWrite(true, arraysize(partial1)), | 229 MockWrite(true, arraysize(partial1)), |
| 232 MockWrite(true, partial2, arraysize(partial2)), | 230 MockWrite(true, partial2, arraysize(partial2)), |
| 233 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 231 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 234 MockRead data_reads[] = { | 232 MockRead data_reads[] = { |
| 235 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 233 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 236 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 234 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 237 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 235 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 238 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 236 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 239 int rv = user_sock_->Connect(&callback_, log); | 237 int rv = user_sock_->Connect(&callback_, log); |
| 240 EXPECT_EQ(ERR_IO_PENDING, rv); | 238 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 241 EXPECT_TRUE(LogContains( | 239 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 242 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | |
| 243 rv = callback_.WaitForResult(); | 240 rv = callback_.WaitForResult(); |
| 244 EXPECT_EQ(OK, rv); | 241 EXPECT_EQ(OK, rv); |
| 245 EXPECT_TRUE(user_sock_->IsConnected()); | 242 EXPECT_TRUE(user_sock_->IsConnected()); |
| 246 EXPECT_TRUE(LogContains( | 243 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 247 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | |
| 248 } | 244 } |
| 249 | 245 |
| 250 // Test for partial greet response read | 246 // Test for partial greet response read |
| 251 { | 247 { |
| 252 const char partial1[] = { 0x05 }; | 248 const char partial1[] = { 0x05 }; |
| 253 const char partial2[] = { 0x00 }; | 249 const char partial2[] = { 0x00 }; |
| 254 MockWrite data_writes[] = { | 250 MockWrite data_writes[] = { |
| 255 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 251 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 256 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 252 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 257 MockRead data_reads[] = { | 253 MockRead data_reads[] = { |
| 258 MockRead(true, partial1, arraysize(partial1)), | 254 MockRead(true, partial1, arraysize(partial1)), |
| 259 MockRead(true, partial2, arraysize(partial2)), | 255 MockRead(true, partial2, arraysize(partial2)), |
| 260 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 256 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 261 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 257 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 262 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 258 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 263 int rv = user_sock_->Connect(&callback_, log); | 259 int rv = user_sock_->Connect(&callback_, log); |
| 264 EXPECT_EQ(ERR_IO_PENDING, rv); | 260 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 265 EXPECT_TRUE(LogContains( | 261 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 266 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | |
| 267 rv = callback_.WaitForResult(); | 262 rv = callback_.WaitForResult(); |
| 268 EXPECT_EQ(OK, rv); | 263 EXPECT_EQ(OK, rv); |
| 269 EXPECT_TRUE(user_sock_->IsConnected()); | 264 EXPECT_TRUE(user_sock_->IsConnected()); |
| 270 EXPECT_TRUE(LogContains( | 265 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 271 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | |
| 272 } | 266 } |
| 273 | 267 |
| 274 // Test for partial handshake request write. | 268 // Test for partial handshake request write. |
| 275 { | 269 { |
| 276 const int kSplitPoint = 3; // Break handshake write into two parts. | 270 const int kSplitPoint = 3; // Break handshake write into two parts. |
| 277 MockWrite data_writes[] = { | 271 MockWrite data_writes[] = { |
| 278 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 272 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 279 MockWrite(true, kSOCKS5OkRequest, kSplitPoint), | 273 MockWrite(true, kSOCKS5OkRequest, kSplitPoint), |
| 280 MockWrite(true, kSOCKS5OkRequest + kSplitPoint, | 274 MockWrite(true, kSOCKS5OkRequest + kSplitPoint, |
| 281 arraysize(kSOCKS5OkRequest) - kSplitPoint) | 275 arraysize(kSOCKS5OkRequest) - kSplitPoint) |
| 282 }; | 276 }; |
| 283 MockRead data_reads[] = { | 277 MockRead data_reads[] = { |
| 284 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 278 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 285 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 279 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 286 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 280 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 287 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 281 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 288 int rv = user_sock_->Connect(&callback_, log); | 282 int rv = user_sock_->Connect(&callback_, log); |
| 289 EXPECT_EQ(ERR_IO_PENDING, rv); | 283 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 290 EXPECT_TRUE(LogContains( | 284 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 291 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | |
| 292 rv = callback_.WaitForResult(); | 285 rv = callback_.WaitForResult(); |
| 293 EXPECT_EQ(OK, rv); | 286 EXPECT_EQ(OK, rv); |
| 294 EXPECT_TRUE(user_sock_->IsConnected()); | 287 EXPECT_TRUE(user_sock_->IsConnected()); |
| 295 EXPECT_TRUE(LogContains( | 288 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 296 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | |
| 297 } | 289 } |
| 298 | 290 |
| 299 // Test for partial handshake response read | 291 // Test for partial handshake response read |
| 300 { | 292 { |
| 301 const int kSplitPoint = 6; // Break the handshake read into two parts. | 293 const int kSplitPoint = 6; // Break the handshake read into two parts. |
| 302 MockWrite data_writes[] = { | 294 MockWrite data_writes[] = { |
| 303 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 295 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 304 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) | 296 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) |
| 305 }; | 297 }; |
| 306 MockRead data_reads[] = { | 298 MockRead data_reads[] = { |
| 307 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 299 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 308 MockRead(true, kSOCKS5OkResponse, kSplitPoint), | 300 MockRead(true, kSOCKS5OkResponse, kSplitPoint), |
| 309 MockRead(true, kSOCKS5OkResponse + kSplitPoint, arraysize(kSOCKS5OkRespo
nse) - kSplitPoint) | 301 MockRead(true, kSOCKS5OkResponse + kSplitPoint, |
| 302 arraysize(kSOCKS5OkResponse) - kSplitPoint) |
| 310 }; | 303 }; |
| 311 | 304 |
| 312 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 305 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 313 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 306 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 314 int rv = user_sock_->Connect(&callback_, log); | 307 int rv = user_sock_->Connect(&callback_, log); |
| 315 EXPECT_EQ(ERR_IO_PENDING, rv); | 308 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 316 EXPECT_TRUE(LogContains( | 309 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 317 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | |
| 318 rv = callback_.WaitForResult(); | 310 rv = callback_.WaitForResult(); |
| 319 EXPECT_EQ(OK, rv); | 311 EXPECT_EQ(OK, rv); |
| 320 EXPECT_TRUE(user_sock_->IsConnected()); | 312 EXPECT_TRUE(user_sock_->IsConnected()); |
| 321 EXPECT_TRUE(LogContains( | 313 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); |
| 322 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | |
| 323 } | 314 } |
| 324 } | 315 } |
| 325 | 316 |
| 326 } // namespace | 317 } // namespace |
| 327 | 318 |
| 328 } // namespace net | 319 } // namespace net |
| OLD | NEW |