| OLD | NEW | 
|     1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |     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 |     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/http/http_stream_factory_impl_job.h" |     5 #include "net/http/http_stream_factory_impl_job.h" | 
|     6  |     6  | 
|     7 #include "base/logging.h" |     7 #include "base/logging.h" | 
|     8 #include "base/stl_util-inl.h" |     8 #include "base/stl_util-inl.h" | 
|     9 #include "base/string_number_conversions.h" |     9 #include "base/string_number_conversions.h" | 
|    10 #include "base/string_util.h" |    10 #include "base/string_util.h" | 
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   127       return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |   127       return LOAD_STATE_RESOLVING_PROXY_FOR_URL; | 
|   128     case STATE_CREATE_STREAM_COMPLETE: |   128     case STATE_CREATE_STREAM_COMPLETE: | 
|   129       return connection_->GetLoadState(); |   129       return connection_->GetLoadState(); | 
|   130     case STATE_INIT_CONNECTION_COMPLETE: |   130     case STATE_INIT_CONNECTION_COMPLETE: | 
|   131       return LOAD_STATE_SENDING_REQUEST; |   131       return LOAD_STATE_SENDING_REQUEST; | 
|   132     default: |   132     default: | 
|   133       return LOAD_STATE_IDLE; |   133       return LOAD_STATE_IDLE; | 
|   134   } |   134   } | 
|   135 } |   135 } | 
|   136  |   136  | 
 |   137 void HttpStreamFactoryImpl::Job::Orphan(const Request* request) { | 
 |   138   DCHECK_EQ(request_, request); | 
 |   139   request_ = NULL; | 
 |   140 } | 
 |   141  | 
|   137 bool HttpStreamFactoryImpl::Job::was_alternate_protocol_available() const { |   142 bool HttpStreamFactoryImpl::Job::was_alternate_protocol_available() const { | 
|   138   return was_alternate_protocol_available_; |   143   return was_alternate_protocol_available_; | 
|   139 } |   144 } | 
|   140  |   145  | 
|   141 bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const { |   146 bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const { | 
|   142   return was_npn_negotiated_; |   147   return was_npn_negotiated_; | 
|   143 } |   148 } | 
|   144  |   149  | 
|   145 bool HttpStreamFactoryImpl::Job::using_spdy() const { |   150 bool HttpStreamFactoryImpl::Job::using_spdy() const { | 
|   146   return using_spdy_; |   151   return using_spdy_; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   158   DCHECK(using_ssl_); |   163   DCHECK(using_ssl_); | 
|   159   DCHECK(!establishing_tunnel_); |   164   DCHECK(!establishing_tunnel_); | 
|   160   DCHECK(connection_.get() && connection_->socket()); |   165   DCHECK(connection_.get() && connection_->socket()); | 
|   161   SSLClientSocket* ssl_socket = |   166   SSLClientSocket* ssl_socket = | 
|   162       static_cast<SSLClientSocket*>(connection_->socket()); |   167       static_cast<SSLClientSocket*>(connection_->socket()); | 
|   163   ssl_socket->GetSSLInfo(&ssl_info_); |   168   ssl_socket->GetSSLInfo(&ssl_info_); | 
|   164 } |   169 } | 
|   165  |   170  | 
|   166 void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() { |   171 void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() { | 
|   167   DCHECK(stream_.get()); |   172   DCHECK(stream_.get()); | 
|   168   request_->Complete(was_alternate_protocol_available(), |   173   DCHECK(!IsPreconnecting()); | 
|   169                     was_npn_negotiated(), |   174   if (IsOrphaned()) { | 
|   170                     using_spdy(), |   175     stream_factory_->OnOrphanedJobComplete(this); | 
|   171                     net_log_.source()); |   176   } else { | 
|   172   request_->OnStreamReady(ssl_config_, proxy_info_, stream_.release()); |   177     request_->Complete(was_alternate_protocol_available(), | 
 |   178                        was_npn_negotiated(), | 
 |   179                        using_spdy(), | 
 |   180                        net_log_.source()); | 
 |   181     request_->OnStreamReady(this, ssl_config_, proxy_info_, stream_.release()); | 
 |   182   } | 
|   173   // |this| may be deleted after this call. |   183   // |this| may be deleted after this call. | 
|   174 } |   184 } | 
|   175  |   185  | 
|   176 void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() { |   186 void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() { | 
|   177   DCHECK(!stream_.get()); |   187   DCHECK(!stream_.get()); | 
 |   188   DCHECK(!IsPreconnecting()); | 
|   178   DCHECK(using_spdy()); |   189   DCHECK(using_spdy()); | 
|   179   DCHECK(new_spdy_session_); |   190   DCHECK(new_spdy_session_); | 
|   180   scoped_refptr<SpdySession> spdy_session = new_spdy_session_; |   191   scoped_refptr<SpdySession> spdy_session = new_spdy_session_; | 
|   181   new_spdy_session_ = NULL; |   192   new_spdy_session_ = NULL; | 
|   182   stream_factory_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_); |   193   if (IsOrphaned()) { | 
 |   194     stream_factory_->OnSpdySessionReady( | 
 |   195         spdy_session, spdy_session_direct_, ssl_config_, proxy_info_, | 
 |   196         was_alternate_protocol_available(), was_npn_negotiated(), | 
 |   197         using_spdy(), net_log_.source()); | 
 |   198     stream_factory_->OnOrphanedJobComplete(this); | 
 |   199   } else { | 
 |   200     request_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_); | 
 |   201   } | 
