Home | History | Annotate | Download | only in net
      1 // Copyright (c) 2012 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 ANDROID_WEBVIEW_NATIVE_ANDROID_STREAM_READER_URL_REQUEST_JOB_H_
      6 #define ANDROID_WEBVIEW_NATIVE_ANDROID_STREAM_READER_URL_REQUEST_JOB_H_
      7 
      8 #include <string>
      9 
     10 #include "base/android/scoped_java_ref.h"
     11 #include "base/location.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "base/threading/thread_checker.h"
     16 #include "net/http/http_byte_range.h"
     17 #include "net/url_request/url_request_job.h"
     18 
     19 namespace android_webview {
     20 class InputStream;
     21 class InputStreamReader;
     22 }
     23 
     24 namespace base {
     25 class TaskRunner;
     26 }
     27 
     28 namespace net {
     29 class HttpResponseHeaders;
     30 class HttpResponseInfo;
     31 class URLRequest;
     32 }
     33 
     34 class InputStreamReaderWrapper;
     35 
     36 // A request job that reads data from a Java InputStream.
     37 class AndroidStreamReaderURLRequestJob : public net::URLRequestJob {
     38  public:
     39   /*
     40    * We use a delegate so that we can share code for this job in slightly
     41    * different contexts.
     42    */
     43   class Delegate {
     44    public:
     45     // This method is called from a worker thread, not from the IO thread.
     46     virtual scoped_ptr<android_webview::InputStream> OpenInputStream(
     47         JNIEnv* env,
     48         const GURL& url) = 0;
     49 
     50     // This method is called on the Job's thread if the result of calling
     51     // OpenInputStream was null.
     52     // Setting the |restart| parameter to true will cause the request to be
     53     // restarted with a new job.
     54     virtual void OnInputStreamOpenFailed(
     55         net::URLRequest* request,
     56         bool* restart) = 0;
     57 
     58     virtual bool GetMimeType(
     59         JNIEnv* env,
     60         net::URLRequest* request,
     61         android_webview::InputStream* stream,
     62         std::string* mime_type) = 0;
     63 
     64     virtual bool GetCharset(
     65         JNIEnv* env,
     66         net::URLRequest* request,
     67         android_webview::InputStream* stream,
     68         std::string* charset) = 0;
     69 
     70     virtual void AppendResponseHeaders(JNIEnv* env,
     71                                        net::HttpResponseHeaders* headers) = 0;
     72 
     73     virtual ~Delegate() {}
     74   };
     75 
     76   AndroidStreamReaderURLRequestJob(
     77       net::URLRequest* request,
     78       net::NetworkDelegate* network_delegate,
     79       scoped_ptr<Delegate> delegate);
     80 
     81   // URLRequestJob:
     82   virtual void Start() OVERRIDE;
     83   virtual void Kill() OVERRIDE;
     84   virtual bool ReadRawData(net::IOBuffer* buf,
     85                            int buf_size,
     86                            int* bytes_read) OVERRIDE;
     87   virtual void SetExtraRequestHeaders(
     88       const net::HttpRequestHeaders& headers) OVERRIDE;
     89   virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
     90   virtual bool GetCharset(std::string* charset) OVERRIDE;
     91   virtual int GetResponseCode() const OVERRIDE;
     92   virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE;
     93 
     94  protected:
     95   virtual ~AndroidStreamReaderURLRequestJob();
     96 
     97   // Gets the TaskRunner for the worker thread.
     98   // Overridden in unittests.
     99   virtual base::TaskRunner* GetWorkerThreadRunner();
    100 
    101   // Creates an InputStreamReader instance.
    102   // Overridden in unittests to return a mock.
    103   virtual scoped_ptr<android_webview::InputStreamReader>
    104       CreateStreamReader(android_webview::InputStream* stream);
    105 
    106  private:
    107   void HeadersComplete(int status_code, const std::string& status_text);
    108 
    109   void OnInputStreamOpened(
    110       scoped_ptr<Delegate> delegate,
    111       scoped_ptr<android_webview::InputStream> input_stream);
    112   void OnReaderSeekCompleted(int content_size);
    113   void OnReaderReadCompleted(int bytes_read);
    114 
    115   net::HttpByteRange byte_range_;
    116   scoped_ptr<net::HttpResponseInfo> response_info_;
    117   scoped_ptr<Delegate> delegate_;
    118   scoped_refptr<InputStreamReaderWrapper> input_stream_reader_wrapper_;
    119   base::WeakPtrFactory<AndroidStreamReaderURLRequestJob> weak_factory_;
    120   base::ThreadChecker thread_checker_;
    121 
    122   DISALLOW_COPY_AND_ASSIGN(AndroidStreamReaderURLRequestJob);
    123 };
    124 
    125 #endif  // ANDROID_WEBVIEW_NATIVE_ANDROID_STREAM_READER_URL_REQUEST_JOB_H_
    126