| 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |