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

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

Issue 1911353003: [Cronet] Do not call into BidirectionalStream::SendData if stream failed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 51
52 // static 52 // static
53 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { 53 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) {
54 return RegisterNativesImpl(env); 54 return RegisterNativesImpl(env);
55 } 55 }
56 56
57 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( 57 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter(
58 CronetURLRequestContextAdapter* context, 58 CronetURLRequestContextAdapter* context,
59 JNIEnv* env, 59 JNIEnv* env,
60 const JavaParamRef<jobject>& jbidi_stream) 60 const JavaParamRef<jobject>& jbidi_stream)
61 : context_(context), owner_(env, jbidi_stream) {} 61 : context_(context), owner_(env, jbidi_stream), stream_failed_(false) {}
62 62
63 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { 63 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {
64 DCHECK(context_->IsOnNetworkThread()); 64 DCHECK(context_->IsOnNetworkThread());
65 } 65 }
66 66
67 jint CronetBidirectionalStreamAdapter::Start( 67 jint CronetBidirectionalStreamAdapter::Start(
68 JNIEnv* env, 68 JNIEnv* env,
69 const JavaParamRef<jobject>& jcaller, 69 const JavaParamRef<jobject>& jcaller,
70 const JavaParamRef<jstring>& jurl, 70 const JavaParamRef<jstring>& jurl,
71 jint jpriority, 71 jint jpriority,
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 void CronetBidirectionalStreamAdapter::OnTrailersReceived( 229 void CronetBidirectionalStreamAdapter::OnTrailersReceived(
230 const net::SpdyHeaderBlock& response_trailers) { 230 const net::SpdyHeaderBlock& response_trailers) {
231 DCHECK(context_->IsOnNetworkThread()); 231 DCHECK(context_->IsOnNetworkThread());
232 JNIEnv* env = base::android::AttachCurrentThread(); 232 JNIEnv* env = base::android::AttachCurrentThread();
233 cronet::Java_CronetBidirectionalStream_onResponseTrailersReceived( 233 cronet::Java_CronetBidirectionalStream_onResponseTrailersReceived(
234 env, owner_.obj(), GetHeadersArray(env, response_trailers).obj()); 234 env, owner_.obj(), GetHeadersArray(env, response_trailers).obj());
235 } 235 }
236 236
237 void CronetBidirectionalStreamAdapter::OnFailed(int error) { 237 void CronetBidirectionalStreamAdapter::OnFailed(int error) {
238 DCHECK(context_->IsOnNetworkThread()); 238 DCHECK(context_->IsOnNetworkThread());
239 stream_failed_ = true;
239 JNIEnv* env = base::android::AttachCurrentThread(); 240 JNIEnv* env = base::android::AttachCurrentThread();
240 cronet::Java_CronetBidirectionalStream_onError( 241 cronet::Java_CronetBidirectionalStream_onError(
241 env, owner_.obj(), NetErrorToUrlRequestError(error), error, 242 env, owner_.obj(), NetErrorToUrlRequestError(error), error,
242 ConvertUTF8ToJavaString(env, net::ErrorToString(error)).obj(), 243 ConvertUTF8ToJavaString(env, net::ErrorToString(error)).obj(),
243 bidi_stream_->GetTotalReceivedBytes()); 244 bidi_stream_->GetTotalReceivedBytes());
244 } 245 }
245 246
246 void CronetBidirectionalStreamAdapter::StartOnNetworkThread( 247 void CronetBidirectionalStreamAdapter::StartOnNetworkThread(
247 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info) { 248 std::unique_ptr<net::BidirectionalStreamRequestInfo> request_info) {
248 DCHECK(context_->IsOnNetworkThread()); 249 DCHECK(context_->IsOnNetworkThread());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 } 281 }
281 282
282 void CronetBidirectionalStreamAdapter::WriteDataOnNetworkThread( 283 void CronetBidirectionalStreamAdapter::WriteDataOnNetworkThread(
283 scoped_refptr<IOBufferWithByteBuffer> write_buffer, 284 scoped_refptr<IOBufferWithByteBuffer> write_buffer,
284 int buffer_size, 285 int buffer_size,
285 bool end_of_stream) { 286 bool end_of_stream) {
286 DCHECK(context_->IsOnNetworkThread()); 287 DCHECK(context_->IsOnNetworkThread());
287 DCHECK(write_buffer); 288 DCHECK(write_buffer);
288 DCHECK(!write_buffer_); 289 DCHECK(!write_buffer_);
289 290
291 if (stream_failed_) {
kapishnikov 2016/04/23 00:29:47 Should we add this check to other methods like Rea
xunjieli 2016/04/23 10:39:00 No that shouldn't be necessary. (1) ReadData can b
kapishnikov 2016/04/23 14:33:36 Acknowledged.
292 // If stream failed between the time when WriteData is invoked and
293 // WriteDataOnNetworkThread is executed, do not call into |bidi_stream_|
294 // since the underlying stream might have been destroyed. Do not invoke
295 // Java callback either, since onError is posted when |stream_failed_| is
296 // set to true.
297 return;
298 }
290 write_buffer_ = write_buffer; 299 write_buffer_ = write_buffer;
291 bidi_stream_->SendData(write_buffer_.get(), buffer_size, end_of_stream); 300 bidi_stream_->SendData(write_buffer_.get(), buffer_size, end_of_stream);
292 } 301 }
293 302
294 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( 303 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread(
295 bool send_on_canceled) { 304 bool send_on_canceled) {
296 DCHECK(context_->IsOnNetworkThread()); 305 DCHECK(context_->IsOnNetworkThread());
297 if (send_on_canceled) { 306 if (send_on_canceled) {
298 JNIEnv* env = base::android::AttachCurrentThread(); 307 JNIEnv* env = base::android::AttachCurrentThread();
299 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); 308 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj());
300 } 309 }
301 delete this; 310 delete this;
302 } 311 }
303 312
304 base::android::ScopedJavaLocalRef<jobjectArray> 313 base::android::ScopedJavaLocalRef<jobjectArray>
305 CronetBidirectionalStreamAdapter::GetHeadersArray( 314 CronetBidirectionalStreamAdapter::GetHeadersArray(
306 JNIEnv* env, 315 JNIEnv* env,
307 const net::SpdyHeaderBlock& header_block) { 316 const net::SpdyHeaderBlock& header_block) {
308 DCHECK(context_->IsOnNetworkThread()); 317 DCHECK(context_->IsOnNetworkThread());
309 318
310 std::vector<std::string> headers; 319 std::vector<std::string> headers;
311 for (const auto& header : header_block) { 320 for (const auto& header : header_block) {
312 headers.push_back(header.first.as_string()); 321 headers.push_back(header.first.as_string());
313 headers.push_back(header.second.as_string()); 322 headers.push_back(header.second.as_string());
314 } 323 }
315 return base::android::ToJavaArrayOfStrings(env, headers); 324 return base::android::ToJavaArrayOfStrings(env, headers);
316 } 325 }
317 326
318 } // namespace cronet 327 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698