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_URL_REQUEST_ADAPTER_H_
6#define COMPONENTS_CRONET_ANDROID_URL_REQUEST_ADAPTER_H_
7
8#include <jni.h>
9
10#include <string>
11
12#include "base/macros.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "net/base/request_priority.h"
16#include "net/http/http_request_headers.h"
17#include "net/url_request/url_request.h"
18
19namespace net {
20class GrowableIOBuffer;
21class HttpResponseHeaders;
22class UploadDataStream;
23}  // namespace net
24
25namespace cronet {
26
27class URLRequestContextAdapter;
28
29// An adapter from the JNI |UrlRequest| object and the Chromium |URLRequest|
30// object.
31class URLRequestAdapter : public net::URLRequest::Delegate {
32 public:
33  // The delegate which is called when the request finishes.
34  class URLRequestAdapterDelegate
35      : public base::RefCountedThreadSafe<URLRequestAdapterDelegate> {
36   public:
37    virtual void OnResponseStarted(URLRequestAdapter* request) = 0;
38    virtual void OnBytesRead(URLRequestAdapter* request) = 0;
39    virtual void OnRequestFinished(URLRequestAdapter* request) = 0;
40    virtual int ReadFromUploadChannel(net::IOBuffer* buf, int buf_length) = 0;
41
42   protected:
43    friend class base::RefCountedThreadSafe<URLRequestAdapterDelegate>;
44    virtual ~URLRequestAdapterDelegate() {}
45  };
46
47  URLRequestAdapter(URLRequestContextAdapter* context,
48                    URLRequestAdapterDelegate* delegate,
49                    GURL url,
50                    net::RequestPriority priority);
51  virtual ~URLRequestAdapter();
52
53  // Sets the request method GET, POST etc
54  void SetMethod(const std::string& method);
55
56  // Adds a header to the request
57  void AddHeader(const std::string& name, const std::string& value);
58
59  // Sets the contents of the POST or PUT request
60  void SetUploadContent(const char* bytes, int bytes_len);
61
62  // Sets the request to streaming upload.
63  void SetUploadChannel(JNIEnv* env, int64 content_length);
64
65  // Indicates that the request body will be streamed by calling AppendChunk()
66  // repeatedly. This must be called before Start().
67  void EnableChunkedUpload();
68
69  // Appends a chunk to the POST body.
70  // This must be called after EnableChunkedUpload() and Start().
71  void AppendChunk(const char* bytes, int bytes_len, bool is_last_chunk);
72
73  // Starts the request.
74  void Start();
75
76  // Cancels the request.
77  void Cancel();
78
79  // Releases all resources for the request and deletes the object itself.
80  void Destroy();
81
82  // Returns the URL of the request.
83  GURL url() const { return url_; }
84
85  // Returns the error code after the request is complete.
86  // Negative codes indicate system errors.
87  int error_code() const { return error_code_; }
88
89  // Returns the HTTP status code.
90  int http_status_code() const {
91    return http_status_code_;
92  };
93
94  // Returns the value of the content-length response header.
95  int64 content_length() const { return expected_size_; }
96
97  // Returns the value of the content-type response header.
98  std::string content_type() const { return content_type_; }
99
100  // Returns the value of the specified response header.
101  std::string GetHeader(const std::string& name) const;
102
103  // Get all response headers, as a HttpResponseHeaders object.
104  net::HttpResponseHeaders* GetResponseHeaders() const;
105
106  // Returns the overall number of bytes read.
107  size_t bytes_read() const { return bytes_read_; }
108
109  // Returns a pointer to the downloaded data.
110  unsigned char* Data() const;
111
112  // Get NPN or ALPN Negotiated Protocol (if any) from HttpResponseInfo.
113  std::string GetNegotiatedProtocol() const;
114
115  virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE;
116
117  virtual void OnReadCompleted(net::URLRequest* request,
118                               int bytes_read) OVERRIDE;
119
120 private:
121  static void OnDestroyRequest(URLRequestAdapter* self);
122
123  void OnInitiateConnection();
124  void OnCancelRequest();
125  void OnRequestSucceeded();
126  void OnRequestFailed();
127  void OnRequestCompleted();
128  void OnRequestCanceled();
129  void OnBytesRead(int bytes_read);
130  void OnAppendChunk(const scoped_ptr<char[]> bytes, int bytes_len,
131                     bool is_last_chunk);
132
133  void Read();
134
135  URLRequestContextAdapter* context_;
136  scoped_refptr<URLRequestAdapterDelegate> delegate_;
137  GURL url_;
138  net::RequestPriority priority_;
139  std::string method_;
140  net::HttpRequestHeaders headers_;
141  scoped_ptr<net::URLRequest> url_request_;
142  scoped_ptr<net::UploadDataStream> upload_data_stream_;
143  scoped_refptr<net::GrowableIOBuffer> read_buffer_;
144  int bytes_read_;
145  int total_bytes_read_;
146  int error_code_;
147  int http_status_code_;
148  std::string content_type_;
149  bool canceled_;
150  int64 expected_size_;
151  bool chunked_upload_;
152
153  DISALLOW_COPY_AND_ASSIGN(URLRequestAdapter);
154};
155
156}  // namespace cronet
157
158#endif  // COMPONENTS_CRONET_ANDROID_URL_REQUEST_ADAPTER_H_
159