1 // Copyright 2014 The Chromium Authors 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/memory/raw_ptr.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 CronetContextAdapter; 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(CronetContextAdapter* 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 jtraffic_stats_tag_set, 54 jint jtraffic_stats_tag, 55 jboolean jtraffic_stats_uid_set, 56 jint jtraffic_stats_uid, 57 net::Idempotency idempotency, 58 jlong network); 59 60 CronetURLRequestAdapter(const CronetURLRequestAdapter&) = delete; 61 CronetURLRequestAdapter& operator=(const CronetURLRequestAdapter&) = delete; 62 63 ~CronetURLRequestAdapter() override; 64 65 // Methods called prior to Start are never called on network thread. 66 67 // Sets the request method GET, POST etc. 68 jboolean SetHttpMethod(JNIEnv* env, 69 const base::android::JavaParamRef<jobject>& jcaller, 70 const base::android::JavaParamRef<jstring>& jmethod); 71 72 // Adds a header to the request before it starts. 73 jboolean AddRequestHeader(JNIEnv* env, 74 const base::android::JavaParamRef<jobject>& jcaller, 75 const base::android::JavaParamRef<jstring>& jname, 76 const base::android::JavaParamRef<jstring>& jvalue); 77 78 // Adds a request body to the request before it starts. 79 void SetUpload(std::unique_ptr<net::UploadDataStream> upload); 80 81 // Starts the request. 82 void Start(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); 83 84 void GetStatus(JNIEnv* env, 85 const base::android::JavaParamRef<jobject>& jcaller, 86 const base::android::JavaParamRef<jobject>& jstatus_listener); 87 88 // Follows redirect. 89 void FollowDeferredRedirect( 90 JNIEnv* env, 91 const base::android::JavaParamRef<jobject>& jcaller); 92 93 // Reads more data. 94 jboolean ReadData(JNIEnv* env, 95 const base::android::JavaParamRef<jobject>& jcaller, 96 const base::android::JavaParamRef<jobject>& jbyte_buffer, 97 jint jposition, 98 jint jcapacity); 99 100 // Releases all resources for the request and deletes the object itself. 101 // |jsend_on_canceled| indicates if Java onCanceled callback should be 102 // issued to indicate when no more callbacks will be issued. 103 void Destroy(JNIEnv* env, 104 const base::android::JavaParamRef<jobject>& jcaller, 105 jboolean jsend_on_canceled); 106 107 // CronetURLRequest::Callback implementations: 108 void OnReceivedRedirect(const std::string& new_location, 109 int http_status_code, 110 const std::string& http_status_text, 111 const net::HttpResponseHeaders* headers, 112 bool was_cached, 113 const std::string& negotiated_protocol, 114 const std::string& proxy_server, 115 int64_t received_byte_count) override; 116 void OnResponseStarted(int http_status_code, 117 const std::string& http_status_text, 118 const net::HttpResponseHeaders* headers, 119 bool was_cached, 120 const std::string& negotiated_protocol, 121 const std::string& proxy_server, 122 int64_t received_byte_count) override; 123 void OnReadCompleted(scoped_refptr<net::IOBuffer> buffer, 124 int bytes_read, 125 int64_t received_byte_count) override; 126 void OnSucceeded(int64_t received_byte_count) override; 127 void OnError(int net_error, 128 int quic_error, 129 const std::string& error_string, 130 int64_t received_byte_count) override; 131 void OnCanceled() override; 132 void OnDestroyed() override; 133 void OnMetricsCollected(const base::Time& request_start_time, 134 const base::TimeTicks& request_start, 135 const base::TimeTicks& dns_start, 136 const base::TimeTicks& dns_end, 137 const base::TimeTicks& connect_start, 138 const base::TimeTicks& connect_end, 139 const base::TimeTicks& ssl_start, 140 const base::TimeTicks& ssl_end, 141 const base::TimeTicks& send_start, 142 const base::TimeTicks& send_end, 143 const base::TimeTicks& push_start, 144 const base::TimeTicks& push_end, 145 const base::TimeTicks& receive_headers_end, 146 const base::TimeTicks& request_end, 147 bool socket_reused, 148 int64_t sent_bytes_count, 149 int64_t received_bytes_count, 150 bool quic_connection_migration_attempted, 151 bool quic_connection_migration_successful) override; 152 153 void OnStatus( 154 const base::android::ScopedJavaGlobalRef<jobject>& status_listener_ref, 155 net::LoadState load_status); 156 157 private: 158 friend class TestUtil; 159 160 // Native Cronet URL Request that owns |this|. 161 raw_ptr<CronetURLRequest> request_; 162 163 // Java object that owns this CronetContextAdapter. 164 base::android::ScopedJavaGlobalRef<jobject> owner_; 165 }; 166 167 } // namespace cronet 168 169 #endif // COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_ 170