OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // TODO(ukai): code is similar with http_network_transaction.cc. We should | 5 // TODO(ukai): code is similar with http_network_transaction.cc. We should |
6 // think about ways to share code, if possible. | 6 // think about ways to share code, if possible. |
7 | 7 |
8 #include "net/socket_stream/socket_stream.h" | 8 #include "net/socket_stream/socket_stream.h" |
9 | 9 |
10 #include <set> | 10 #include <set> |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 "The current MessageLoop must be TYPE_IO"; | 140 "The current MessageLoop must be TYPE_IO"; |
141 if (context_) { | 141 if (context_) { |
142 ssl_config_service()->GetSSLConfig(&server_ssl_config_); | 142 ssl_config_service()->GetSSLConfig(&server_ssl_config_); |
143 proxy_ssl_config_ = server_ssl_config_; | 143 proxy_ssl_config_ = server_ssl_config_; |
144 } | 144 } |
145 DCHECK_EQ(next_state_, STATE_NONE); | 145 DCHECK_EQ(next_state_, STATE_NONE); |
146 | 146 |
147 AddRef(); // Released in Finish() | 147 AddRef(); // Released in Finish() |
148 // Open a connection asynchronously, so that delegate won't be called | 148 // Open a connection asynchronously, so that delegate won't be called |
149 // back before returning Connect(). | 149 // back before returning Connect(). |
150 next_state_ = STATE_RESOLVE_PROXY; | 150 next_state_ = STATE_BEFORE_CONNECT; |
151 net_log_.BeginEvent( | 151 net_log_.BeginEvent( |
152 NetLog::TYPE_SOCKET_STREAM_CONNECT, | 152 NetLog::TYPE_SOCKET_STREAM_CONNECT, |
153 make_scoped_refptr( | 153 make_scoped_refptr( |
154 new NetLogStringParameter("url", url_.possibly_invalid_spec()))); | 154 new NetLogStringParameter("url", url_.possibly_invalid_spec()))); |
155 MessageLoop::current()->PostTask( | 155 MessageLoop::current()->PostTask( |
156 FROM_HERE, | 156 FROM_HERE, |
157 base::Bind(&SocketStream::DoLoop, this, OK)); | 157 base::Bind(&SocketStream::DoLoop, this, OK)); |
158 } | 158 } |
159 | 159 |
160 bool SocketStream::SendData(const char* data, int len) { | 160 bool SocketStream::SendData(const char* data, int len) { |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 if (!context_) | 403 if (!context_) |
404 next_state_ = STATE_CLOSE; | 404 next_state_ = STATE_CLOSE; |
405 | 405 |
406 if (next_state_ == STATE_NONE) | 406 if (next_state_ == STATE_NONE) |
407 return; | 407 return; |
408 | 408 |
409 do { | 409 do { |
410 State state = next_state_; | 410 State state = next_state_; |
411 next_state_ = STATE_NONE; | 411 next_state_ = STATE_NONE; |
412 switch (state) { | 412 switch (state) { |
| 413 case STATE_BEFORE_CONNECT: |
| 414 DCHECK_EQ(OK, result); |
| 415 result = DoBeforeConnect(); |
| 416 break; |
| 417 case STATE_BEFORE_CONNECT_COMPLETE: |
| 418 result = DoBeforeConnectComplete(result); |
| 419 break; |
413 case STATE_RESOLVE_PROXY: | 420 case STATE_RESOLVE_PROXY: |
414 DCHECK_EQ(OK, result); | 421 DCHECK_EQ(OK, result); |
415 result = DoResolveProxy(); | 422 result = DoResolveProxy(); |
416 break; | 423 break; |
417 case STATE_RESOLVE_PROXY_COMPLETE: | 424 case STATE_RESOLVE_PROXY_COMPLETE: |
418 result = DoResolveProxyComplete(result); | 425 result = DoResolveProxyComplete(result); |
419 break; | 426 break; |
420 case STATE_RESOLVE_HOST: | 427 case STATE_RESOLVE_HOST: |
421 DCHECK_EQ(OK, result); | 428 DCHECK_EQ(OK, result); |
422 result = DoResolveHost(); | 429 result = DoResolveHost(); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 continue; | 511 continue; |
505 // If the connection is not established yet and had actual errors, | 512 // If the connection is not established yet and had actual errors, |
506 // record the error. In next iteration, it will close the connection. | 513 // record the error. In next iteration, it will close the connection. |
507 if (state != STATE_READ_WRITE && result < ERR_IO_PENDING) { | 514 if (state != STATE_READ_WRITE && result < ERR_IO_PENDING) { |
508 net_log_.EndEventWithNetErrorCode( | 515 net_log_.EndEventWithNetErrorCode( |
509 NetLog::TYPE_SOCKET_STREAM_CONNECT, result); | 516 NetLog::TYPE_SOCKET_STREAM_CONNECT, result); |
510 } | 517 } |
511 } while (result != ERR_IO_PENDING); | 518 } while (result != ERR_IO_PENDING); |
512 } | 519 } |
513 | 520 |
| 521 int SocketStream::DoBeforeConnect() { |
| 522 next_state_ = STATE_BEFORE_CONNECT_COMPLETE; |
| 523 if (!context_ || !context_->network_delegate()) |
| 524 return OK; |
| 525 |
| 526 int result = context_->network_delegate()->NotifyBeforeSocketStreamConnect( |
| 527 this, io_callback_); |
| 528 if (result != OK && result != ERR_IO_PENDING) |
| 529 next_state_ = STATE_CLOSE; |
| 530 |
| 531 return result; |
| 532 } |
| 533 |
| 534 int SocketStream::DoBeforeConnectComplete(int result) { |
| 535 DCHECK_NE(ERR_IO_PENDING, result); |
| 536 |
| 537 if (result == OK) |
| 538 next_state_ = STATE_RESOLVE_PROXY; |
| 539 else |
| 540 next_state_ = STATE_CLOSE; |
| 541 |
| 542 return result; |
| 543 } |
| 544 |
514 int SocketStream::DoResolveProxy() { | 545 int SocketStream::DoResolveProxy() { |
515 DCHECK(!pac_request_); | 546 DCHECK(!pac_request_); |
516 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; | 547 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; |
517 | 548 |
518 if (!proxy_url_.is_valid()) { | 549 if (!proxy_url_.is_valid()) { |
519 next_state_ = STATE_CLOSE; | 550 next_state_ = STATE_CLOSE; |
520 return ERR_INVALID_ARGUMENT; | 551 return ERR_INVALID_ARGUMENT; |
521 } | 552 } |
522 | 553 |
523 // TODO(toyoshim): Check server advertisement of SPDY through the HTTP | 554 // TODO(toyoshim): Check server advertisement of SPDY through the HTTP |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 | 1287 |
1257 SSLConfigService* SocketStream::ssl_config_service() const { | 1288 SSLConfigService* SocketStream::ssl_config_service() const { |
1258 return context_->ssl_config_service(); | 1289 return context_->ssl_config_service(); |
1259 } | 1290 } |
1260 | 1291 |
1261 ProxyService* SocketStream::proxy_service() const { | 1292 ProxyService* SocketStream::proxy_service() const { |
1262 return context_->proxy_service(); | 1293 return context_->proxy_service(); |
1263 } | 1294 } |
1264 | 1295 |
1265 } // namespace net | 1296 } // namespace net |
OLD | NEW |