1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ 6 #define COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ 7 8 #include <jni.h> 9 10 #include <memory> 11 #include <string> 12 13 #include "base/android/jni_android.h" 14 #include "base/android/jni_array.h" 15 #include "base/android/jni_string.h" 16 #include "base/android/scoped_java_ref.h" 17 #include "base/macros.h" 18 #include "base/memory/ref_counted.h" 19 #include "base/time/time.h" 20 #include "components/cronet/cronet_url_request.h" 21 #include "url/gurl.h" 22 23 namespace net { 24 enum LoadState; 25 class UploadDataStream; 26 } // namespace net 27 28 namespace cronet { 29 30 class CronetURLRequestContextAdapter; 31 class TestUtil; 32 33 // An adapter from Java CronetUrlRequest object to native CronetURLRequest. 34 // Created and configured from a Java thread. Start, ReadData, and Destroy are 35 // posted to network thread and all callbacks into the Java CronetUrlRequest are 36 // done on the network thread. Java CronetUrlRequest is expected to initiate the 37 // next step like FollowDeferredRedirect, ReadData or Destroy. Public methods 38 // can be called on any thread. 39 class CronetURLRequestAdapter : public CronetURLRequest::Callback { 40 public: 41 // Bypasses cache if |jdisable_cache| is true. If context is not set up to 42 // use cache, |jdisable_cache| has no effect. |jdisable_connection_migration| 43 // causes connection migration to be disabled for this request if true. If 44 // global connection migration flag is not enabled, 45 // |jdisable_connection_migration| has no effect. 46 CronetURLRequestAdapter(CronetURLRequestContextAdapter* context, 47 JNIEnv* env, 48 jobject jurl_request, 49 const GURL& url, 50 net::RequestPriority priority, 51 jboolean jdisable_cache, 52 jboolean jdisable_connection_migration, 53 jboolean jenable_metrics, 54 jboolean jtraffic_stats_tag_set, 55 jint jtraffic_stats_tag, 56 jboolean jtraffic_stats_uid_set, 57 jint jtraffic_stats_uid, 58 net::Idempotency idempotency); 59 ~CronetURLRequestAdapter() override; 60 61 // Methods called prior to Start are never called on network thread. 62 63 // Sets the request method GET, POST etc. 64 jboolean SetHttpMethod(JNIEnv* env, 65 const base::android::JavaParamRef<jobject>& jcaller, 66 const base::android::JavaParamRef<jstring>& jmethod); 67 68 // Adds a header to the request before it starts. 69 jboolean AddRequestHeader(JNIEnv* env, 70 const base::android::JavaParamRef<jobject>& jcaller, 71 const base::android::JavaParamRef<jstring>& jname, 72 const base::android::JavaParamRef<jstring>& jvalue); 73 74 // Adds a request body to the request before it starts. 75 void SetUpload(std::unique_ptr<net::UploadDataStream> upload); 76 77 // Starts the request. 78 void Start(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); 79 80 void GetStatus(JNIEnv* env, 81 const base::android::JavaParamRef<jobject>& jcaller, 82 const base::android::JavaParamRef<jobject>& jstatus_listener); 83 84 // Follows redirect. 85 void FollowDeferredRedirect( 86 JNIEnv* env, 87 const base::android::JavaParamRef<jobject>& jcaller); 88 89 // Reads more data. 90 jboolean ReadData(JNIEnv* env, 91 const base::android::JavaParamRef<jobject>& jcaller, 92 const base::android::JavaParamRef<jobject>& jbyte_buffer, 93 jint jposition, 94 jint jcapacity); 95 96 // Releases all resources for the request and deletes the object itself. 97 // |jsend_on_canceled| indicates if Java onCanceled callback should be 98 // issued to indicate when no more callbacks will be issued. 99 void Destroy(JNIEnv* env, 100 const base::android::JavaParamRef<jobject>& jcaller, 101 jboolean jsend_on_canceled); 102 103 // CronetURLRequest::Callback implementations: 104 void OnReceivedRedirect(const std::string& new_location, 105 int http_status_code, 106 const std::string& http_status_text, 107 const net::HttpResponseHeaders* headers, 108 bool was_cached, 109 const std::string& negotiated_protocol, 110 const std::string& proxy_server, 111 int64_t received_byte_count) override; 112 void OnResponseStarted(int http_status_code, 113 const std::string& http_status_text, 114 const net::HttpResponseHeaders* headers, 115 bool was_cached, 116 const std::string& negotiated_protocol, 117 const std::string& proxy_server, 118 int64_t received_byte_count) override; 119 void OnReadCompleted(scoped_refptr<net::IOBuffer> buffer, 120 int bytes_read, 121 int64_t received_byte_count) override; 122 void OnSucceeded(int64_t received_byte_count) override; 123 void OnError(int net_error, 124 int quic_error, 125 const std::string& error_string, 126 int64_t received_byte_count) override; 127 void OnCanceled() override; 128 void OnDestroyed() override; 129 void OnMetricsCollected(const base::Time& request_start_time, 130 const base::TimeTicks& request_start, 131 const base::TimeTicks& dns_start, 132 const base::TimeTicks& dns_end, 133 const base::TimeTicks& connect_start, 134 const base::TimeTicks& connect_end, 135 const base::TimeTicks& ssl_start, 136 const base::TimeTicks& ssl_end, 137 const base::TimeTicks& send_start, 138 const base::TimeTicks& send_end, 139 const base::TimeTicks& push_start, 140 const base::TimeTicks& push_end, 141 const base::TimeTicks& receive_headers_end, 142 const base::TimeTicks& request_end, 143 bool socket_reused, 144 int64_t sent_bytes_count, 145 int64_t received_bytes_count) override; 146 147 void OnStatus( 148 const base::android::ScopedJavaGlobalRef<jobject>& status_listener_ref, 149 net::LoadState load_status); 150 151 private: 152 friend class TestUtil; 153 154 // Native Cronet URL Request that owns |this|. 155 CronetURLRequest* request_; 156 157 // Java object that owns this CronetURLRequestContextAdapter. 158 base::android::ScopedJavaGlobalRef<jobject> owner_; 159 160 DISALLOW_COPY_AND_ASSIGN(CronetURLRequestAdapter); 161 }; 162 163 } // namespace cronet 164 165 #endif // COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ 166