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 |