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