xref: /aosp_15_r20/external/cronet/components/cronet/android/cronet_url_request_adapter.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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