| 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 <map> | 7 #include <map> |
| 8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
| 10 #include <ws2tcpip.h> | 10 #include <ws2tcpip.h> |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 107 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 108 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), | 108 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), |
| 109 MockRead(true, payload_read.data(), payload_read.size()) }; | 109 MockRead(true, payload_read.data(), payload_read.size()) }; |
| 110 | 110 |
| 111 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 111 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
| 112 | 112 |
| 113 // At this state the TCP connection is completed but not the SOCKS handshake. | 113 // At this state the TCP connection is completed but not the SOCKS handshake. |
| 114 EXPECT_TRUE(tcp_sock_->IsConnected()); | 114 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 115 EXPECT_FALSE(user_sock_->IsConnected()); | 115 EXPECT_FALSE(user_sock_->IsConnected()); |
| 116 | 116 |
| 117 scoped_refptr<LoadLog> log(new LoadLog); | 117 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 118 int rv = user_sock_->Connect(&callback_, log); | 118 int rv = user_sock_->Connect(&callback_, log); |
| 119 EXPECT_EQ(ERR_IO_PENDING, rv); | 119 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 120 EXPECT_FALSE(user_sock_->IsConnected()); | 120 EXPECT_FALSE(user_sock_->IsConnected()); |
| 121 EXPECT_TRUE( | 121 EXPECT_TRUE( |
| 122 LogContains(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 122 LogContains(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 123 | 123 |
| 124 rv = callback_.WaitForResult(); | 124 rv = callback_.WaitForResult(); |
| 125 | 125 |
| 126 EXPECT_EQ(OK, rv); | 126 EXPECT_EQ(OK, rv); |
| 127 EXPECT_TRUE(user_sock_->IsConnected()); | 127 EXPECT_TRUE(user_sock_->IsConnected()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 164 |
| 165 MockWrite data_writes[] = { | 165 MockWrite data_writes[] = { |
| 166 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 166 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 167 MockWrite(false, request.data(), request.size()) }; | 167 MockWrite(false, request.data(), request.size()) }; |
| 168 MockRead data_reads[] = { | 168 MockRead data_reads[] = { |
| 169 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 169 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 170 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 170 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 171 | 171 |
| 172 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 172 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 173 | 173 |
| 174 scoped_refptr<LoadLog> log(new LoadLog); | 174 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 175 int rv = user_sock_->Connect(&callback_, log); | 175 int rv = user_sock_->Connect(&callback_, log); |
| 176 EXPECT_EQ(ERR_IO_PENDING, rv); | 176 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 177 EXPECT_TRUE(LogContains( | 177 EXPECT_TRUE(LogContains( |
| 178 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 178 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 179 rv = callback_.WaitForResult(); | 179 rv = callback_.WaitForResult(); |
| 180 EXPECT_EQ(OK, rv); | 180 EXPECT_EQ(OK, rv); |
| 181 EXPECT_TRUE(user_sock_->IsConnected()); | 181 EXPECT_TRUE(user_sock_->IsConnected()); |
| 182 EXPECT_EQ(SOCKS5ClientSocket::kEndPointFailedDomain, | 182 EXPECT_EQ(SOCKS5ClientSocket::kEndPointFailedDomain, |
| 183 user_sock_->address_type_); | 183 user_sock_->address_type_); |
| 184 EXPECT_TRUE(LogContains( | 184 EXPECT_TRUE(LogContains( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 201 | 201 |
| 202 MockWrite data_writes[] = { | 202 MockWrite data_writes[] = { |
| 203 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 203 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 204 MockWrite(false, request.data(), request.size()) }; | 204 MockWrite(false, request.data(), request.size()) }; |
| 205 MockRead data_reads[] = { | 205 MockRead data_reads[] = { |
| 206 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 206 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 207 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 207 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 208 | 208 |
| 209 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 209 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 210 | 210 |
| 211 scoped_refptr<LoadLog> log(new LoadLog); | 211 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 212 int rv = user_sock_->Connect(&callback_, log); | 212 int rv = user_sock_->Connect(&callback_, log); |
| 213 EXPECT_EQ(ERR_IO_PENDING, rv); | 213 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 214 EXPECT_TRUE(LogContains( | 214 EXPECT_TRUE(LogContains( |
| 215 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 215 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 216 rv = callback_.WaitForResult(); | 216 rv = callback_.WaitForResult(); |
| 217 EXPECT_EQ(OK, rv); | 217 EXPECT_EQ(OK, rv); |
| 218 EXPECT_TRUE(user_sock_->IsConnected()); | 218 EXPECT_TRUE(user_sock_->IsConnected()); |
| 219 EXPECT_EQ(SOCKS5ClientSocket::kEndPointResolvedIPv6, | 219 EXPECT_EQ(SOCKS5ClientSocket::kEndPointResolvedIPv6, |
| 220 user_sock_->address_type_); | 220 user_sock_->address_type_); |
| 221 EXPECT_TRUE(LogContains( | 221 EXPECT_TRUE(LogContains( |
| 222 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 222 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 223 } | 223 } |
| 224 | 224 |
| 225 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 225 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
| 226 const std::string hostname = "www.google.com"; | 226 const std::string hostname = "www.google.com"; |
| 227 | 227 |
| 228 // Test for partial greet request write | 228 // Test for partial greet request write |
| 229 { | 229 { |
| 230 const char partial1[] = { 0x05, 0x01 }; | 230 const char partial1[] = { 0x05, 0x01 }; |
| 231 const char partial2[] = { 0x00 }; | 231 const char partial2[] = { 0x00 }; |
| 232 MockWrite data_writes[] = { | 232 MockWrite data_writes[] = { |
| 233 MockWrite(true, arraysize(partial1)), | 233 MockWrite(true, arraysize(partial1)), |
| 234 MockWrite(true, partial2, arraysize(partial2)), | 234 MockWrite(true, partial2, arraysize(partial2)), |
| 235 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 235 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 236 MockRead data_reads[] = { | 236 MockRead data_reads[] = { |
| 237 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 237 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 238 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 238 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 239 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 239 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 240 scoped_refptr<LoadLog> log(new LoadLog); | 240 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 241 int rv = user_sock_->Connect(&callback_, log); | 241 int rv = user_sock_->Connect(&callback_, log); |
| 242 EXPECT_EQ(ERR_IO_PENDING, rv); | 242 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 243 EXPECT_TRUE(LogContains( | 243 EXPECT_TRUE(LogContains( |
| 244 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 244 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 245 rv = callback_.WaitForResult(); | 245 rv = callback_.WaitForResult(); |
| 246 EXPECT_EQ(OK, rv); | 246 EXPECT_EQ(OK, rv); |
| 247 EXPECT_TRUE(user_sock_->IsConnected()); | 247 EXPECT_TRUE(user_sock_->IsConnected()); |
| 248 EXPECT_TRUE(LogContains( | 248 EXPECT_TRUE(LogContains( |
| 249 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 249 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 250 } | 250 } |
| 251 | 251 |
| 252 // Test for partial greet response read | 252 // Test for partial greet response read |
| 253 { | 253 { |
| 254 const char partial1[] = { 0x05 }; | 254 const char partial1[] = { 0x05 }; |
| 255 const char partial2[] = { 0x00 }; | 255 const char partial2[] = { 0x00 }; |
| 256 MockWrite data_writes[] = { | 256 MockWrite data_writes[] = { |
| 257 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 257 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 258 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 258 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 259 MockRead data_reads[] = { | 259 MockRead data_reads[] = { |
| 260 MockRead(true, partial1, arraysize(partial1)), | 260 MockRead(true, partial1, arraysize(partial1)), |
| 261 MockRead(true, partial2, arraysize(partial2)), | 261 MockRead(true, partial2, arraysize(partial2)), |
| 262 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 262 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 263 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 263 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 264 scoped_refptr<LoadLog> log(new LoadLog); | 264 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 265 int rv = user_sock_->Connect(&callback_, log); | 265 int rv = user_sock_->Connect(&callback_, log); |
| 266 EXPECT_EQ(ERR_IO_PENDING, rv); | 266 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 267 EXPECT_TRUE(LogContains( | 267 EXPECT_TRUE(LogContains( |
| 268 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 268 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 269 rv = callback_.WaitForResult(); | 269 rv = callback_.WaitForResult(); |
| 270 EXPECT_EQ(OK, rv); | 270 EXPECT_EQ(OK, rv); |
| 271 EXPECT_TRUE(user_sock_->IsConnected()); | 271 EXPECT_TRUE(user_sock_->IsConnected()); |
| 272 EXPECT_TRUE(LogContains( | 272 EXPECT_TRUE(LogContains( |
| 273 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 273 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 274 } | 274 } |
| 275 | 275 |
| 276 // Test for partial handshake request write | 276 // Test for partial handshake request write |
| 277 { | 277 { |
| 278 const char partial1[] = { 0x05, 0x01, 0x00 }; | 278 const char partial1[] = { 0x05, 0x01, 0x00 }; |
| 279 const char partial2[] = { 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 279 const char partial2[] = { 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
| 280 MockWrite data_writes[] = { | 280 MockWrite data_writes[] = { |
| 281 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 281 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 282 MockWrite(true, arraysize(partial1)), | 282 MockWrite(true, arraysize(partial1)), |
| 283 MockWrite(true, partial2, arraysize(partial2)) }; | 283 MockWrite(true, partial2, arraysize(partial2)) }; |
| 284 MockRead data_reads[] = { | 284 MockRead data_reads[] = { |
| 285 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 285 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 286 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; | 286 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; |
| 287 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 287 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 288 scoped_refptr<LoadLog> log(new LoadLog); | 288 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 289 int rv = user_sock_->Connect(&callback_, log); | 289 int rv = user_sock_->Connect(&callback_, log); |
| 290 EXPECT_EQ(ERR_IO_PENDING, rv); | 290 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 291 EXPECT_TRUE(LogContains( | 291 EXPECT_TRUE(LogContains( |
| 292 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 292 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 293 rv = callback_.WaitForResult(); | 293 rv = callback_.WaitForResult(); |
| 294 EXPECT_EQ(OK, rv); | 294 EXPECT_EQ(OK, rv); |
| 295 EXPECT_TRUE(user_sock_->IsConnected()); | 295 EXPECT_TRUE(user_sock_->IsConnected()); |
| 296 EXPECT_TRUE(LogContains( | 296 EXPECT_TRUE(LogContains( |
| 297 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 297 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 298 } | 298 } |
| 299 | 299 |
| 300 // Test for partial handshake response read | 300 // Test for partial handshake response read |
| 301 { | 301 { |
| 302 const char partial1[] = { 0x05, 0x00, 0x00, 0x01, 127, 0 }; | 302 const char partial1[] = { 0x05, 0x00, 0x00, 0x01, 127, 0 }; |
| 303 const char partial2[] = { 0, 1, 0x00, 0x50 }; | 303 const char partial2[] = { 0, 1, 0x00, 0x50 }; |
| 304 MockWrite data_writes[] = { | 304 MockWrite data_writes[] = { |
| 305 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), | 305 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), |
| 306 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; | 306 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; |
| 307 MockRead data_reads[] = { | 307 MockRead data_reads[] = { |
| 308 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), | 308 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), |
| 309 MockRead(true, partial1, arraysize(partial1)), | 309 MockRead(true, partial1, arraysize(partial1)), |
| 310 MockRead(true, partial2, arraysize(partial2)) }; | 310 MockRead(true, partial2, arraysize(partial2)) }; |
| 311 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 311 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 312 scoped_refptr<LoadLog> log(new LoadLog); | 312 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
| 313 int rv = user_sock_->Connect(&callback_, log); | 313 int rv = user_sock_->Connect(&callback_, log); |
| 314 EXPECT_EQ(ERR_IO_PENDING, rv); | 314 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 315 EXPECT_TRUE(LogContains( | 315 EXPECT_TRUE(LogContains( |
| 316 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); | 316 *log, 0, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_BEGIN)); |
| 317 rv = callback_.WaitForResult(); | 317 rv = callback_.WaitForResult(); |
| 318 EXPECT_EQ(OK, rv); | 318 EXPECT_EQ(OK, rv); |
| 319 EXPECT_TRUE(user_sock_->IsConnected()); | 319 EXPECT_TRUE(user_sock_->IsConnected()); |
| 320 EXPECT_TRUE(LogContains( | 320 EXPECT_TRUE(LogContains( |
| 321 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); | 321 *log, -1, LoadLog::TYPE_SOCKS5_CONNECT, LoadLog::PHASE_END)); |
| 322 } | 322 } |
| 323 } | 323 } |
| 324 | 324 |
| 325 } // namespace net | 325 } // namespace net |
| OLD | NEW |