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 |