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 |