Home | History | Annotate | Download | only in socket_stream
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 //
      5 // TODO(ukai): code is similar with http_network_transaction.cc.  We should
      6 //   think about ways to share code, if possible.
      7 
      8 #include "net/socket_stream/socket_stream.h"
      9 
     10 #include <set>
     11 #include <string>
     12 
     13 #include "base/compiler_specific.h"
     14 #include "base/logging.h"
     15 #include "base/message_loop.h"
     16 #include "base/string_util.h"
     17 #include "base/stringprintf.h"
     18 #include "base/utf_string_conversions.h"
     19 #include "net/base/auth.h"
     20 #include "net/base/host_resolver.h"
     21 #include "net/base/io_buffer.h"
     22 #include "net/base/net_errors.h"
     23 #include "net/base/net_util.h"
     24 #include "net/http/http_auth_handler_factory.h"
     25 #include "net/http/http_request_info.h"
     26 #include "net/http/http_response_headers.h"
     27 #include "net/http/http_util.h"
     28 #include "net/socket/client_socket_factory.h"
     29 #include "net/socket/socks5_client_socket.h"
     30 #include "net/socket/socks_client_socket.h"
     31 #include "net/socket/ssl_client_socket.h"
     32 #include "net/socket/tcp_client_socket.h"
     33 #include "net/socket_stream/socket_stream_metrics.h"
     34 #include "net/url_request/url_request.h"
     35 
     36 static const int kMaxPendingSendAllowed = 32768;  // 32 kilobytes.
     37 static const int kReadBufferSize = 4096;
     38 
     39 namespace net {
     40 
     41 SocketStream::ResponseHeaders::ResponseHeaders() : IOBuffer() {}
     42 
     43 void SocketStream::ResponseHeaders::Realloc(size_t new_size) {
     44   headers_.reset(static_cast<char*>(realloc(headers_.release(), new_size)));
     45 }
     46 
     47 SocketStream::ResponseHeaders::~ResponseHeaders() { data_ = NULL; }
     48 
     49 SocketStream::SocketStream(const GURL& url, Delegate* delegate)
     50     : delegate_(delegate),
     51       url_(url),
     52       max_pending_send_allowed_(kMaxPendingSendAllowed),
     53       next_state_(STATE_NONE),
     54       host_resolver_(NULL),
     55       cert_verifier_(NULL),
     56       http_auth_handler_factory_(NULL),
     57       factory_(ClientSocketFactory::GetDefaultFactory()),
     58       proxy_mode_(kDirectConnection),
     59       proxy_url_(url),
     60       pac_request_(NULL),
     61       ALLOW_THIS_IN_INITIALIZER_LIST(
     62           io_callback_(this, &SocketStream::OnIOCompleted)),
     63       ALLOW_THIS_IN_INITIALIZER_LIST(
     64           read_callback_(this, &SocketStream::OnReadCompleted)),
     65       ALLOW_THIS_IN_INITIALIZER_LIST(
     66           write_callback_(this, &SocketStream::OnWriteCompleted)),
     67       read_buf_(NULL),
     68       write_buf_(NULL),
     69       current_write_buf_(NULL),
     70       write_buf_offset_(0),
     71       write_buf_size_(0),
     72       closing_(false),
     73       server_closed_(false),
     74       metrics_(new SocketStreamMetrics(url)) {
     75   DCHECK(MessageLoop::current()) <<
     76       "The current MessageLoop must exist";
     77   DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
     78       "The current MessageLoop must be TYPE_IO";
     79   DCHECK(delegate_);
     80 }
     81 
     82 SocketStream::UserData* SocketStream::GetUserData(
     83     const void* key) const {
     84   UserDataMap::const_iterator found = user_data_.find(key);
     85   if (found != user_data_.end())
     86     return found->second.get();
     87   return NULL;
     88 }
     89 
     90 void SocketStream::SetUserData(const void* key, UserData* data) {
     91   user_data_[key] = linked_ptr<UserData>(data);
     92 }
     93 
     94 bool SocketStream::is_secure() const {
     95   return url_.SchemeIs("wss");
     96 }
     97 
     98 void SocketStream::set_context(URLRequestContext* context) {
     99   scoped_refptr<URLRequestContext> prev_context = context_;
    100 
    101   context_ = context;
    102 
    103   if (prev_context != context) {
    104     if (prev_context && pac_request_) {
    105       prev_context->proxy_service()->CancelPacRequest(pac_request_);
    106       pac_request_ = NULL;
    107     }
    108 
    109     net_log_.EndEvent(NetLog::TYPE_REQUEST_ALIVE, NULL);
    110     net_log_ = BoundNetLog();
    111 
    112     if (context) {
    113       net_log_ = BoundNetLog::Make(
    114           context->net_log(),
    115           NetLog::SOURCE_SOCKET_STREAM);
    116 
    117       net_log_.BeginEvent(NetLog::TYPE_REQUEST_ALIVE, NULL);
    118     }
    119   }
    120 
    121   if (context_) {
    122     host_resolver_ = context_->host_resolver();
    123     cert_verifier_ = context_->cert_verifier();
    124     http_auth_handler_factory_ = context_->http_auth_handler_factory();
    125   }
    126 }
    127 
    128 void SocketStream::Connect() {
    129   DCHECK(MessageLoop::current()) <<
    130       "The current MessageLoop must exist";
    131   DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
    132       "The current MessageLoop must be TYPE_IO";
    133   if (context_)
    134     ssl_config_service()->GetSSLConfig(&ssl_config_);
    135   DCHECK_EQ(next_state_, STATE_NONE);
    136 
    137   AddRef();  // Released in Finish()
    138   // Open a connection asynchronously, so that delegate won't be called
    139   // back before returning Connect().
    140   next_state_ = STATE_RESOLVE_PROXY;
    141   net_log_.BeginEvent(
    142       NetLog::TYPE_SOCKET_STREAM_CONNECT,
    143       make_scoped_refptr(
    144           new NetLogStringParameter("url", url_.possibly_invalid_spec())));
    145   MessageLoop::current()->PostTask(
    146       FROM_HERE,
    147       NewRunnableMethod(this, &SocketStream::DoLoop, OK));
    148 }
    149 
    150 bool SocketStream::SendData(const char* data, int len) {
    151   DCHECK(MessageLoop::current()) <<
    152       "The current MessageLoop must exist";
    153   DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
    154       "The current MessageLoop must be TYPE_IO";
    155   if (!socket_.get() || !socket_->IsConnected() || next_state_ == STATE_NONE)
    156     return false;
    157   if (write_buf_) {
    158     int current_amount_send = write_buf_size_ - write_buf_offset_;
    159     for (PendingDataQueue::const_iterator iter = pending_write_bufs_.begin();
    160          iter != pending_write_bufs_.end();
    161          ++iter)
    162       current_amount_send += (*iter)->size();
    163 
    164     current_amount_send += len;
    165     if (current_amount_send > max_pending_send_allowed_)
    166       return false;
    167 
    168     pending_write_bufs_.push_back(make_scoped_refptr(
    169         new IOBufferWithSize(len)));
    170     memcpy(pending_write_bufs_.back()->data(), data, len);
    171     return true;
    172   }
    173   DCHECK(!current_write_buf_);
    174   write_buf_ = new IOBuffer(len);
    175   memcpy(write_buf_->data(), data, len);
    176   write_buf_size_ = len;
    177   write_buf_offset_ = 0;
    178   // Send pending data asynchronously, so that delegate won't be called
    179   // back before returning SendData().
    180   MessageLoop::current()->PostTask(
    181       FROM_HERE,
    182       NewRunnableMethod(this, &SocketStream::DoLoop, OK));
    183   return true;
    184 }
    185 
    186 void SocketStream::Close() {
    187   DCHECK(MessageLoop::current()) <<
    188       "The current MessageLoop must exist";
    189   DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
    190       "The current MessageLoop must be TYPE_IO";
    191   // If next_state_ is STATE_NONE, the socket was not opened, or already
    192   // closed.  So, return immediately.
    193   // Otherwise, it might call Finish() more than once, so breaks balance
    194   // of AddRef() and Release() in Connect() and Finish(), respectively.
    195   if (next_state_ == STATE_NONE)
    196     return;
    197   MessageLoop::current()->PostTask(
    198       FROM_HERE,
    199       NewRunnableMethod(this, &SocketStream::DoClose));
    200 }
    201 
    202 void SocketStream::RestartWithAuth(
    203     const string16& username, const string16& password) {
    204   DCHECK(MessageLoop::current()) <<
    205       "The current MessageLoop must exist";
    206   DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
    207       "The current MessageLoop must be TYPE_IO";
    208   DCHECK(auth_handler_.get());
    209   if (!socket_.get()) {
    210     LOG(ERROR) << "Socket is closed before restarting with auth.";
    211     return;
    212   }
    213 
    214   if (auth_identity_.invalid) {
    215     // Update the username/password.
    216     auth_identity_.source = HttpAuth::IDENT_SRC_EXTERNAL;
    217     auth_identity_.invalid = false;
    218     auth_identity_.username = username;
    219     auth_identity_.password = password;
    220   }
    221 
    222   MessageLoop::current()->PostTask(
    223       FROM_HERE,
    224       NewRunnableMethod(this, &SocketStream::DoRestartWithAuth));
    225 }
    226 
    227 void SocketStream::DetachDelegate() {
    228   if (!delegate_)
    229     return;
    230   delegate_ = NULL;
    231   net_log_.AddEvent(NetLog::TYPE_CANCELLED, NULL);
    232   // We don't need to send pending data when client detach the delegate.
    233   pending_write_bufs_.clear();
    234   Close();
    235 }
    236 
    237 void SocketStream::SetHostResolver(HostResolver* host_resolver) {
    238   DCHECK(host_resolver);
    239   host_resolver_ = host_resolver;
    240 }
    241 
    242 void SocketStream::SetClientSocketFactory(
    243     ClientSocketFactory* factory) {
    244   DCHECK(factory);
    245   factory_ = factory;
    246 }
    247 
    248 SocketStream::~SocketStream() {
    249   set_context(NULL);
    250   DCHECK(!delegate_);
    251   DCHECK(!pac_request_);
    252 }
    253 
    254 void SocketStream::CopyAddrInfo(struct addrinfo* head) {
    255   addresses_.Copy(head, true);
    256 }
    257 
    258 void SocketStream::DoClose() {
    259   closing_ = true;
    260   // If next_state_ is STATE_TCP_CONNECT, it's waiting other socket establishing
    261   // connection.  If next_state_ is STATE_AUTH_REQUIRED, it's waiting for
    262   // restarting.  In these states, we'll close the SocketStream now.
    263   if (next_state_ == STATE_TCP_CONNECT || next_state_ == STATE_AUTH_REQUIRED) {
    264     DoLoop(ERR_ABORTED);
    265     return;
    266   }
    267   // If next_state_ is STATE_READ_WRITE, we'll run DoLoop and close
    268   // the SocketStream.
    269   // If it's writing now, we should defer the closing after the current
    270   // writing is completed.
    271   if (next_state_ == STATE_READ_WRITE && !current_write_buf_)
    272     DoLoop(ERR_ABORTED);
    273 
    274   // In other next_state_, we'll wait for callback of other APIs, such as
    275   // ResolveProxy().
    276 }
    277 
    278 void SocketStream::Finish(int result) {
    279   DCHECK(MessageLoop::current()) <<
    280       "The current MessageLoop must exist";
    281   DCHECK_EQ(MessageLoop::TYPE_IO, MessageLoop::current()->type()) <<
    282       "The current MessageLoop must be TYPE_IO";
    283   DCHECK_LE(result, OK);
    284   if (result == OK)
    285     result = ERR_CONNECTION_CLOSED;
    286   DCHECK_EQ(next_state_, STATE_NONE);
    287   DVLOG(1) << "Finish result=" << ErrorToString(result);
    288   if (delegate_)
    289     delegate_->OnError(this, result);
    290 
    291   metrics_->OnClose();
    292   Delegate* delegate = delegate_;
    293   delegate_ = NULL;
    294   if (delegate) {
    295     delegate->OnClose(this);
    296   }
    297   Release();
    298 }
    299 
    300 int SocketStream::DidEstablishConnection() {
    301   if (!socket_.get() || !socket_->IsConnected()) {
    302     next_state_ = STATE_CLOSE;
    303     return ERR_CONNECTION_FAILED;
    304   }
    305   next_state_ = STATE_READ_WRITE;
    306   metrics_->OnConnected();
    307 
    308   net_log_.EndEvent(NetLog::TYPE_SOCKET_STREAM_CONNECT, NULL);
    309   if (delegate_)
    310     delegate_->OnConnected(this, max_pending_send_allowed_);
    311 
    312   return OK;
    313 }
    314 
    315 int SocketStream::DidReceiveData(int result) {
    316   DCHECK(read_buf_);
    317   DCHECK_GT(result, 0);
    318   net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_RECEIVED, NULL);
    319   int len = result;
    320   metrics_->OnRead(len);
    321   if (delegate_) {
    322     // Notify recevied data to delegate.
    323     delegate_->OnReceivedData(this, read_buf_->data(), len);
    324   }
    325   read_buf_ = NULL;
    326   return OK;
    327 }
    328 
    329 int SocketStream::DidSendData(int result) {
    330   DCHECK_GT(result, 0);
    331   net_log_.AddEvent(NetLog::TYPE_SOCKET_STREAM_SENT, NULL);
    332   int len = result;
    333   metrics_->OnWrite(len);
    334   current_write_buf_ = NULL;
    335   if (delegate_)
    336     delegate_->OnSentData(this, len);
    337 
    338   int remaining_size = write_buf_size_ - write_buf_offset_ - len;
    339   if (remaining_size == 0) {
    340     if (!pending_write_bufs_.empty()) {
    341       write_buf_size_ = pending_write_bufs_.front()->size();
    342       write_buf_ = pending_write_bufs_.front();
    343       pending_write_bufs_.pop_front();
    344     } else {
    345       write_buf_size_ = 0;
    346       write_buf_ = NULL;
    347     }
    348     write_buf_offset_ = 0;
    349   } else {
    350     write_buf_offset_ += len;
    351   }
    352   return OK;
    353 }
    354 
    355 void SocketStream::OnIOCompleted(int result) {
    356   DoLoop(result);
    357 }
    358 
    359 void SocketStream::OnReadCompleted(int result) {
    360   if (result == 0) {
    361     // 0 indicates end-of-file, so socket was closed.
    362     // Don't close the socket if it's still writing.
    363     server_closed_ = true;
    364   } else if (result > 0 && read_buf_) {
    365     result = DidReceiveData(result);
    366   }
    367   DoLoop(result);
    368 }
    369 
    370 void SocketStream::OnWriteCompleted(int result) {
    371   if (result >= 0 && write_buf_) {
    372     result = DidSendData(result);
    373   }
    374   DoLoop(result);
    375 }
    376 
    377 void SocketStream::DoLoop(int result) {
    378   // If context was not set, close immediately.
    379   if (!context_)
    380     next_state_ = STATE_CLOSE;
    381 
    382   if (next_state_ == STATE_NONE)
    383     return;
    384 
    385   do {
    386     State state = next_state_;
    387     next_state_ = STATE_NONE;
    388     switch (state) {
    389       case STATE_RESOLVE_PROXY:
    390         DCHECK_EQ(OK, result);
    391         result = DoResolveProxy();
    392         break;
    393       case STATE_RESOLVE_PROXY_COMPLETE:
    394         result = DoResolveProxyComplete(result);
    395         break;
    396       case STATE_RESOLVE_HOST:
    397         DCHECK_EQ(OK, result);
    398         result = DoResolveHost();
    399         break;
    400       case STATE_RESOLVE_HOST_COMPLETE:
    401         result = DoResolveHostComplete(result);
    402         break;
    403       case STATE_TCP_CONNECT:
    404         result = DoTcpConnect(result);
    405         break;
    406       case STATE_TCP_CONNECT_COMPLETE:
    407         result = DoTcpConnectComplete(result);
    408         break;
    409       case STATE_WRITE_TUNNEL_HEADERS:
    410         DCHECK_EQ(OK, result);
    411         result = DoWriteTunnelHeaders();
    412         break;
    413       case STATE_WRITE_TUNNEL_HEADERS_COMPLETE:
    414         result = DoWriteTunnelHeadersComplete(result);
    415         break;
    416       case STATE_READ_TUNNEL_HEADERS:
    417         DCHECK_EQ(OK, result);
    418         result = DoReadTunnelHeaders();
    419         break;
    420       case STATE_READ_TUNNEL_HEADERS_COMPLETE:
    421         result = DoReadTunnelHeadersComplete(result);
    422         break;
    423       case STATE_SOCKS_CONNECT:
    424         DCHECK_EQ(OK, result);
    425         result = DoSOCKSConnect();
    426         break;
    427       case STATE_SOCKS_CONNECT_COMPLETE:
    428         result = DoSOCKSConnectComplete(result);
    429         break;
    430       case STATE_SSL_CONNECT:
    431         DCHECK_EQ(OK, result);
    432         result = DoSSLConnect();
    433         break;
    434       case STATE_SSL_CONNECT_COMPLETE:
    435         result = DoSSLConnectComplete(result);
    436         break;
    437       case STATE_READ_WRITE:
    438         result = DoReadWrite(result);
    439         break;
    440       case STATE_AUTH_REQUIRED:
    441         // It might be called when DoClose is called while waiting in
    442         // STATE_AUTH_REQUIRED.
    443         Finish(result);
    444         return;
    445       case STATE_CLOSE:
    446         DCHECK_LE(result, OK);
    447         Finish(result);
    448         return;
    449       default:
    450         NOTREACHED() << "bad state " << state;
    451         Finish(result);
    452         return;
    453     }
    454     // If the connection is not established yet and had actual errors,
    455     // close the connection.
    456     if (state != STATE_READ_WRITE && result < ERR_IO_PENDING) {
    457       DCHECK_EQ(next_state_, STATE_CLOSE);
    458       net_log_.EndEventWithNetErrorCode(
    459           NetLog::TYPE_SOCKET_STREAM_CONNECT, result);
    460     }
    461   } while (result != ERR_IO_PENDING);
    462 }
    463 
    464 int SocketStream::DoResolveProxy() {
    465   DCHECK(!pac_request_);
    466   next_state_ = STATE_RESOLVE_PROXY_COMPLETE;
    467 
    468   if (!proxy_url_.is_valid()) {
    469     next_state_ = STATE_CLOSE;
    470     return ERR_INVALID_ARGUMENT;
    471   }
    472 
    473   return proxy_service()->ResolveProxy(
    474       proxy_url_, &proxy_info_, &io_callback_, &pac_request_, net_log_);
    475 }
    476 
    477 int SocketStream::DoResolveProxyComplete(int result) {
    478   pac_request_ = NULL;
    479   if (result != OK) {
    480     LOG(ERROR) << "Failed to resolve proxy: " << result;
    481     if (delegate_)
    482       delegate_->OnError(this, result);
    483     proxy_info_.UseDirect();
    484   }
    485   if (proxy_info_.is_direct()) {
    486     // If proxy was not found for original URL (i.e. websocket URL),
    487     // try again with https URL, like Safari implementation.
    488     // Note that we don't want to use http proxy, because we'll use tunnel
    489     // proxy using CONNECT method, which is used by https proxy.
    490     if (!proxy_url_.SchemeIs("https")) {
    491       const std::string scheme = "https";
    492       GURL::Replacements repl;
    493       repl.SetSchemeStr(scheme);
    494       proxy_url_ = url_.ReplaceComponents(repl);
    495       DVLOG(1) << "Try https proxy: " << proxy_url_;
    496       next_state_ = STATE_RESOLVE_PROXY;
    497       return OK;
    498     }
    499   }
    500 
    501   if (proxy_info_.is_empty()) {
    502     // No proxies/direct to choose from. This happens when we don't support any
    503     // of the proxies in the returned list.
    504     return ERR_NO_SUPPORTED_PROXIES;
    505   }
    506 
    507   next_state_ = STATE_RESOLVE_HOST;
    508   return OK;
    509 }
    510 
    511 int SocketStream::DoResolveHost() {
    512   next_state_ = STATE_RESOLVE_HOST_COMPLETE;
    513 
    514   DCHECK(!proxy_info_.is_empty());
    515   if (proxy_info_.is_direct())
    516     proxy_mode_ = kDirectConnection;
    517   else if (proxy_info_.proxy_server().is_socks())
    518     proxy_mode_ = kSOCKSProxy;
    519   else
    520     proxy_mode_ = kTunnelProxy;
    521 
    522   // Determine the host and port to connect to.
    523   HostPortPair host_port_pair;
    524   if (proxy_mode_ != kDirectConnection) {
    525     host_port_pair = proxy_info_.proxy_server().host_port_pair();
    526   } else {
    527     host_port_pair = HostPortPair::FromURL(url_);
    528   }
    529 
    530   HostResolver::RequestInfo resolve_info(host_port_pair);
    531 
    532   DCHECK(host_resolver_);
    533   resolver_.reset(new SingleRequestHostResolver(host_resolver_));
    534   return resolver_->Resolve(resolve_info, &addresses_, &io_callback_,
    535                             net_log_);
    536 }
    537 
    538 int SocketStream::DoResolveHostComplete(int result) {
    539   if (result == OK && delegate_) {
    540     next_state_ = STATE_TCP_CONNECT;
    541     result = delegate_->OnStartOpenConnection(this, &io_callback_);
    542     if (result == ERR_IO_PENDING)
    543       metrics_->OnWaitConnection();
    544   } else {
    545     next_state_ = STATE_CLOSE;
    546   }
    547   // TODO(ukai): if error occured, reconsider proxy after error.
    548   return result;
    549 }
    550 
    551 int SocketStream::DoTcpConnect(int result) {
    552   if (result != OK) {
    553     next_state_ = STATE_CLOSE;
    554     return result;
    555   }
    556   next_state_ = STATE_TCP_CONNECT_COMPLETE;
    557   DCHECK(factory_);
    558   socket_.reset(factory_->CreateTransportClientSocket(addresses_,
    559                                                       net_log_.net_log(),
    560                                                       net_log_.source()));
    561   metrics_->OnStartConnection();
    562   return socket_->Connect(&io_callback_);
    563 }
    564 
    565 int SocketStream::DoTcpConnectComplete(int result) {
    566   // TODO(ukai): if error occured, reconsider proxy after error.
    567   if (result != OK) {
    568     next_state_ = STATE_CLOSE;
    569     return result;
    570   }
    571 
    572   if (proxy_mode_ == kTunnelProxy)
    573     next_state_ = STATE_WRITE_TUNNEL_HEADERS;
    574   else if (proxy_mode_ == kSOCKSProxy)
    575     next_state_ = STATE_SOCKS_CONNECT;
    576   else if (is_secure()) {
    577     next_state_ = STATE_SSL_CONNECT;
    578   } else {
    579     result = DidEstablishConnection();
    580   }
    581   return result;
    582 }
    583 
    584 int SocketStream::DoWriteTunnelHeaders() {
    585   DCHECK_EQ(kTunnelProxy, proxy_mode_);
    586 
    587   next_state_ = STATE_WRITE_TUNNEL_HEADERS_COMPLETE;
    588 
    589   if (!tunnel_request_headers_.get()) {
    590     metrics_->OnTunnelProxy();
    591     tunnel_request_headers_ = new RequestHeaders();
    592     tunnel_request_headers_bytes_sent_ = 0;
    593   }
    594   if (tunnel_request_headers_->headers_.empty()) {
    595     std::string authorization_headers;
    596 
    597     if (!auth_handler_.get()) {
    598       // Do preemptive authentication.
    599       HttpAuthCache::Entry* entry = auth_cache_.LookupByPath(
    600           ProxyAuthOrigin(), std::string());
    601       if (entry) {
    602         scoped_ptr<HttpAuthHandler> handler_preemptive;
    603         int rv_create = http_auth_handler_factory_->
    604             CreatePreemptiveAuthHandlerFromString(
    605                 entry->auth_challenge(), HttpAuth::AUTH_PROXY,
    606                 ProxyAuthOrigin(), entry->IncrementNonceCount(),
    607                 net_log_, &handler_preemptive);
    608         if (rv_create == OK) {
    609           auth_identity_.source = HttpAuth::IDENT_SRC_PATH_LOOKUP;
    610           auth_identity_.invalid = false;
    611           auth_identity_.username = entry->username();
    612           auth_identity_.password = entry->password();
    613           auth_handler_.swap(handler_preemptive);
    614         }
    615       }
    616     }
    617 
    618     // Support basic authentication scheme only, because we don't have
    619     // HttpRequestInfo.
    620     // TODO(ukai): Add support other authentication scheme.
    621     if (auth_handler_.get() &&
    622         auth_handler_->auth_scheme() == HttpAuth::AUTH_SCHEME_BASIC) {
    623       HttpRequestInfo request_info;
    624       std::string auth_token;
    625       int rv = auth_handler_->GenerateAuthToken(
    626           &auth_identity_.username,
    627           &auth_identity_.password,
    628           &request_info,
    629           NULL,
    630           &auth_token);
    631       // TODO(cbentzel): Support async auth handlers.
    632       DCHECK_NE(ERR_IO_PENDING, rv);
    633       if (rv != OK)
    634         return rv;
    635       authorization_headers.append(
    636           HttpAuth::GetAuthorizationHeaderName(HttpAuth::AUTH_PROXY) +
    637           ": " + auth_token + "\r\n");
    638     }
    639 
    640     tunnel_request_headers_->headers_ = base::StringPrintf(
    641         "CONNECT %s HTTP/1.1\r\n"
    642         "Host: %s\r\n"
    643         "Proxy-Connection: keep-alive\r\n",
    644         GetHostAndPort(url_).c_str(),
    645         GetHostAndOptionalPort(url_).c_str());
    646     if (!authorization_headers.empty())
    647       tunnel_request_headers_->headers_ += authorization_headers;
    648     tunnel_request_headers_->headers_ += "\r\n";
    649   }
    650   tunnel_request_headers_->SetDataOffset(tunnel_request_headers_bytes_sent_);
    651   int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() -
    652                                  tunnel_request_headers_bytes_sent_);
    653   DCHECK_GT(buf_len, 0);
    654   return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_);
    655 }
    656 
    657 int SocketStream::DoWriteTunnelHeadersComplete(int result) {
    658   DCHECK_EQ(kTunnelProxy, proxy_mode_);
    659 
    660   if (result < 0) {
    661     next_state_ = STATE_CLOSE;
    662     return result;
    663   }
    664 
    665   tunnel_request_headers_bytes_sent_ += result;
    666   if (tunnel_request_headers_bytes_sent_ <
    667       tunnel_request_headers_->headers_.size())
    668     next_state_ = STATE_WRITE_TUNNEL_HEADERS;
    669   else
    670     next_state_ = STATE_READ_TUNNEL_HEADERS;
    671   return OK;
    672 }
    673 
    674 int SocketStream::DoReadTunnelHeaders() {
    675   DCHECK_EQ(kTunnelProxy, proxy_mode_);
    676 
    677   next_state_ = STATE_READ_TUNNEL_HEADERS_COMPLETE;
    678 
    679   if (!tunnel_response_headers_.get()) {
    680     tunnel_response_headers_ = new ResponseHeaders();
    681     tunnel_response_headers_capacity_ = kMaxTunnelResponseHeadersSize;
    682     tunnel_response_headers_->Realloc(tunnel_response_headers_capacity_);
    683     tunnel_response_headers_len_ = 0;
    684   }
    685 
    686   int buf_len = tunnel_response_headers_capacity_ -
    687       tunnel_response_headers_len_;
    688   tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_);
    689   CHECK(tunnel_response_headers_->data());
    690 
    691   return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_);
    692 }
    693 
    694 int SocketStream::DoReadTunnelHeadersComplete(int result) {
    695   DCHECK_EQ(kTunnelProxy, proxy_mode_);
    696 
    697   if (result < 0) {
    698     next_state_ = STATE_CLOSE;
    699     return result;
    700   }
    701 
    702   if (result == 0) {
    703     // 0 indicates end-of-file, so socket was closed.
    704     next_state_ = STATE_CLOSE;
    705     return ERR_CONNECTION_CLOSED;
    706   }
    707 
    708   tunnel_response_headers_len_ += result;
    709   DCHECK(tunnel_response_headers_len_ <= tunnel_response_headers_capacity_);
    710 
    711   int eoh = HttpUtil::LocateEndOfHeaders(
    712       tunnel_response_headers_->headers(), tunnel_response_headers_len_, 0);
    713   if (eoh == -1) {
    714     if (tunnel_response_headers_len_ >= kMaxTunnelResponseHeadersSize) {
    715       next_state_ = STATE_CLOSE;
    716       return ERR_RESPONSE_HEADERS_TOO_BIG;
    717     }
    718 
    719     next_state_ = STATE_READ_TUNNEL_HEADERS;
    720     return OK;
    721   }
    722   // DidReadResponseHeaders
    723   scoped_refptr<HttpResponseHeaders> headers;
    724   headers = new HttpResponseHeaders(
    725       HttpUtil::AssembleRawHeaders(tunnel_response_headers_->headers(), eoh));
    726   if (headers->GetParsedHttpVersion() < HttpVersion(1, 0)) {
    727     // Require the "HTTP/1.x" status line.
    728     next_state_ = STATE_CLOSE;
    729     return ERR_TUNNEL_CONNECTION_FAILED;
    730   }
    731   switch (headers->response_code()) {
    732     case 200:  // OK
    733       if (is_secure()) {
    734         DCHECK_EQ(eoh, tunnel_response_headers_len_);
    735         next_state_ = STATE_SSL_CONNECT;
    736       } else {
    737         result = DidEstablishConnection();
    738         if (result < 0) {
    739           next_state_ = STATE_CLOSE;
    740           return result;
    741         }
    742         if ((eoh < tunnel_response_headers_len_) && delegate_)
    743           delegate_->OnReceivedData(
    744               this, tunnel_response_headers_->headers() + eoh,
    745               tunnel_response_headers_len_ - eoh);
    746       }
    747       return OK;
    748     case 407:  // Proxy Authentication Required.
    749       result = HandleAuthChallenge(headers.get());
    750       if (result == ERR_PROXY_AUTH_UNSUPPORTED &&
    751           auth_handler_.get() && delegate_) {
    752         DCHECK(!proxy_info_.is_empty());
    753         auth_info_ = new AuthChallengeInfo;
    754         auth_info_->is_proxy = true;
    755         auth_info_->host_and_port =
    756             ASCIIToWide(proxy_info_.proxy_server().host_port_pair().ToString());
    757         auth_info_->scheme = ASCIIToWide(
    758             HttpAuth::SchemeToString(auth_handler_->auth_scheme()));
    759         auth_info_->realm = ASCIIToWide(auth_handler_->realm());
    760         // Wait until RestartWithAuth or Close is called.
    761         MessageLoop::current()->PostTask(
    762             FROM_HERE,
    763             NewRunnableMethod(this, &SocketStream::DoAuthRequired));
    764         next_state_ = STATE_AUTH_REQUIRED;
    765         return ERR_IO_PENDING;
    766       }
    767     default:
    768       break;
    769   }
    770   next_state_ = STATE_CLOSE;
    771   return ERR_TUNNEL_CONNECTION_FAILED;
    772 }
    773 
    774 int SocketStream::DoSOCKSConnect() {
    775   DCHECK_EQ(kSOCKSProxy, proxy_mode_);
    776 
    777   next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
    778 
    779   ClientSocket* s = socket_.release();
    780   HostResolver::RequestInfo req_info(HostPortPair::FromURL(url_));
    781 
    782   DCHECK(!proxy_info_.is_empty());
    783   if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5)
    784     s = new SOCKS5ClientSocket(s, req_info);
    785   else
    786     s = new SOCKSClientSocket(s, req_info, host_resolver_);
    787   socket_.reset(s);
    788   metrics_->OnSOCKSProxy();
    789   return socket_->Connect(&io_callback_);
    790 }
    791 
    792 int SocketStream::DoSOCKSConnectComplete(int result) {
    793   DCHECK_EQ(kSOCKSProxy, proxy_mode_);
    794 
    795   if (result == OK) {
    796     if (is_secure())
    797       next_state_ = STATE_SSL_CONNECT;
    798     else
    799       result = DidEstablishConnection();
    800   } else {
    801     next_state_ = STATE_CLOSE;
    802   }
    803   return result;
    804 }
    805 
    806 int SocketStream::DoSSLConnect() {
    807   DCHECK(factory_);
    808   // TODO(agl): look into plumbing SSLHostInfo here.
    809   socket_.reset(factory_->CreateSSLClientSocket(socket_.release(),
    810                                                 HostPortPair::FromURL(url_),
    811                                                 ssl_config_,
    812                                                 NULL /* ssl_host_info */,
    813                                                 cert_verifier_));
    814   next_state_ = STATE_SSL_CONNECT_COMPLETE;
    815   metrics_->OnSSLConnection();
    816   return socket_->Connect(&io_callback_);
    817 }
    818 
    819 int SocketStream::DoSSLConnectComplete(int result) {
    820   if (IsCertificateError(result)) {
    821     if (socket_->IsConnectedAndIdle()) {
    822       result = HandleCertificateError(result);
    823     } else {
    824       // SSLClientSocket for Mac will report socket is not connected,
    825       // if it returns cert verification error.  It didn't perform
    826       // SSLHandshake yet.
    827       // So, we should restart establishing connection with the
    828       // certificate in allowed bad certificates in |ssl_config_|.
    829       // See also net/http/http_network_transaction.cc
    830       //  HandleCertificateError() and RestartIgnoringLastError().
    831       SSLClientSocket* ssl_socket =
    832         reinterpret_cast<SSLClientSocket*>(socket_.get());
    833       SSLInfo ssl_info;
    834       ssl_socket->GetSSLInfo(&ssl_info);
    835       if (ssl_config_.IsAllowedBadCert(ssl_info.cert)) {
    836         // If we already have the certificate in the set of allowed bad
    837         // certificates, we did try it and failed again, so we should not
    838         // retry again: the connection should fail at last.
    839         next_state_ = STATE_CLOSE;
    840         return result;
    841       }
    842       // Add the bad certificate to the set of allowed certificates in the
    843       // SSL config object.
    844       SSLConfig::CertAndStatus bad_cert;
    845       bad_cert.cert = ssl_info.cert;
    846       bad_cert.cert_status = ssl_info.cert_status;
    847       ssl_config_.allowed_bad_certs.push_back(bad_cert);
    848       // Restart connection ignoring the bad certificate.
    849       socket_->Disconnect();
    850       socket_.reset();
    851       next_state_ = STATE_TCP_CONNECT;
    852       return OK;
    853     }
    854   }
    855 
    856   if (result == OK)
    857     result = DidEstablishConnection();
    858   else
    859     next_state_ = STATE_CLOSE;
    860   return result;
    861 }
    862 
    863 int SocketStream::DoReadWrite(int result) {
    864   if (result < OK) {
    865     next_state_ = STATE_CLOSE;
    866     return result;
    867   }
    868   if (!socket_.get() || !socket_->IsConnected()) {
    869     next_state_ = STATE_CLOSE;
    870     return ERR_CONNECTION_CLOSED;
    871   }
    872 
    873   // If client has requested close(), and there's nothing to write, then
    874   // let's close the socket.
    875   // We don't care about receiving data after the socket is closed.
    876   if (closing_ && !write_buf_ && pending_write_bufs_.empty()) {
    877     socket_->Disconnect();
    878     next_state_ = STATE_CLOSE;
    879     return OK;
    880   }
    881 
    882   next_state_ = STATE_READ_WRITE;
    883 
    884   // If server already closed the socket, we don't try to read.
    885   if (!server_closed_) {
    886     if (!read_buf_) {
    887       // No read pending and server didn't close the socket.
    888       read_buf_ = new IOBuffer(kReadBufferSize);
    889       result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_);
    890       if (result > 0) {
    891         return DidReceiveData(result);
    892       } else if (result == 0) {
    893         // 0 indicates end-of-file, so socket was closed.
    894         next_state_ = STATE_CLOSE;
    895         server_closed_ = true;
    896         return ERR_CONNECTION_CLOSED;
    897       }
    898       // If read is pending, try write as well.
    899       // Otherwise, return the result and do next loop (to close the
    900       // connection).
    901       if (result != ERR_IO_PENDING) {
    902         next_state_ = STATE_CLOSE;
    903         server_closed_ = true;
    904         return result;
    905       }
    906     }
    907     // Read is pending.
    908     DCHECK(read_buf_);
    909   }
    910 
    911   if (write_buf_ && !current_write_buf_) {
    912     // No write pending.
    913     current_write_buf_ = new DrainableIOBuffer(write_buf_, write_buf_size_);
    914     current_write_buf_->SetOffset(write_buf_offset_);
    915     result = socket_->Write(current_write_buf_,
    916                             current_write_buf_->BytesRemaining(),
    917                             &write_callback_);
    918     if (result > 0) {
    919       return DidSendData(result);
    920     }
    921     // If write is not pending, return the result and do next loop (to close
    922     // the connection).
    923     if (result != 0 && result != ERR_IO_PENDING) {
    924       next_state_ = STATE_CLOSE;
    925       return result;
    926     }
    927     return result;
    928   }
    929 
    930   // We arrived here when both operation is pending.
    931   return ERR_IO_PENDING;
    932 }
    933 
    934 GURL SocketStream::ProxyAuthOrigin() const {
    935   DCHECK(!proxy_info_.is_empty());
    936   return GURL("http://" +
    937               proxy_info_.proxy_server().host_port_pair().ToString());
    938 }
    939 
    940 int SocketStream::HandleAuthChallenge(const HttpResponseHeaders* headers) {
    941   GURL auth_origin(ProxyAuthOrigin());
    942 
    943   VLOG(1) << "The proxy " << auth_origin << " requested auth";
    944 
    945   // TODO(cbentzel): Since SocketStream only suppports basic authentication
    946   // right now, another challenge is always treated as a rejection.
    947   // Ultimately this should be converted to use HttpAuthController like the
    948   // HttpNetworkTransaction has.
    949   if (auth_handler_.get() && !auth_identity_.invalid) {
    950     if (auth_identity_.source != HttpAuth::IDENT_SRC_PATH_LOOKUP)
    951       auth_cache_.Remove(auth_origin,
    952                          auth_handler_->realm(),
    953                          auth_handler_->auth_scheme(),
    954                          auth_identity_.username,
    955                          auth_identity_.password);
    956     auth_handler_.reset();
    957     auth_identity_ = HttpAuth::Identity();
    958   }
    959 
    960   auth_identity_.invalid = true;
    961   std::set<HttpAuth::Scheme> disabled_schemes;
    962   HttpAuth::ChooseBestChallenge(http_auth_handler_factory_, headers,
    963                                 HttpAuth::AUTH_PROXY,
    964                                 auth_origin, disabled_schemes,
    965                                 net_log_, &auth_handler_);
    966   if (!auth_handler_.get()) {
    967     LOG(ERROR) << "Can't perform auth to the proxy " << auth_origin;
    968     return ERR_TUNNEL_CONNECTION_FAILED;
    969   }
    970   if (auth_handler_->NeedsIdentity()) {
    971     // We only support basic authentication scheme now.
    972     // TODO(ukai): Support other authentication scheme.
    973     HttpAuthCache::Entry* entry = auth_cache_.Lookup(
    974         auth_origin, auth_handler_->realm(), HttpAuth::AUTH_SCHEME_BASIC);
    975     if (entry) {
    976       auth_identity_.source = HttpAuth::IDENT_SRC_REALM_LOOKUP;
    977       auth_identity_.invalid = false;
    978       auth_identity_.username = entry->username();
    979       auth_identity_.password = entry->password();
    980       // Restart with auth info.
    981     }
    982     return ERR_PROXY_AUTH_UNSUPPORTED;
    983   } else {
    984     auth_identity_.invalid = false;
    985   }
    986   return ERR_TUNNEL_CONNECTION_FAILED;
    987 }
    988 
    989 void SocketStream::DoAuthRequired() {
    990   if (delegate_ && auth_info_.get())
    991     delegate_->OnAuthRequired(this, auth_info_.get());
    992   else
    993     DoLoop(ERR_UNEXPECTED);
    994 }
    995 
    996 void SocketStream::DoRestartWithAuth() {
    997   DCHECK_EQ(next_state_, STATE_AUTH_REQUIRED);
    998   auth_cache_.Add(ProxyAuthOrigin(),
    999                   auth_handler_->realm(),
   1000                   auth_handler_->auth_scheme(),
   1001                   auth_handler_->challenge(),
   1002                   auth_identity_.username,
   1003                   auth_identity_.password,
   1004                   std::string());
   1005 
   1006   tunnel_request_headers_ = NULL;
   1007   tunnel_request_headers_bytes_sent_ = 0;
   1008   tunnel_response_headers_ = NULL;
   1009   tunnel_response_headers_capacity_ = 0;
   1010   tunnel_response_headers_len_ = 0;
   1011 
   1012   next_state_ = STATE_TCP_CONNECT;
   1013   DoLoop(OK);
   1014 }
   1015 
   1016 int SocketStream::HandleCertificateError(int result) {
   1017   // TODO(ukai): handle cert error properly.
   1018   switch (result) {
   1019     case ERR_CERT_COMMON_NAME_INVALID:
   1020     case ERR_CERT_DATE_INVALID:
   1021     case ERR_CERT_AUTHORITY_INVALID:
   1022       result = OK;
   1023       break;
   1024     default:
   1025       break;
   1026   }
   1027   return result;
   1028 }
   1029 
   1030 SSLConfigService* SocketStream::ssl_config_service() const {
   1031   return context_->ssl_config_service();
   1032 }
   1033 
   1034 ProxyService* SocketStream::proxy_service() const {
   1035   return context_->proxy_service();
   1036 }
   1037 
   1038 }  // namespace net
   1039