Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(451)

Side by Side Diff: net/http/http_stream_factory_impl_request.cc

Issue 1326503003: Added a net::BidirectionalStream to expose a bidirectional streaming interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "net/http/http_stream_factory_impl_request.h" 5 #include "net/http/http_stream_factory_impl_request.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "net/http/bidirectional_stream.h"
10 #include "net/http/http_stream_factory_impl_job.h" 11 #include "net/http/http_stream_factory_impl_job.h"
11 #include "net/spdy/spdy_http_stream.h" 12 #include "net/spdy/spdy_http_stream.h"
12 #include "net/spdy/spdy_session.h" 13 #include "net/spdy/spdy_session.h"
13 14
14 namespace net { 15 namespace net {
15 16
16 HttpStreamFactoryImpl::Request::Request( 17 HttpStreamFactoryImpl::Request::Request(
17 const GURL& url, 18 const GURL& url,
18 HttpStreamFactoryImpl* factory, 19 HttpStreamFactoryImpl* factory,
19 HttpStreamRequest::Delegate* delegate, 20 HttpStreamRequest::Delegate* delegate,
20 WebSocketHandshakeStreamBase::CreateHelper* 21 WebSocketHandshakeStreamBase::CreateHelper*
21 websocket_handshake_stream_create_helper, 22 websocket_handshake_stream_create_helper,
22 const BoundNetLog& net_log) 23 const BoundNetLog& net_log)
24 : Request(url,
25 factory,
26 delegate,
27 websocket_handshake_stream_create_helper,
28 net_log,
29 false) {}
30
31 HttpStreamFactoryImpl::Request::Request(
mef 2015/09/30 16:18:16 why do we need to duplicate constructors? Can we a
xunjieli 2015/10/01 18:41:16 Done.
32 const GURL& url,
33 HttpStreamFactoryImpl* factory,
34 HttpStreamRequest::Delegate* delegate,
35 WebSocketHandshakeStreamBase::CreateHelper*
36 websocket_handshake_stream_create_helper,
37 const BoundNetLog& net_log,
38 bool for_bidirectional)
23 : url_(url), 39 : url_(url),
24 factory_(factory), 40 factory_(factory),
25 websocket_handshake_stream_create_helper_( 41 websocket_handshake_stream_create_helper_(
26 websocket_handshake_stream_create_helper), 42 websocket_handshake_stream_create_helper),
27 delegate_(delegate), 43 delegate_(delegate),
28 net_log_(net_log), 44 net_log_(net_log),
29 completed_(false), 45 completed_(false),
30 was_npn_negotiated_(false), 46 was_npn_negotiated_(false),
31 protocol_negotiated_(kProtoUnknown), 47 protocol_negotiated_(kProtoUnknown),
32 using_spdy_(false) { 48 using_spdy_(false),
49 for_bidirectional_(for_bidirectional) {
33 DCHECK(factory_); 50 DCHECK(factory_);
34 DCHECK(delegate_); 51 DCHECK(delegate_);
35 52
36 net_log_.BeginEvent(NetLog::TYPE_HTTP_STREAM_REQUEST); 53 net_log_.BeginEvent(NetLog::TYPE_HTTP_STREAM_REQUEST);
37 } 54 }
38 55
39 HttpStreamFactoryImpl::Request::~Request() { 56 HttpStreamFactoryImpl::Request::~Request() {
40 if (bound_job_.get()) 57 if (bound_job_.get())
41 DCHECK(jobs_.empty()); 58 DCHECK(jobs_.empty());
42 59
(...skipping 27 matching lines...) Expand all
70 protocol_negotiated_ = protocol_negotiated; 87 protocol_negotiated_ = protocol_negotiated;
71 using_spdy_ = using_spdy; 88 using_spdy_ = using_spdy;
72 } 89 }
73 90
74 void HttpStreamFactoryImpl::Request::OnStreamReady( 91 void HttpStreamFactoryImpl::Request::OnStreamReady(
75 Job* job, 92 Job* job,
76 const SSLConfig& used_ssl_config, 93 const SSLConfig& used_ssl_config,
77 const ProxyInfo& used_proxy_info, 94 const ProxyInfo& used_proxy_info,
78 HttpStream* stream) { 95 HttpStream* stream) {
79 DCHECK(!factory_->for_websockets_); 96 DCHECK(!factory_->for_websockets_);
97 DCHECK(!for_bidirectional_);
80 DCHECK(stream); 98 DCHECK(stream);
81 DCHECK(completed_); 99 DCHECK(completed_);
82 100
83 OnJobSucceeded(job); 101 OnJobSucceeded(job);
84 delegate_->OnStreamReady(used_ssl_config, used_proxy_info, stream); 102 delegate_->OnStreamReady(used_ssl_config, used_proxy_info, stream);
85 } 103 }
86 104
105 void HttpStreamFactoryImpl::Request::OnBidirectionalStreamReady(
106 Job* job,
107 const SSLConfig& used_ssl_config,
108 const ProxyInfo& used_proxy_info,
109 BidirectionalStream* stream) {
110 DCHECK(!factory_->for_websockets_);
111 DCHECK(for_bidirectional_);
112 DCHECK(stream);
113 DCHECK(completed_);
114
115 OnJobSucceeded(job);
116 delegate_->OnBidirectionalStreamReady(used_ssl_config, used_proxy_info,
117 stream);
118 }
119
87 void HttpStreamFactoryImpl::Request::OnWebSocketHandshakeStreamReady( 120 void HttpStreamFactoryImpl::Request::OnWebSocketHandshakeStreamReady(
88 Job* job, 121 Job* job,
89 const SSLConfig& used_ssl_config, 122 const SSLConfig& used_ssl_config,
90 const ProxyInfo& used_proxy_info, 123 const ProxyInfo& used_proxy_info,
91 WebSocketHandshakeStreamBase* stream) { 124 WebSocketHandshakeStreamBase* stream) {
92 DCHECK(factory_->for_websockets_); 125 DCHECK(factory_->for_websockets_);
126 DCHECK(!for_bidirectional_);
93 DCHECK(stream); 127 DCHECK(stream);
94 DCHECK(completed_); 128 DCHECK(completed_);
95 129
96 OnJobSucceeded(job); 130 OnJobSucceeded(job);
97 delegate_->OnWebSocketHandshakeStreamReady( 131 delegate_->OnWebSocketHandshakeStreamReady(
98 used_ssl_config, used_proxy_info, stream); 132 used_ssl_config, used_proxy_info, stream);
99 } 133 }
100 134
101 void HttpStreamFactoryImpl::Request::OnStreamFailed( 135 void HttpStreamFactoryImpl::Request::OnStreamFailed(
102 Job* job, 136 Job* job,
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 // TODO(jgraettinger): Currently, HttpStreamFactoryImpl::Job notifies a 279 // TODO(jgraettinger): Currently, HttpStreamFactoryImpl::Job notifies a
246 // Request that the session is ready, which in turn notifies it's delegate, 280 // Request that the session is ready, which in turn notifies it's delegate,
247 // and then it notifies HttpStreamFactoryImpl so that /other/ requests may 281 // and then it notifies HttpStreamFactoryImpl so that /other/ requests may
248 // be woken, but only if the spdy_session is still okay. This is tough to grok. 282 // be woken, but only if the spdy_session is still okay. This is tough to grok.
249 // Instead, see if Job can notify HttpStreamFactoryImpl only, and have one 283 // Instead, see if Job can notify HttpStreamFactoryImpl only, and have one
250 // path for notifying any requests waiting for the session (including the 284 // path for notifying any requests waiting for the session (including the
251 // request which spawned it). 285 // request which spawned it).
252 void HttpStreamFactoryImpl::Request::OnNewSpdySessionReady( 286 void HttpStreamFactoryImpl::Request::OnNewSpdySessionReady(
253 Job* job, 287 Job* job,
254 scoped_ptr<HttpStream> stream, 288 scoped_ptr<HttpStream> stream,
289 scoped_ptr<BidirectionalStream> bidirectional_stream,
255 const base::WeakPtr<SpdySession>& spdy_session, 290 const base::WeakPtr<SpdySession>& spdy_session,
256 bool direct) { 291 bool direct) {
257 DCHECK(job); 292 DCHECK(job);
258 DCHECK(job->using_spdy()); 293 DCHECK(job->using_spdy());
259 294
260 // Note: |spdy_session| may be NULL. In that case, |delegate_| should still 295 // Note: |spdy_session| may be NULL. In that case, |delegate_| should still
261 // receive |stream| so the error propogates up correctly, however there is no 296 // receive |stream| so the error propogates up correctly, however there is no
262 // point in broadcasting |spdy_session| to other requests. 297 // point in broadcasting |spdy_session| to other requests.
263 298
264 // The first case is the usual case. 299 // The first case is the usual case.
(...skipping 14 matching lines...) Expand all
279 const BoundNetLog net_log = job->net_log(); 314 const BoundNetLog net_log = job->net_log();
280 315
281 Complete(was_npn_negotiated, protocol_negotiated, using_spdy); 316 Complete(was_npn_negotiated, protocol_negotiated, using_spdy);
282 317
283 // Cache this so we can still use it if the request is deleted. 318 // Cache this so we can still use it if the request is deleted.
284 HttpStreamFactoryImpl* factory = factory_; 319 HttpStreamFactoryImpl* factory = factory_;
285 if (factory->for_websockets_) { 320 if (factory->for_websockets_) {
286 // TODO(ricea): Re-instate this code when WebSockets over SPDY is 321 // TODO(ricea): Re-instate this code when WebSockets over SPDY is
287 // implemented. 322 // implemented.
288 NOTREACHED(); 323 NOTREACHED();
324 } else if (for_bidirectional_) {
mef 2015/09/30 16:18:16 Does this only work for new spdy session?
xunjieli 2015/10/01 18:41:16 It also works for existing spdy session if HttpStr
325 delegate_->OnBidirectionalStreamReady(job->server_ssl_config(),
326 job->proxy_info(),
327 bidirectional_stream.release());
289 } else { 328 } else {
290 delegate_->OnStreamReady(job->server_ssl_config(), job->proxy_info(), 329 delegate_->OnStreamReady(job->server_ssl_config(), job->proxy_info(),
291 stream.release()); 330 stream.release());
292 } 331 }
293 // |this| may be deleted after this point. 332 // |this| may be deleted after this point.
294 if (spdy_session && spdy_session->IsAvailable()) { 333 if (spdy_session && spdy_session->IsAvailable()) {
295 factory->OnNewSpdySessionReady(spdy_session, 334 factory->OnNewSpdySessionReady(spdy_session,
296 direct, 335 direct,
297 used_ssl_config, 336 used_ssl_config,
298 used_proxy_info, 337 used_proxy_info,
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 } 414 }
376 // We may have other jobs in |jobs_|. For example, if we start multiple jobs 415 // We may have other jobs in |jobs_|. For example, if we start multiple jobs
377 // for Alternate-Protocol. 416 // for Alternate-Protocol.
378 BindJob(job); 417 BindJob(job);
379 return; 418 return;
380 } 419 }
381 DCHECK(jobs_.empty()); 420 DCHECK(jobs_.empty());
382 } 421 }
383 422
384 } // namespace net 423 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698