| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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_) { |
| 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 |
| OLD | NEW |