| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 data_writes, arraysize(data_writes), | 124 data_writes, arraysize(data_writes), |
| 125 "localhost", 80, &net_log_)); | 125 "localhost", 80, &net_log_)); |
| 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 int rv = user_sock_->Connect(&callback_); | 131 int rv = user_sock_->Connect(&callback_); |
| 132 EXPECT_EQ(ERR_IO_PENDING, rv); | 132 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 133 EXPECT_FALSE(user_sock_->IsConnected()); | 133 EXPECT_FALSE(user_sock_->IsConnected()); |
| 134 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, | 134 |
| 135 net::CapturingNetLog::EntryList net_log_entries; |
| 136 net_log_.GetEntries(&net_log_entries); |
| 137 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 135 NetLog::TYPE_SOCKS5_CONNECT)); | 138 NetLog::TYPE_SOCKS5_CONNECT)); |
| 136 | 139 |
| 137 rv = callback_.WaitForResult(); | 140 rv = callback_.WaitForResult(); |
| 138 | 141 |
| 139 EXPECT_EQ(OK, rv); | 142 EXPECT_EQ(OK, rv); |
| 140 EXPECT_TRUE(user_sock_->IsConnected()); | 143 EXPECT_TRUE(user_sock_->IsConnected()); |
| 141 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, | 144 |
| 145 net_log_.GetEntries(&net_log_entries); |
| 146 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 142 NetLog::TYPE_SOCKS5_CONNECT)); | 147 NetLog::TYPE_SOCKS5_CONNECT)); |
| 143 | 148 |
| 144 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); | 149 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); |
| 145 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 150 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
| 146 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 151 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
| 147 EXPECT_EQ(ERR_IO_PENDING, rv); | 152 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 148 rv = callback_.WaitForResult(); | 153 rv = callback_.WaitForResult(); |
| 149 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 154 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
| 150 | 155 |
| 151 buffer = new IOBuffer(payload_read.size()); | 156 buffer = new IOBuffer(payload_read.size()); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 MockWrite(true, partial2, arraysize(partial2)), | 246 MockWrite(true, partial2, arraysize(partial2)), |
| 242 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; | 247 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; |
| 243 MockRead data_reads[] = { | 248 MockRead data_reads[] = { |
| 244 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 249 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 245 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 250 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 246 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 251 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 247 data_writes, arraysize(data_writes), | 252 data_writes, arraysize(data_writes), |
| 248 hostname, 80, &net_log_)); | 253 hostname, 80, &net_log_)); |
| 249 int rv = user_sock_->Connect(&callback_); | 254 int rv = user_sock_->Connect(&callback_); |
| 250 EXPECT_EQ(ERR_IO_PENDING, rv); | 255 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 251 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, | 256 |
| 257 net::CapturingNetLog::EntryList net_log_entries; |
| 258 net_log_.GetEntries(&net_log_entries); |
| 259 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 252 NetLog::TYPE_SOCKS5_CONNECT)); | 260 NetLog::TYPE_SOCKS5_CONNECT)); |
| 261 |
| 253 rv = callback_.WaitForResult(); | 262 rv = callback_.WaitForResult(); |
| 254 EXPECT_EQ(OK, rv); | 263 EXPECT_EQ(OK, rv); |
| 255 EXPECT_TRUE(user_sock_->IsConnected()); | 264 EXPECT_TRUE(user_sock_->IsConnected()); |
| 256 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, | 265 |
| 266 net_log_.GetEntries(&net_log_entries); |
| 267 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 257 NetLog::TYPE_SOCKS5_CONNECT)); | 268 NetLog::TYPE_SOCKS5_CONNECT)); |
| 258 } | 269 } |
| 259 | 270 |
| 260 // Test for partial greet response read | 271 // Test for partial greet response read |
| 261 { | 272 { |
| 262 const char partial1[] = { 0x05 }; | 273 const char partial1[] = { 0x05 }; |
| 263 const char partial2[] = { 0x00 }; | 274 const char partial2[] = { 0x00 }; |
| 264 MockWrite data_writes[] = { | 275 MockWrite data_writes[] = { |
| 265 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 276 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 266 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; | 277 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; |
| 267 MockRead data_reads[] = { | 278 MockRead data_reads[] = { |
| 268 MockRead(true, partial1, arraysize(partial1)), | 279 MockRead(true, partial1, arraysize(partial1)), |
| 269 MockRead(true, partial2, arraysize(partial2)), | 280 MockRead(true, partial2, arraysize(partial2)), |
| 270 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 281 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 271 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 282 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 272 data_writes, arraysize(data_writes), | 283 data_writes, arraysize(data_writes), |
| 273 hostname, 80, &net_log_)); | 284 hostname, 80, &net_log_)); |
| 274 int rv = user_sock_->Connect(&callback_); | 285 int rv = user_sock_->Connect(&callback_); |
| 275 EXPECT_EQ(ERR_IO_PENDING, rv); | 286 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 276 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, | 287 |
| 288 net::CapturingNetLog::EntryList net_log_entries; |
| 289 net_log_.GetEntries(&net_log_entries); |
| 290 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 277 NetLog::TYPE_SOCKS5_CONNECT)); | 291 NetLog::TYPE_SOCKS5_CONNECT)); |
| 278 rv = callback_.WaitForResult(); | 292 rv = callback_.WaitForResult(); |
| 279 EXPECT_EQ(OK, rv); | 293 EXPECT_EQ(OK, rv); |
| 280 EXPECT_TRUE(user_sock_->IsConnected()); | 294 EXPECT_TRUE(user_sock_->IsConnected()); |
| 281 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, | 295 net_log_.GetEntries(&net_log_entries); |
| 296 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 282 NetLog::TYPE_SOCKS5_CONNECT)); | 297 NetLog::TYPE_SOCKS5_CONNECT)); |
| 283 } | 298 } |
| 284 | 299 |
| 285 // Test for partial handshake request write. | 300 // Test for partial handshake request write. |
| 286 { | 301 { |
| 287 const int kSplitPoint = 3; // Break handshake write into two parts. | 302 const int kSplitPoint = 3; // Break handshake write into two parts. |
| 288 MockWrite data_writes[] = { | 303 MockWrite data_writes[] = { |
| 289 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 304 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 290 MockWrite(true, kOkRequest, kSplitPoint), | 305 MockWrite(true, kOkRequest, kSplitPoint), |
| 291 MockWrite(true, kOkRequest + kSplitPoint, | 306 MockWrite(true, kOkRequest + kSplitPoint, |
| 292 arraysize(kOkRequest) - kSplitPoint) | 307 arraysize(kOkRequest) - kSplitPoint) |
| 293 }; | 308 }; |
| 294 MockRead data_reads[] = { | 309 MockRead data_reads[] = { |
| 295 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 310 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 296 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 311 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
| 297 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 312 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 298 data_writes, arraysize(data_writes), | 313 data_writes, arraysize(data_writes), |
| 299 hostname, 80, &net_log_)); | 314 hostname, 80, &net_log_)); |
| 300 int rv = user_sock_->Connect(&callback_); | 315 int rv = user_sock_->Connect(&callback_); |
| 301 EXPECT_EQ(ERR_IO_PENDING, rv); | 316 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 302 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, | 317 net::CapturingNetLog::EntryList net_log_entries; |
| 318 net_log_.GetEntries(&net_log_entries); |
| 319 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 303 NetLog::TYPE_SOCKS5_CONNECT)); | 320 NetLog::TYPE_SOCKS5_CONNECT)); |
| 304 rv = callback_.WaitForResult(); | 321 rv = callback_.WaitForResult(); |
| 305 EXPECT_EQ(OK, rv); | 322 EXPECT_EQ(OK, rv); |
| 306 EXPECT_TRUE(user_sock_->IsConnected()); | 323 EXPECT_TRUE(user_sock_->IsConnected()); |
| 307 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, | 324 net_log_.GetEntries(&net_log_entries); |
| 325 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 308 NetLog::TYPE_SOCKS5_CONNECT)); | 326 NetLog::TYPE_SOCKS5_CONNECT)); |
| 309 } | 327 } |
| 310 | 328 |
| 311 // Test for partial handshake response read | 329 // Test for partial handshake response read |
| 312 { | 330 { |
| 313 const int kSplitPoint = 6; // Break the handshake read into two parts. | 331 const int kSplitPoint = 6; // Break the handshake read into two parts. |
| 314 MockWrite data_writes[] = { | 332 MockWrite data_writes[] = { |
| 315 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 333 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
| 316 MockWrite(true, kOkRequest, arraysize(kOkRequest)) | 334 MockWrite(true, kOkRequest, arraysize(kOkRequest)) |
| 317 }; | 335 }; |
| 318 MockRead data_reads[] = { | 336 MockRead data_reads[] = { |
| 319 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 337 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
| 320 MockRead(true, kSOCKS5OkResponse, kSplitPoint), | 338 MockRead(true, kSOCKS5OkResponse, kSplitPoint), |
| 321 MockRead(true, kSOCKS5OkResponse + kSplitPoint, | 339 MockRead(true, kSOCKS5OkResponse + kSplitPoint, |
| 322 kSOCKS5OkResponseLength - kSplitPoint) | 340 kSOCKS5OkResponseLength - kSplitPoint) |
| 323 }; | 341 }; |
| 324 | 342 |
| 325 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 343 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
| 326 data_writes, arraysize(data_writes), | 344 data_writes, arraysize(data_writes), |
| 327 hostname, 80, &net_log_)); | 345 hostname, 80, &net_log_)); |
| 328 int rv = user_sock_->Connect(&callback_); | 346 int rv = user_sock_->Connect(&callback_); |
| 329 EXPECT_EQ(ERR_IO_PENDING, rv); | 347 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 330 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, | 348 net::CapturingNetLog::EntryList net_log_entries; |
| 349 net_log_.GetEntries(&net_log_entries); |
| 350 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
| 331 NetLog::TYPE_SOCKS5_CONNECT)); | 351 NetLog::TYPE_SOCKS5_CONNECT)); |
| 332 rv = callback_.WaitForResult(); | 352 rv = callback_.WaitForResult(); |
| 333 EXPECT_EQ(OK, rv); | 353 EXPECT_EQ(OK, rv); |
| 334 EXPECT_TRUE(user_sock_->IsConnected()); | 354 EXPECT_TRUE(user_sock_->IsConnected()); |
| 335 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, | 355 net_log_.GetEntries(&net_log_entries); |
| 356 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
| 336 NetLog::TYPE_SOCKS5_CONNECT)); | 357 NetLog::TYPE_SOCKS5_CONNECT)); |
| 337 } | 358 } |
| 338 } | 359 } |
| 339 | 360 |
| 340 } // namespace | 361 } // namespace |
| 341 | 362 |
| 342 } // namespace net | 363 } // namespace net |
| OLD | NEW |