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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 // may be -1 if |array| is not a valid Java array), provide a safe wrapper | 42 // may be -1 if |array| is not a valid Java array), provide a safe wrapper |
43 // that always returns a valid, non-negative size. | 43 // that always returns a valid, non-negative size. |
44 template <typename JavaArrayType> | 44 template <typename JavaArrayType> |
45 size_t SafeGetArrayLength(JNIEnv* env, JavaArrayType jarray) { | 45 size_t SafeGetArrayLength(JNIEnv* env, JavaArrayType jarray) { |
46 DCHECK(jarray); | 46 DCHECK(jarray); |
47 jsize length = env->GetArrayLength(jarray); | 47 jsize length = env->GetArrayLength(jarray); |
48 DCHECK_GE(length, 0) << "Invalid array length: " << length; | 48 DCHECK_GE(length, 0) << "Invalid array length: " << length; |
49 return static_cast<size_t>(std::max(0, length)); | 49 return static_cast<size_t>(std::max(0, length)); |
50 } | 50 } |
51 | 51 |
| 52 int64_t ConvertTime(base::TimeTicks ticks, |
| 53 base::Time start_time, |
| 54 base::TimeTicks start_ticks) { |
| 55 if (ticks.is_null()) { |
| 56 return -1; |
| 57 } |
| 58 return (start_time + (ticks - start_ticks)).ToJavaTime(); |
| 59 } |
| 60 |
52 } // namespace | 61 } // namespace |
53 | 62 |
54 PendingWriteData::PendingWriteData(JNIEnv* env, | 63 PendingWriteData::PendingWriteData(JNIEnv* env, |
55 jobjectArray jwrite_buffer_list, | 64 jobjectArray jwrite_buffer_list, |
56 jintArray jwrite_buffer_pos_list, | 65 jintArray jwrite_buffer_pos_list, |
57 jintArray jwrite_buffer_limit_list, | 66 jintArray jwrite_buffer_limit_list, |
58 jboolean jwrite_end_of_stream) { | 67 jboolean jwrite_end_of_stream) { |
59 this->jwrite_buffer_list.Reset(env, jwrite_buffer_list); | 68 this->jwrite_buffer_list.Reset(env, jwrite_buffer_list); |
60 this->jwrite_buffer_pos_list.Reset(env, jwrite_buffer_pos_list); | 69 this->jwrite_buffer_pos_list.Reset(env, jwrite_buffer_pos_list); |
61 this->jwrite_buffer_limit_list.Reset(env, jwrite_buffer_limit_list); | 70 this->jwrite_buffer_limit_list.Reset(env, jwrite_buffer_limit_list); |
62 this->jwrite_end_of_stream = jwrite_end_of_stream; | 71 this->jwrite_end_of_stream = jwrite_end_of_stream; |
63 } | 72 } |
64 | 73 |
65 PendingWriteData::~PendingWriteData() { | 74 PendingWriteData::~PendingWriteData() { |
66 // Reset global references. | 75 // Reset global references. |
67 jwrite_buffer_list.Reset(); | 76 jwrite_buffer_list.Reset(); |
68 jwrite_buffer_pos_list.Reset(); | 77 jwrite_buffer_pos_list.Reset(); |
69 jwrite_buffer_limit_list.Reset(); | 78 jwrite_buffer_limit_list.Reset(); |
70 } | 79 } |
71 | 80 |
72 static jlong CreateBidirectionalStream( | 81 static jlong CreateBidirectionalStream( |
73 JNIEnv* env, | 82 JNIEnv* env, |
74 const base::android::JavaParamRef<jobject>& jbidi_stream, | 83 const base::android::JavaParamRef<jobject>& jbidi_stream, |
75 jlong jurl_request_context_adapter, | 84 jlong jurl_request_context_adapter, |
76 jboolean jsend_request_headers_automatically) { | 85 jboolean jsend_request_headers_automatically, |
| 86 jboolean jenable_metrics) { |
77 CronetURLRequestContextAdapter* context_adapter = | 87 CronetURLRequestContextAdapter* context_adapter = |
78 reinterpret_cast<CronetURLRequestContextAdapter*>( | 88 reinterpret_cast<CronetURLRequestContextAdapter*>( |
79 jurl_request_context_adapter); | 89 jurl_request_context_adapter); |
80 DCHECK(context_adapter); | 90 DCHECK(context_adapter); |
81 | 91 |
82 CronetBidirectionalStreamAdapter* adapter = | 92 CronetBidirectionalStreamAdapter* adapter = |
83 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, | 93 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, |
84 jsend_request_headers_automatically); | 94 jsend_request_headers_automatically, |
| 95 jenable_metrics); |
85 | 96 |
86 return reinterpret_cast<jlong>(adapter); | 97 return reinterpret_cast<jlong>(adapter); |
87 } | 98 } |
88 | 99 |
89 // static | 100 // static |
90 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { | 101 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { |
91 return RegisterNativesImpl(env); | 102 return RegisterNativesImpl(env); |
92 } | 103 } |
93 | 104 |
94 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( | 105 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( |
95 CronetURLRequestContextAdapter* context, | 106 CronetURLRequestContextAdapter* context, |
96 JNIEnv* env, | 107 JNIEnv* env, |
97 const base::android::JavaParamRef<jobject>& jbidi_stream, | 108 const base::android::JavaParamRef<jobject>& jbidi_stream, |
98 bool send_request_headers_automatically) | 109 bool send_request_headers_automatically, |
| 110 bool enable_metrics) |
99 : context_(context), | 111 : context_(context), |
100 owner_(env, jbidi_stream), | 112 owner_(env, jbidi_stream), |
101 send_request_headers_automatically_(send_request_headers_automatically), | 113 send_request_headers_automatically_(send_request_headers_automatically), |
| 114 enable_metrics_(enable_metrics), |
102 stream_failed_(false) {} | 115 stream_failed_(false) {} |
103 | 116 |
104 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { | 117 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { |
105 DCHECK(context_->IsOnNetworkThread()); | 118 DCHECK(context_->IsOnNetworkThread()); |
106 } | 119 } |
107 | 120 |
108 void CronetBidirectionalStreamAdapter::SendRequestHeaders( | 121 void CronetBidirectionalStreamAdapter::SendRequestHeaders( |
109 JNIEnv* env, | 122 JNIEnv* env, |
110 const base::android::JavaParamRef<jobject>& jcaller) { | 123 const base::android::JavaParamRef<jobject>& jcaller) { |
111 context_->PostTaskToNetworkThread( | 124 context_->PostTaskToNetworkThread( |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 } | 417 } |
405 } | 418 } |
406 | 419 |
407 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( | 420 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( |
408 bool send_on_canceled) { | 421 bool send_on_canceled) { |
409 DCHECK(context_->IsOnNetworkThread()); | 422 DCHECK(context_->IsOnNetworkThread()); |
410 if (send_on_canceled) { | 423 if (send_on_canceled) { |
411 JNIEnv* env = base::android::AttachCurrentThread(); | 424 JNIEnv* env = base::android::AttachCurrentThread(); |
412 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); | 425 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); |
413 } | 426 } |
| 427 MaybeReportMetrics(); |
414 delete this; | 428 delete this; |
415 } | 429 } |
416 | 430 |
417 base::android::ScopedJavaLocalRef<jobjectArray> | 431 base::android::ScopedJavaLocalRef<jobjectArray> |
418 CronetBidirectionalStreamAdapter::GetHeadersArray( | 432 CronetBidirectionalStreamAdapter::GetHeadersArray( |
419 JNIEnv* env, | 433 JNIEnv* env, |
420 const net::SpdyHeaderBlock& header_block) { | 434 const net::SpdyHeaderBlock& header_block) { |
421 DCHECK(context_->IsOnNetworkThread()); | 435 DCHECK(context_->IsOnNetworkThread()); |
422 | 436 |
423 std::vector<std::string> headers; | 437 std::vector<std::string> headers; |
424 for (const auto& header : header_block) { | 438 for (const auto& header : header_block) { |
425 headers.push_back(header.first.as_string()); | 439 headers.push_back(header.first.as_string()); |
426 headers.push_back(header.second.as_string()); | 440 headers.push_back(header.second.as_string()); |
427 } | 441 } |
428 return base::android::ToJavaArrayOfStrings(env, headers); | 442 return base::android::ToJavaArrayOfStrings(env, headers); |
429 } | 443 } |
430 | 444 |
| 445 void CronetBidirectionalStreamAdapter::MaybeReportMetrics() { |
| 446 if (!enable_metrics_) |
| 447 return; |
| 448 |
| 449 if (!bidi_stream_) |
| 450 return; |
| 451 net::LoadTimingInfo load_timing_info; |
| 452 bidi_stream_->GetLoadTimingInfo(&load_timing_info); |
| 453 JNIEnv* env = base::android::AttachCurrentThread(); |
| 454 base::Time start_time = load_timing_info.request_start_time; |
| 455 base::TimeTicks start_ticks = load_timing_info.request_start; |
| 456 cronet::Java_CronetBidirectionalStream_onMetricsCollected( |
| 457 env, owner_.obj(), start_time.ToJavaTime(), |
| 458 ConvertTime(load_timing_info.connect_timing.dns_start, start_time, |
| 459 start_ticks), |
| 460 ConvertTime(load_timing_info.connect_timing.dns_end, start_time, |
| 461 start_ticks), |
| 462 ConvertTime(load_timing_info.connect_timing.connect_start, start_time, |
| 463 start_ticks), |
| 464 ConvertTime(load_timing_info.connect_timing.connect_end, start_time, |
| 465 start_ticks), |
| 466 ConvertTime(load_timing_info.connect_timing.ssl_start, start_time, |
| 467 start_ticks), |
| 468 ConvertTime(load_timing_info.connect_timing.ssl_end, start_time, |
| 469 start_ticks), |
| 470 ConvertTime(load_timing_info.send_start, start_time, start_ticks), |
| 471 ConvertTime(load_timing_info.send_end, start_time, start_ticks), |
| 472 ConvertTime(load_timing_info.push_start, start_time, start_ticks), |
| 473 ConvertTime(load_timing_info.push_end, start_time, start_ticks), |
| 474 ConvertTime(load_timing_info.receive_headers_end, start_time, |
| 475 start_ticks), |
| 476 ConvertTime(base::TimeTicks::Now(), start_time, start_ticks), |
| 477 load_timing_info.socket_reused, bidi_stream_->GetTotalSentBytes(), |
| 478 bidi_stream_->GetTotalReceivedBytes()); |
| 479 } |
| 480 |
431 } // namespace cronet | 481 } // namespace cronet |
OLD | NEW |