|   183   // |this| may be deleted after this call. |   202   // |this| may be deleted after this call. | 
|   184 } |   203 } | 
|   185  |   204  | 
|   186 void HttpStreamFactoryImpl::Job::OnStreamFailedCallback(int result) { |   205 void HttpStreamFactoryImpl::Job::OnStreamFailedCallback(int result) { | 
|   187   request_->OnStreamFailed(result, ssl_config_); |   206   DCHECK(!IsPreconnecting()); | 
 |   207   if (IsOrphaned()) | 
 |   208     stream_factory_->OnOrphanedJobComplete(this); | 
 |   209   else | 
 |   210     request_->OnStreamFailed(this, result, ssl_config_); | 
|   188   // |this| may be deleted after this call. |   211   // |this| may be deleted after this call. | 
|   189 } |   212 } | 
|   190  |   213  | 
|   191 void HttpStreamFactoryImpl::Job::OnCertificateErrorCallback( |   214 void HttpStreamFactoryImpl::Job::OnCertificateErrorCallback( | 
|   192     int result, const SSLInfo& ssl_info) { |   215     int result, const SSLInfo& ssl_info) { | 
|   193   request_->OnCertificateError(result, ssl_config_, ssl_info); |   216   DCHECK(!IsPreconnecting()); | 
 |   217   if (IsOrphaned()) | 
 |   218     stream_factory_->OnOrphanedJobComplete(this); | 
 |   219   else | 
 |   220     request_->OnCertificateError(this, result, ssl_config_, ssl_info); | 
|   194   // |this| may be deleted after this call. |   221   // |this| may be deleted after this call. | 
|   195 } |   222 } | 
|   196  |   223  | 
|   197 void HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback( |   224 void HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback( | 
|   198     const HttpResponseInfo& response, |   225     const HttpResponseInfo& response, | 
|   199     HttpAuthController* auth_controller) { |   226     HttpAuthController* auth_controller) { | 
|   200   request_->OnNeedsProxyAuth( |   227   DCHECK(!IsPreconnecting()); | 
|   201       response, ssl_config_, proxy_info_, auth_controller); |   228   if (IsOrphaned()) | 
 |   229     stream_factory_->OnOrphanedJobComplete(this); | 
 |   230   else | 
 |   231     request_->OnNeedsProxyAuth( | 
 |   232         this, response, ssl_config_, proxy_info_, auth_controller); | 
|   202   // |this| may be deleted after this call. |   233   // |this| may be deleted after this call. | 
|   203 } |   234 } | 
|   204  |   235  | 
|   205 void HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback( |   236 void HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback( | 
|   206     SSLCertRequestInfo* cert_info) { |   237     SSLCertRequestInfo* cert_info) { | 
|   207   request_->OnNeedsClientAuth(ssl_config_, cert_info); |   238   DCHECK(!IsPreconnecting()); | 
 |   239   if (IsOrphaned()) | 
 |   240     stream_factory_->OnOrphanedJobComplete(this); | 
 |   241   else | 
 |   242     request_->OnNeedsClientAuth(this, ssl_config_, cert_info); | 
|   208   // |this| may be deleted after this call. |   243   // |this| may be deleted after this call. | 
|   209 } |   244 } | 
|   210  |   245  | 
|   211 void HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback( |   246 void HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback( | 
|   212     const HttpResponseInfo& response_info, |   247     const HttpResponseInfo& response_info, | 
|   213     HttpStream* stream) { |   248     HttpStream* stream) { | 
|   214   request_->OnHttpsProxyTunnelResponse( |   249   DCHECK(!IsPreconnecting()); | 
|   215       response_info, ssl_config_, proxy_info_, stream); |   250   if (IsOrphaned()) | 
 |   251     stream_factory_->OnOrphanedJobComplete(this); | 
 |   252   else | 
 |   253     request_->OnHttpsProxyTunnelResponse( | 
 |   254         this, response_info, ssl_config_, proxy_info_, stream); | 
|   216   // |this| may be deleted after this call. |   255   // |this| may be deleted after this call. | 
|   217 } |   256 } | 
|   218  |   257  | 
|   219 void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() { |   258 void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() { | 
 |   259   DCHECK(!request_); | 
 |   260   if (new_spdy_session_) { | 
 |   261     stream_factory_->OnSpdySessionReady( | 
 |   262         new_spdy_session_, spdy_session_direct_, ssl_config_, | 
 |   263         proxy_info_, was_alternate_protocol_available(), | 
 |   264         was_npn_negotiated(), using_spdy(), net_log_.source()); | 
 |   265   } | 
|   220   stream_factory_->OnPreconnectsComplete(this); |   266   stream_factory_->OnPreconnectsComplete(this); | 
|   221   // |this| may be deleted after this call. |   267   // |this| may be deleted after this call. | 
|   222 } |   268 } | 
|   223  |   269  | 
|   224 void HttpStreamFactoryImpl::Job::OnIOComplete(int result) { |   270 void HttpStreamFactoryImpl::Job::OnIOComplete(int result) { | 
|   225   RunLoop(result); |   271   RunLoop(result); | 
|   226 } |   272 } | 
|   227  |   273  | 
|   228 int HttpStreamFactoryImpl::Job::RunLoop(int result) { |   274 int HttpStreamFactoryImpl::Job::RunLoop(int result) { | 
|   229   result = DoLoop(result); |   275   result = DoLoop(result); | 
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   515           HostPortProxyPair(endpoint_, proxy_info_.proxy_server()); |   561           HostPortProxyPair(endpoint_, proxy_info_.proxy_server()); | 
|   516     } |   562     } | 
|   517     if (session_->spdy_session_pool()->HasSession(spdy_session_key)) { |   563     if (session_->spdy_session_pool()->HasSession(spdy_session_key)) { | 
|   518       // If we're preconnecting, but we already have a SpdySession, we don't |   564       // If we're preconnecting, but we already have a SpdySession, we don't | 
|   519       // actually need to preconnect any sockets, so we're done. |   565       // actually need to preconnect any sockets, so we're done. | 
|   520       if (IsPreconnecting()) |   566       if (IsPreconnecting()) | 
|   521         return OK; |   567         return OK; | 
|   522       using_spdy_ = true; |   568       using_spdy_ = true; | 
|   523       next_state_ = STATE_CREATE_STREAM; |   569       next_state_ = STATE_CREATE_STREAM; | 
|   524       return OK; |   570       return OK; | 
|   525     } else if (!IsPreconnecting()) { |   571     } else if (request_) { | 
|   526       // Update the spdy session key for the request that launched this job. |   572       // Update the spdy session key for the request that launched this job. | 
|   527       request_->SetSpdySessionKey(spdy_session_key); |   573       request_->SetSpdySessionKey(spdy_session_key); | 
|   528     } |   574     } | 
|   529   } |   575   } | 
|   530  |   576  | 
|   531   // Build the string used to uniquely identify connections of this type. |   577   // Build the string used to uniquely identify connections of this type. | 
|   532   // Determine the host and port to connect to. |   578   // Determine the host and port to connect to. | 
|   533   std::string connection_group = endpoint_.ToString(); |   579   std::string connection_group = endpoint_.ToString(); | 
|   534   DCHECK(!connection_group.empty()); |   580   DCHECK(!connection_group.empty()); | 
|   535  |   581  | 
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1127       NOTREACHED(); |  1173       NOTREACHED(); | 
|  1128       break; |  1174       break; | 
|  1129   } |  1175   } | 
|  1130 } |  1176 } | 
|  1131  |  1177  | 
|  1132 bool HttpStreamFactoryImpl::Job::IsPreconnecting() const { |  1178 bool HttpStreamFactoryImpl::Job::IsPreconnecting() const { | 
|  1133   DCHECK_GE(num_streams_, 0); |  1179   DCHECK_GE(num_streams_, 0); | 
|  1134   return num_streams_ > 0; |  1180   return num_streams_ > 0; | 
|  1135 } |  1181 } | 
|  1136  |  1182  | 
 |  1183 bool HttpStreamFactoryImpl::Job::IsOrphaned() const { | 
 |  1184   return !IsPreconnecting() && !request_; | 
 |  1185 } | 
 |  1186  | 
|  1137 }  // namespace net |  1187 }  // namespace net | 
| OLD | NEW |