1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_
#define COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_
#include <jni.h>
#include <memory>
#include <string>
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/callback.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "net/base/request_priority.h"
#include "net/url_request/url_request.h"
#include "url/gurl.h"
namespace net {
class HttpRequestHeaders;
class SSLCertRequestInfo;
class SSLInfo;
class UploadDataStream;
} // namespace net
namespace cronet {
class CronetURLRequestContextAdapter;
class IOBufferWithByteBuffer;
class TestUtil;
bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env);
// An adapter from Java CronetUrlRequest object to net::URLRequest.
// Created and configured from a Java thread. Start, ReadData, and Destroy are
// posted to network thread and all callbacks into the Java CronetUrlRequest are
// done on the network thread. Java CronetUrlRequest is expected to initiate the
// next step like FollowDeferredRedirect, ReadData or Destroy. Public methods
// can be called on any thread.
class CronetURLRequestAdapter : public net::URLRequest::Delegate {
public:
// Bypasses cache if |jdisable_cache| is true. If context is not set up to
// use cache, |jdisable_cache| has no effect. |jdisable_connection_migration|
// causes connection migration to be disabled for this request if true. If
// global connection migration flag is not enabled,
// |jdisable_connection_migration| has no effect.
CronetURLRequestAdapter(CronetURLRequestContextAdapter* context,
JNIEnv* env,
jobject jurl_request,
const GURL& url,
net::RequestPriority priority,
jboolean jdisable_cache,
jboolean jdisable_connection_migration,
jboolean jenable_metrics);
~CronetURLRequestAdapter() override;
// Methods called prior to Start are never called on network thread.
// Sets the request method GET, POST etc.
jboolean SetHttpMethod(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jstring>& jmethod);
// Adds a header to the request before it starts.
jboolean AddRequestHeader(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jstring>& jname,
const base::android::JavaParamRef<jstring>& jvalue);
// Adds a request body to the request before it starts.
void SetUpload(std::unique_ptr<net::UploadDataStream> upload);
// Starts the request.
void Start(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
void GetStatus(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jobject>& jstatus_listener) const;
// Follows redirect.
void FollowDeferredRedirect(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller);
// Reads more data.
jboolean ReadData(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jobject>& jbyte_buffer,
jint jposition,
jint jcapacity);
// Releases all resources for the request and deletes the object itself.
// |jsend_on_canceled| indicates if Java onCanceled callback should be
// issued to indicate when no more callbacks will be issued.
void Destroy(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jboolean jsend_on_canceled);
// net::URLRequest::Delegate implementations:
void OnReceivedRedirect(net::URLRequest* request,
const net::RedirectInfo& redirect_info,
bool* defer_redirect) override;
void OnCertificateRequested(
net::URLRequest* request,
net::SSLCertRequestInfo* cert_request_info) override;
void OnSSLCertificateError(net::URLRequest* request,
const net::SSLInfo& ssl_info,
bool fatal) override;
void OnResponseStarted(net::URLRequest* request, int net_error) override;
void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
private:
friend class TestUtil;
void StartOnNetworkThread();
void GetStatusOnNetworkThread(
const base::android::ScopedJavaGlobalRef<jobject>& jstatus_listener_ref)
const;
// Gets response headers on network thread.
base::android::ScopedJavaLocalRef<jobjectArray> GetResponseHeaders(
JNIEnv* env);
void FollowDeferredRedirectOnNetworkThread();
void ReadDataOnNetworkThread(
scoped_refptr<IOBufferWithByteBuffer> read_buffer,
int buffer_size);
void DestroyOnNetworkThread(bool send_on_canceled);
// Report error and cancel request_adapter.
void ReportError(net::URLRequest* request, int net_error);
// Reports metrics collected to the Java layer
void MaybeReportMetrics(JNIEnv* env) const;
CronetURLRequestContextAdapter* context_;
// Java object that owns this CronetURLRequestContextAdapter.
base::android::ScopedJavaGlobalRef<jobject> owner_;
const GURL initial_url_;
const net::RequestPriority initial_priority_;
std::string initial_method_;
int load_flags_;
net::HttpRequestHeaders initial_request_headers_;
std::unique_ptr<net::UploadDataStream> upload_;
scoped_refptr<IOBufferWithByteBuffer> read_buffer_;
std::unique_ptr<net::URLRequest> url_request_;
// Whether detailed metrics should be collected and reported to Java for this
// request.
const bool enable_metrics_;
DISALLOW_COPY_AND_ASSIGN(CronetURLRequestAdapter);
};
} // namespace cronet
#endif // COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_ADAPTER_H_
|