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

Side by Side Diff: components/cronet/android/cronet_bidirectional_stream_adapter.cc

Issue 1992953004: [Cronet] Make delaying sending request headers explicit in bidirectional stream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: correct a typo Created 4 years, 6 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "cronet_bidirectional_stream_adapter.h" 5 #include "cronet_bidirectional_stream_adapter.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 // Reset global references. 64 // Reset global references.
65 jwrite_buffer_list.Reset(); 65 jwrite_buffer_list.Reset();
66 jwrite_buffer_pos_list.Reset(); 66 jwrite_buffer_pos_list.Reset();
67 jwrite_buffer_limit_list.Reset(); 67 jwrite_buffer_limit_list.Reset();
68 } 68 }
69 69
70 static jlong CreateBidirectionalStream( 70 static jlong CreateBidirectionalStream(
71 JNIEnv* env, 71 JNIEnv* env,
72 const base::android::JavaParamRef<jobject>& jbidi_stream, 72 const base::android::JavaParamRef<jobject>& jbidi_stream,
73 jlong jurl_request_context_adapter, 73 jlong jurl_request_context_adapter,
74 jboolean jdisable_auto_flush) { 74 jboolean jsend_request_headers_automatically) {
75 CronetURLRequestContextAdapter* context_adapter = 75 CronetURLRequestContextAdapter* context_adapter =
76 reinterpret_cast<CronetURLRequestContextAdapter*>( 76 reinterpret_cast<CronetURLRequestContextAdapter*>(
77 jurl_request_context_adapter); 77 jurl_request_context_adapter);
78 DCHECK(context_adapter); 78 DCHECK(context_adapter);
79 79
80 CronetBidirectionalStreamAdapter* adapter = 80 CronetBidirectionalStreamAdapter* adapter =
81 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, 81 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream,
82 jdisable_auto_flush); 82 jsend_request_headers_automatically);
83 83
84 return reinterpret_cast<jlong>(adapter); 84 return reinterpret_cast<jlong>(adapter);
85 } 85 }
86 86
87 // static 87 // static
88 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { 88 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) {
89 return RegisterNativesImpl(env); 89 return RegisterNativesImpl(env);
90 } 90 }
91 91
92 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( 92 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter(
93 CronetURLRequestContextAdapter* context, 93 CronetURLRequestContextAdapter* context,
94 JNIEnv* env, 94 JNIEnv* env,
95 const base::android::JavaParamRef<jobject>& jbidi_stream, 95 const base::android::JavaParamRef<jobject>& jbidi_stream,
96 bool disable_auto_flush) 96 bool send_request_headers_automatically)
97 : context_(context), 97 : context_(context),
98 owner_(env, jbidi_stream), 98 owner_(env, jbidi_stream),
99 disable_auto_flush_(disable_auto_flush), 99 send_request_headers_automatically_(send_request_headers_automatically),
100 stream_failed_(false) {} 100 stream_failed_(false) {}
101 101
102 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { 102 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {
103 DCHECK(context_->IsOnNetworkThread()); 103 DCHECK(context_->IsOnNetworkThread());
104 } 104 }
105 105
106 void CronetBidirectionalStreamAdapter::SendRequestHeaders(
107 JNIEnv* env,
108 const base::android::JavaParamRef<jobject>& jcaller) {
109 context_->PostTaskToNetworkThread(
110 FROM_HERE,
111 base::Bind(
112 &CronetBidirectionalStreamAdapter::SendRequestHeadersOnNetworkThread,
113 base::Unretained(this)));
114 }
115
106 jint CronetBidirectionalStreamAdapter::Start( 116 jint CronetBidirectionalStreamAdapter::Start(
107 JNIEnv* env, 117 JNIEnv* env,
108 const base::android::JavaParamRef<jobject>& jcaller, 118 const base::android::JavaParamRef<jobject>& jcaller,
109 const base::android::JavaParamRef<jstring>& jurl, 119 const base::android::JavaParamRef<jstring>& jurl,
110 jint jpriority, 120 jint jpriority,
111 const base::android::JavaParamRef<jstring>& jmethod, 121 const base::android::JavaParamRef<jstring>& jmethod,
112 const base::android::JavaParamRef<jobjectArray>& jheaders, 122 const base::android::JavaParamRef<jobjectArray>& jheaders,
113 jboolean jend_of_stream) { 123 jboolean jend_of_stream) {
114 // Prepare request info here to be able to return the error. 124 // Prepare request info here to be able to return the error.
115 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info( 125 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info(
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 // posting task to executor throws an exception), but is posted, so |this| 231 // posting task to executor throws an exception), but is posted, so |this|
222 // is valid until calling task is complete. Destroy() is always called from 232 // is valid until calling task is complete. Destroy() is always called from
223 // within a synchronized java block that guarantees no future posts to the 233 // within a synchronized java block that guarantees no future posts to the
224 // network thread with the adapter pointer. 234 // network thread with the adapter pointer.
225 context_->PostTaskToNetworkThread( 235 context_->PostTaskToNetworkThread(
226 FROM_HERE, 236 FROM_HERE,
227 base::Bind(&CronetBidirectionalStreamAdapter::DestroyOnNetworkThread, 237 base::Bind(&CronetBidirectionalStreamAdapter::DestroyOnNetworkThread,
228 base::Unretained(this), jsend_on_canceled)); 238 base::Unretained(this), jsend_on_canceled));
229 } 239 }
230 240
231 void CronetBidirectionalStreamAdapter::OnStreamReady() { 241 void CronetBidirectionalStreamAdapter::OnStreamReady(
242 bool request_headers_sent) {
232 DCHECK(context_->IsOnNetworkThread()); 243 DCHECK(context_->IsOnNetworkThread());
233 JNIEnv* env = base::android::AttachCurrentThread(); 244 JNIEnv* env = base::android::AttachCurrentThread();
234 cronet::Java_CronetBidirectionalStream_onStreamReady(env, owner_.obj()); 245 cronet::Java_CronetBidirectionalStream_onStreamReady(
246 env, owner_.obj(), request_headers_sent ? JNI_TRUE : JNI_FALSE);
235 } 247 }
236 248
237 void CronetBidirectionalStreamAdapter::OnHeadersReceived( 249 void CronetBidirectionalStreamAdapter::OnHeadersReceived(
238 const net::SpdyHeaderBlock& response_headers) { 250 const net::SpdyHeaderBlock& response_headers) {
239 DCHECK(context_->IsOnNetworkThread()); 251 DCHECK(context_->IsOnNetworkThread());
240 JNIEnv* env = base::android::AttachCurrentThread(); 252 JNIEnv* env = base::android::AttachCurrentThread();
241 // Get http status code from response headers. 253 // Get http status code from response headers.
242 jint http_status_code = 0; 254 jint http_status_code = 0;
243 const auto http_status_header = response_headers.find(":status"); 255 const auto http_status_header = response_headers.find(":status");
244 if (http_status_header != response_headers.end()) 256 if (http_status_header != response_headers.end())
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 DCHECK(context_->IsOnNetworkThread()); 326 DCHECK(context_->IsOnNetworkThread());
315 DCHECK(!bidi_stream_); 327 DCHECK(!bidi_stream_);
316 request_info->extra_headers.SetHeaderIfMissing( 328 request_info->extra_headers.SetHeaderIfMissing(
317 net::HttpRequestHeaders::kUserAgent, context_->GetURLRequestContext() 329 net::HttpRequestHeaders::kUserAgent, context_->GetURLRequestContext()
318 ->http_user_agent_settings() 330 ->http_user_agent_settings()
319 ->GetUserAgent()); 331 ->GetUserAgent());
320 bidi_stream_.reset(new net::BidirectionalStream( 332 bidi_stream_.reset(new net::BidirectionalStream(
321 std::move(request_info), context_->GetURLRequestContext() 333 std::move(request_info), context_->GetURLRequestContext()
322 ->http_transaction_factory() 334 ->http_transaction_factory()
323 ->GetSession(), 335 ->GetSession(),
324 disable_auto_flush_, this)); 336 send_request_headers_automatically_, this));
337 }
338
339 void CronetBidirectionalStreamAdapter::SendRequestHeadersOnNetworkThread() {
340 DCHECK(context_->IsOnNetworkThread());
341 DCHECK(!send_request_headers_automatically_);
342
343 if (stream_failed_) {
344 // If stream failed between the time when SendRequestHeaders is invoked and
345 // SendRequestHeadersOnNetworkThread is executed, do not call into
346 // |bidi_stream_| since the underlying stream might have been destroyed.
347 // Do not invoke Java callback either, since onError is posted when
348 // |stream_failed_| is set to true.
349 return;
350 }
351 bidi_stream_->SendRequestHeaders();
325 } 352 }
326 353
327 void CronetBidirectionalStreamAdapter::ReadDataOnNetworkThread( 354 void CronetBidirectionalStreamAdapter::ReadDataOnNetworkThread(
328 scoped_refptr<IOBufferWithByteBuffer> read_buffer, 355 scoped_refptr<IOBufferWithByteBuffer> read_buffer,
329 int buffer_size) { 356 int buffer_size) {
330 DCHECK(context_->IsOnNetworkThread()); 357 DCHECK(context_->IsOnNetworkThread());
331 DCHECK(read_buffer); 358 DCHECK(read_buffer);
332 DCHECK(!read_buffer_); 359 DCHECK(!read_buffer_);
333 360
334 read_buffer_ = read_buffer; 361 read_buffer_ = read_buffer;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 418
392 std::vector<std::string> headers; 419 std::vector<std::string> headers;
393 for (const auto& header : header_block) { 420 for (const auto& header : header_block) {
394 headers.push_back(header.first.as_string()); 421 headers.push_back(header.first.as_string());
395 headers.push_back(header.second.as_string()); 422 headers.push_back(header.second.as_string());
396 } 423 }
397 return base::android::ToJavaArrayOfStrings(env, headers); 424 return base::android::ToJavaArrayOfStrings(env, headers);
398 } 425 }
399 426
400 } // namespace cronet 427 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698