| 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" |
| 11 #include "base/location.h" | 11 #include "base/location.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 14 #include "components/cronet/android/cronet_url_request_context_adapter.h" | 14 #include "components/cronet/android/cronet_url_request_context_adapter.h" |
| 15 #include "components/cronet/android/io_buffer_with_byte_buffer.h" | 15 #include "components/cronet/android/io_buffer_with_byte_buffer.h" |
| 16 #include "components/cronet/android/metrics_util.h" |
| 16 #include "components/cronet/android/url_request_error.h" | 17 #include "components/cronet/android/url_request_error.h" |
| 17 #include "jni/CronetBidirectionalStream_jni.h" | 18 #include "jni/CronetBidirectionalStream_jni.h" |
| 18 #include "net/base/net_errors.h" | 19 #include "net/base/net_errors.h" |
| 19 #include "net/base/request_priority.h" | 20 #include "net/base/request_priority.h" |
| 20 #include "net/http/bidirectional_stream_request_info.h" | 21 #include "net/http/bidirectional_stream_request_info.h" |
| 21 #include "net/http/http_network_session.h" | 22 #include "net/http/http_network_session.h" |
| 22 #include "net/http/http_response_headers.h" | 23 #include "net/http/http_response_headers.h" |
| 23 #include "net/http/http_status_code.h" | 24 #include "net/http/http_status_code.h" |
| 24 #include "net/http/http_transaction_factory.h" | 25 #include "net/http/http_transaction_factory.h" |
| 25 #include "net/http/http_util.h" | 26 #include "net/http/http_util.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 // Reset global references. | 67 // Reset global references. |
| 67 jwrite_buffer_list.Reset(); | 68 jwrite_buffer_list.Reset(); |
| 68 jwrite_buffer_pos_list.Reset(); | 69 jwrite_buffer_pos_list.Reset(); |
| 69 jwrite_buffer_limit_list.Reset(); | 70 jwrite_buffer_limit_list.Reset(); |
| 70 } | 71 } |
| 71 | 72 |
| 72 static jlong CreateBidirectionalStream( | 73 static jlong CreateBidirectionalStream( |
| 73 JNIEnv* env, | 74 JNIEnv* env, |
| 74 const base::android::JavaParamRef<jobject>& jbidi_stream, | 75 const base::android::JavaParamRef<jobject>& jbidi_stream, |
| 75 jlong jurl_request_context_adapter, | 76 jlong jurl_request_context_adapter, |
| 76 jboolean jsend_request_headers_automatically) { | 77 jboolean jsend_request_headers_automatically, |
| 78 jboolean jenable_metrics) { |
| 77 CronetURLRequestContextAdapter* context_adapter = | 79 CronetURLRequestContextAdapter* context_adapter = |
| 78 reinterpret_cast<CronetURLRequestContextAdapter*>( | 80 reinterpret_cast<CronetURLRequestContextAdapter*>( |
| 79 jurl_request_context_adapter); | 81 jurl_request_context_adapter); |
| 80 DCHECK(context_adapter); | 82 DCHECK(context_adapter); |
| 81 | 83 |
| 82 CronetBidirectionalStreamAdapter* adapter = | 84 CronetBidirectionalStreamAdapter* adapter = |
| 83 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, | 85 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, |
| 84 jsend_request_headers_automatically); | 86 jsend_request_headers_automatically, |
| 87 jenable_metrics); |
| 85 | 88 |
| 86 return reinterpret_cast<jlong>(adapter); | 89 return reinterpret_cast<jlong>(adapter); |
| 87 } | 90 } |
| 88 | 91 |
| 89 // static | 92 // static |
| 90 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { | 93 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { |
| 91 return RegisterNativesImpl(env); | 94 return RegisterNativesImpl(env); |
| 92 } | 95 } |
| 93 | 96 |
| 94 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( | 97 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( |
| 95 CronetURLRequestContextAdapter* context, | 98 CronetURLRequestContextAdapter* context, |
| 96 JNIEnv* env, | 99 JNIEnv* env, |
| 97 const base::android::JavaParamRef<jobject>& jbidi_stream, | 100 const base::android::JavaParamRef<jobject>& jbidi_stream, |
| 98 bool send_request_headers_automatically) | 101 bool send_request_headers_automatically, |
| 102 bool enable_metrics) |
| 99 : context_(context), | 103 : context_(context), |
| 100 owner_(env, jbidi_stream), | 104 owner_(env, jbidi_stream), |
| 101 send_request_headers_automatically_(send_request_headers_automatically), | 105 send_request_headers_automatically_(send_request_headers_automatically), |
| 106 enable_metrics_(enable_metrics), |
| 102 stream_failed_(false) {} | 107 stream_failed_(false) {} |
| 103 | 108 |
| 104 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { | 109 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { |
| 105 DCHECK(context_->IsOnNetworkThread()); | 110 DCHECK(context_->IsOnNetworkThread()); |
| 106 } | 111 } |
| 107 | 112 |
| 108 void CronetBidirectionalStreamAdapter::SendRequestHeaders( | 113 void CronetBidirectionalStreamAdapter::SendRequestHeaders( |
| 109 JNIEnv* env, | 114 JNIEnv* env, |
| 110 const base::android::JavaParamRef<jobject>& jcaller) { | 115 const base::android::JavaParamRef<jobject>& jcaller) { |
| 111 context_->PostTaskToNetworkThread( | 116 context_->PostTaskToNetworkThread( |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 } | 409 } |
| 405 } | 410 } |
| 406 | 411 |
| 407 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( | 412 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( |
| 408 bool send_on_canceled) { | 413 bool send_on_canceled) { |
| 409 DCHECK(context_->IsOnNetworkThread()); | 414 DCHECK(context_->IsOnNetworkThread()); |
| 410 if (send_on_canceled) { | 415 if (send_on_canceled) { |
| 411 JNIEnv* env = base::android::AttachCurrentThread(); | 416 JNIEnv* env = base::android::AttachCurrentThread(); |
| 412 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); | 417 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); |
| 413 } | 418 } |
| 419 MaybeReportMetrics(); |
| 414 delete this; | 420 delete this; |
| 415 } | 421 } |
| 416 | 422 |
| 417 base::android::ScopedJavaLocalRef<jobjectArray> | 423 base::android::ScopedJavaLocalRef<jobjectArray> |
| 418 CronetBidirectionalStreamAdapter::GetHeadersArray( | 424 CronetBidirectionalStreamAdapter::GetHeadersArray( |
| 419 JNIEnv* env, | 425 JNIEnv* env, |
| 420 const net::SpdyHeaderBlock& header_block) { | 426 const net::SpdyHeaderBlock& header_block) { |
| 421 DCHECK(context_->IsOnNetworkThread()); | 427 DCHECK(context_->IsOnNetworkThread()); |
| 422 | 428 |
| 423 std::vector<std::string> headers; | 429 std::vector<std::string> headers; |
| 424 for (const auto& header : header_block) { | 430 for (const auto& header : header_block) { |
| 425 headers.push_back(header.first.as_string()); | 431 headers.push_back(header.first.as_string()); |
| 426 headers.push_back(header.second.as_string()); | 432 headers.push_back(header.second.as_string()); |
| 427 } | 433 } |
| 428 return base::android::ToJavaArrayOfStrings(env, headers); | 434 return base::android::ToJavaArrayOfStrings(env, headers); |
| 429 } | 435 } |
| 430 | 436 |
| 437 void CronetBidirectionalStreamAdapter::MaybeReportMetrics() { |
| 438 if (!enable_metrics_) |
| 439 return; |
| 440 |
| 441 if (!bidi_stream_) |
| 442 return; |
| 443 net::LoadTimingInfo load_timing_info; |
| 444 bidi_stream_->GetLoadTimingInfo(&load_timing_info); |
| 445 JNIEnv* env = base::android::AttachCurrentThread(); |
| 446 base::Time start_time = load_timing_info.request_start_time; |
| 447 base::TimeTicks start_ticks = load_timing_info.request_start; |
| 448 cronet::Java_CronetBidirectionalStream_onMetricsCollected( |
| 449 env, owner_.obj(), |
| 450 metrics_util::ConvertTime(start_ticks, start_ticks, start_time), |
| 451 metrics_util::ConvertTime(load_timing_info.connect_timing.dns_start, |
| 452 start_ticks, start_time), |
| 453 metrics_util::ConvertTime(load_timing_info.connect_timing.dns_end, |
| 454 start_ticks, start_time), |
| 455 metrics_util::ConvertTime(load_timing_info.connect_timing.connect_start, |
| 456 start_ticks, start_time), |
| 457 metrics_util::ConvertTime(load_timing_info.connect_timing.connect_end, |
| 458 start_ticks, start_time), |
| 459 metrics_util::ConvertTime(load_timing_info.connect_timing.ssl_start, |
| 460 start_ticks, start_time), |
| 461 metrics_util::ConvertTime(load_timing_info.connect_timing.ssl_end, |
| 462 start_ticks, start_time), |
| 463 metrics_util::ConvertTime(load_timing_info.send_start, start_ticks, |
| 464 start_time), |
| 465 metrics_util::ConvertTime(load_timing_info.send_end, start_ticks, |
| 466 start_time), |
| 467 metrics_util::ConvertTime(load_timing_info.push_start, start_ticks, |
| 468 start_time), |
| 469 metrics_util::ConvertTime(load_timing_info.push_end, start_ticks, |
| 470 start_time), |
| 471 metrics_util::ConvertTime(load_timing_info.receive_headers_end, |
| 472 start_ticks, start_time), |
| 473 metrics_util::ConvertTime(base::TimeTicks::Now(), start_ticks, |
| 474 start_time), |
| 475 load_timing_info.socket_reused, bidi_stream_->GetTotalSentBytes(), |
| 476 bidi_stream_->GetTotalReceivedBytes()); |
| 477 } |
| 478 |
| 431 } // namespace cronet | 479 } // namespace cronet |
| OLD | NEW |