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/socks_client_socket.h" | 5 #include "net/socket/socks_client_socket.h" |
6 | 6 |
7 #include "net/base/address_list.h" | 7 #include "net/base/address_list.h" |
| 8 #include "net/base/load_log.h" |
| 9 #include "net/base/load_log_unittest.h" |
8 #include "net/base/mock_host_resolver.h" | 10 #include "net/base/mock_host_resolver.h" |
9 #include "net/base/test_completion_callback.h" | 11 #include "net/base/test_completion_callback.h" |
10 #include "net/base/winsock_init.h" | 12 #include "net/base/winsock_init.h" |
11 #include "net/socket/client_socket_factory.h" | 13 #include "net/socket/client_socket_factory.h" |
12 #include "net/socket/tcp_client_socket.h" | 14 #include "net/socket/tcp_client_socket.h" |
13 #include "net/socket/socket_test_util.h" | 15 #include "net/socket/socket_test_util.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "testing/platform_test.h" | 17 #include "testing/platform_test.h" |
16 | 18 |
17 //----------------------------------------------------------------------------- | 19 //----------------------------------------------------------------------------- |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( | 57 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( |
56 MockRead reads[], | 58 MockRead reads[], |
57 MockWrite writes[], | 59 MockWrite writes[], |
58 const std::string& hostname, | 60 const std::string& hostname, |
59 int port) { | 61 int port) { |
60 | 62 |
61 TestCompletionCallback callback; | 63 TestCompletionCallback callback; |
62 mock_socket_.reset(new StaticMockSocket(reads, writes)); | 64 mock_socket_.reset(new StaticMockSocket(reads, writes)); |
63 tcp_sock_ = new MockTCPClientSocket(address_list_, mock_socket_.get()); | 65 tcp_sock_ = new MockTCPClientSocket(address_list_, mock_socket_.get()); |
64 | 66 |
65 int rv = tcp_sock_->Connect(&callback); | 67 int rv = tcp_sock_->Connect(&callback, NULL); |
66 EXPECT_EQ(ERR_IO_PENDING, rv); | 68 EXPECT_EQ(ERR_IO_PENDING, rv); |
67 rv = callback.WaitForResult(); | 69 rv = callback.WaitForResult(); |
68 EXPECT_EQ(OK, rv); | 70 EXPECT_EQ(OK, rv); |
69 EXPECT_TRUE(tcp_sock_->IsConnected()); | 71 EXPECT_TRUE(tcp_sock_->IsConnected()); |
70 | 72 |
71 return new SOCKSClientSocket(tcp_sock_, | 73 return new SOCKSClientSocket(tcp_sock_, |
72 HostResolver::RequestInfo(hostname, port), | 74 HostResolver::RequestInfo(hostname, port), |
73 host_resolver_); | 75 host_resolver_); |
74 } | 76 } |
75 | 77 |
76 // Tests a complete handshake and the disconnection. | 78 // Tests a complete handshake and the disconnection. |
77 TEST_F(SOCKSClientSocketTest, CompleteHandshake) { | 79 TEST_F(SOCKSClientSocketTest, CompleteHandshake) { |
78 const std::string payload_write = "random data"; | 80 const std::string payload_write = "random data"; |
79 const std::string payload_read = "moar random data"; | 81 const std::string payload_read = "moar random data"; |
80 | 82 |
81 MockWrite data_writes[] = { | 83 MockWrite data_writes[] = { |
82 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), | 84 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), |
83 MockWrite(true, payload_write.data(), payload_write.size()) }; | 85 MockWrite(true, payload_write.data(), payload_write.size()) }; |
84 MockRead data_reads[] = { | 86 MockRead data_reads[] = { |
85 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), | 87 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), |
86 MockRead(true, payload_read.data(), payload_read.size()) }; | 88 MockRead(true, payload_read.data(), payload_read.size()) }; |
87 | 89 |
88 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 90 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
89 | 91 |
90 // At this state the TCP connection is completed but not the SOCKS handshake. | 92 // At this state the TCP connection is completed but not the SOCKS handshake. |
91 EXPECT_TRUE(tcp_sock_->IsConnected()); | 93 EXPECT_TRUE(tcp_sock_->IsConnected()); |
92 EXPECT_FALSE(user_sock_->IsConnected()); | 94 EXPECT_FALSE(user_sock_->IsConnected()); |
93 | 95 |
94 int rv = user_sock_->Connect(&callback_); | 96 scoped_refptr<LoadLog> log(new LoadLog); |
| 97 int rv = user_sock_->Connect(&callback_, log); |
95 EXPECT_EQ(ERR_IO_PENDING, rv); | 98 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 99 EXPECT_TRUE( |
| 100 LogContains(*log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
96 EXPECT_FALSE(user_sock_->IsConnected()); | 101 EXPECT_FALSE(user_sock_->IsConnected()); |
97 rv = callback_.WaitForResult(); | 102 rv = callback_.WaitForResult(); |
98 | 103 |
99 EXPECT_EQ(OK, rv); | 104 EXPECT_EQ(OK, rv); |
100 EXPECT_TRUE(user_sock_->IsConnected()); | 105 EXPECT_TRUE(user_sock_->IsConnected()); |
101 EXPECT_EQ(SOCKSClientSocket::kSOCKS4, user_sock_->socks_version_); | 106 EXPECT_EQ(SOCKSClientSocket::kSOCKS4, user_sock_->socks_version_); |
| 107 EXPECT_TRUE(LogContains( |
| 108 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
102 | 109 |
103 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); | 110 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); |
104 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 111 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
105 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 112 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
106 EXPECT_EQ(ERR_IO_PENDING, rv); | 113 EXPECT_EQ(ERR_IO_PENDING, rv); |
107 rv = callback_.WaitForResult(); | 114 rv = callback_.WaitForResult(); |
108 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 115 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
109 | 116 |
110 buffer = new IOBuffer(payload_read.size()); | 117 buffer = new IOBuffer(payload_read.size()); |
111 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); | 118 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); |
(...skipping 28 matching lines...) Expand all Loading... |
140 | 147 |
141 //--------------------------------------- | 148 //--------------------------------------- |
142 | 149 |
143 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 150 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
144 MockWrite data_writes[] = { | 151 MockWrite data_writes[] = { |
145 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 152 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
146 MockRead data_reads[] = { | 153 MockRead data_reads[] = { |
147 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; | 154 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; |
148 | 155 |
149 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 156 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
| 157 scoped_refptr<LoadLog> log(new LoadLog); |
150 | 158 |
151 int rv = user_sock_->Connect(&callback_); | 159 int rv = user_sock_->Connect(&callback_, log); |
152 EXPECT_EQ(ERR_IO_PENDING, rv); | 160 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 161 EXPECT_TRUE(LogContains( |
| 162 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
153 rv = callback_.WaitForResult(); | 163 rv = callback_.WaitForResult(); |
154 EXPECT_EQ(tests[i].fail_code, rv); | 164 EXPECT_EQ(tests[i].fail_code, rv); |
155 EXPECT_FALSE(user_sock_->IsConnected()); | 165 EXPECT_FALSE(user_sock_->IsConnected()); |
156 EXPECT_TRUE(tcp_sock_->IsConnected()); | 166 EXPECT_TRUE(tcp_sock_->IsConnected()); |
| 167 EXPECT_TRUE(LogContains( |
| 168 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
157 } | 169 } |
158 } | 170 } |
159 | 171 |
160 // Tests scenario when the server sends the handshake response in | 172 // Tests scenario when the server sends the handshake response in |
161 // more than one packet. | 173 // more than one packet. |
162 TEST_F(SOCKSClientSocketTest, PartialServerReads) { | 174 TEST_F(SOCKSClientSocketTest, PartialServerReads) { |
163 const char kSOCKSPartialReply1[] = { 0x00 }; | 175 const char kSOCKSPartialReply1[] = { 0x00 }; |
164 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 176 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
165 | 177 |
166 MockWrite data_writes[] = { | 178 MockWrite data_writes[] = { |
167 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 179 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
168 MockRead data_reads[] = { | 180 MockRead data_reads[] = { |
169 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), | 181 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), |
170 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; | 182 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; |
171 | 183 |
172 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 184 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
| 185 scoped_refptr<LoadLog> log(new LoadLog); |
173 | 186 |
174 int rv = user_sock_->Connect(&callback_); | 187 int rv = user_sock_->Connect(&callback_, log); |
175 EXPECT_EQ(ERR_IO_PENDING, rv); | 188 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 189 EXPECT_TRUE(LogContains( |
| 190 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
176 rv = callback_.WaitForResult(); | 191 rv = callback_.WaitForResult(); |
177 EXPECT_EQ(OK, rv); | 192 EXPECT_EQ(OK, rv); |
178 EXPECT_TRUE(user_sock_->IsConnected()); | 193 EXPECT_TRUE(user_sock_->IsConnected()); |
| 194 EXPECT_TRUE(LogContains( |
| 195 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
179 } | 196 } |
180 | 197 |
181 // Tests scenario when the client sends the handshake request in | 198 // Tests scenario when the client sends the handshake request in |
182 // more than one packet. | 199 // more than one packet. |
183 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { | 200 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { |
184 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; | 201 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; |
185 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; | 202 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; |
186 | 203 |
187 MockWrite data_writes[] = { | 204 MockWrite data_writes[] = { |
188 MockWrite(true, arraysize(kSOCKSPartialRequest1)), | 205 MockWrite(true, arraysize(kSOCKSPartialRequest1)), |
189 // simulate some empty writes | 206 // simulate some empty writes |
190 MockWrite(true, 0), | 207 MockWrite(true, 0), |
191 MockWrite(true, 0), | 208 MockWrite(true, 0), |
192 MockWrite(true, kSOCKSPartialRequest2, | 209 MockWrite(true, kSOCKSPartialRequest2, |
193 arraysize(kSOCKSPartialRequest2)) }; | 210 arraysize(kSOCKSPartialRequest2)) }; |
194 MockRead data_reads[] = { | 211 MockRead data_reads[] = { |
195 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 212 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
196 | 213 |
197 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 214 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
| 215 scoped_refptr<LoadLog> log(new LoadLog); |
198 | 216 |
199 int rv = user_sock_->Connect(&callback_); | 217 int rv = user_sock_->Connect(&callback_, log); |
200 EXPECT_EQ(ERR_IO_PENDING, rv); | 218 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 219 EXPECT_TRUE(LogContains( |
| 220 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
201 rv = callback_.WaitForResult(); | 221 rv = callback_.WaitForResult(); |
202 EXPECT_EQ(OK, rv); | 222 EXPECT_EQ(OK, rv); |
203 EXPECT_TRUE(user_sock_->IsConnected()); | 223 EXPECT_TRUE(user_sock_->IsConnected()); |
| 224 EXPECT_TRUE(LogContains( |
| 225 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
204 } | 226 } |
205 | 227 |
206 // Tests the case when the server sends a smaller sized handshake data | 228 // Tests the case when the server sends a smaller sized handshake data |
207 // and closes the connection. | 229 // and closes the connection. |
208 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { | 230 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { |
209 MockWrite data_writes[] = { | 231 MockWrite data_writes[] = { |
210 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 232 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
211 MockRead data_reads[] = { | 233 MockRead data_reads[] = { |
212 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), | 234 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), |
213 // close connection unexpectedly | 235 // close connection unexpectedly |
214 MockRead(false, 0) }; | 236 MockRead(false, 0) }; |
215 | 237 |
216 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); | 238 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); |
| 239 scoped_refptr<LoadLog> log(new LoadLog); |
217 | 240 |
218 int rv = user_sock_->Connect(&callback_); | 241 int rv = user_sock_->Connect(&callback_, log); |
219 EXPECT_EQ(ERR_IO_PENDING, rv); | 242 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 243 EXPECT_TRUE(LogContains( |
| 244 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
220 rv = callback_.WaitForResult(); | 245 rv = callback_.WaitForResult(); |
221 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); | 246 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); |
222 EXPECT_FALSE(user_sock_->IsConnected()); | 247 EXPECT_FALSE(user_sock_->IsConnected()); |
| 248 EXPECT_TRUE(LogContains( |
| 249 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
223 } | 250 } |
224 | 251 |
225 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. | 252 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. |
226 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { | 253 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { |
227 const char hostname[] = "unresolved.ipv4.address"; | 254 const char hostname[] = "unresolved.ipv4.address"; |
228 | 255 |
229 host_resolver_->rules()->AddSimulatedFailure(hostname); | 256 host_resolver_->rules()->AddSimulatedFailure(hostname); |
230 | 257 |
231 std::string request(kSOCKS4aInitialRequest, | 258 std::string request(kSOCKS4aInitialRequest, |
232 arraysize(kSOCKS4aInitialRequest)); | 259 arraysize(kSOCKS4aInitialRequest)); |
233 request.append(hostname, arraysize(hostname)); | 260 request.append(hostname, arraysize(hostname)); |
234 | 261 |
235 MockWrite data_writes[] = { | 262 MockWrite data_writes[] = { |
236 MockWrite(false, request.data(), request.size()) }; | 263 MockWrite(false, request.data(), request.size()) }; |
237 MockRead data_reads[] = { | 264 MockRead data_reads[] = { |
238 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 265 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
239 | 266 |
240 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 267 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 268 scoped_refptr<LoadLog> log(new LoadLog); |
241 | 269 |
242 int rv = user_sock_->Connect(&callback_); | 270 int rv = user_sock_->Connect(&callback_, log); |
243 EXPECT_EQ(ERR_IO_PENDING, rv); | 271 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 272 EXPECT_TRUE(LogContains( |
| 273 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
244 rv = callback_.WaitForResult(); | 274 rv = callback_.WaitForResult(); |
245 EXPECT_EQ(OK, rv); | 275 EXPECT_EQ(OK, rv); |
246 EXPECT_TRUE(user_sock_->IsConnected()); | 276 EXPECT_TRUE(user_sock_->IsConnected()); |
247 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 277 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
| 278 EXPECT_TRUE(LogContains( |
| 279 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
248 } | 280 } |
249 | 281 |
250 // Tries to connect to a domain that resolves to IPv6. | 282 // Tries to connect to a domain that resolves to IPv6. |
251 // Should revert to SOCKS4a. | 283 // Should revert to SOCKS4a. |
252 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { | 284 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { |
253 const char hostname[] = "an.ipv6.address"; | 285 const char hostname[] = "an.ipv6.address"; |
254 | 286 |
255 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); | 287 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); |
256 | 288 |
257 std::string request(kSOCKS4aInitialRequest, | 289 std::string request(kSOCKS4aInitialRequest, |
258 arraysize(kSOCKS4aInitialRequest)); | 290 arraysize(kSOCKS4aInitialRequest)); |
259 request.append(hostname, arraysize(hostname)); | 291 request.append(hostname, arraysize(hostname)); |
260 | 292 |
261 MockWrite data_writes[] = { | 293 MockWrite data_writes[] = { |
262 MockWrite(false, request.data(), request.size()) }; | 294 MockWrite(false, request.data(), request.size()) }; |
263 MockRead data_reads[] = { | 295 MockRead data_reads[] = { |
264 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 296 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
265 | 297 |
266 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); | 298 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); |
| 299 scoped_refptr<LoadLog> log(new LoadLog); |
267 | 300 |
268 int rv = user_sock_->Connect(&callback_); | 301 int rv = user_sock_->Connect(&callback_, log); |
269 EXPECT_EQ(ERR_IO_PENDING, rv); | 302 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 303 EXPECT_TRUE(LogContains( |
| 304 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); |
270 rv = callback_.WaitForResult(); | 305 rv = callback_.WaitForResult(); |
271 EXPECT_EQ(OK, rv); | 306 EXPECT_EQ(OK, rv); |
272 EXPECT_TRUE(user_sock_->IsConnected()); | 307 EXPECT_TRUE(user_sock_->IsConnected()); |
273 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 308 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
| 309 EXPECT_TRUE(LogContains( |
| 310 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); |
274 } | 311 } |
275 | 312 |
276 } // namespace net | 313 } // namespace net |
277 | |
OLD | NEW |