• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010, The Android Open Source Project
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *  * Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef WebRequest_h
27 #define WebRequest_h
28 
29 #include "ChromiumIncludes.h"
30 #include <wtf/Vector.h>
31 
32 class MessageLoop;
33 
34 namespace android {
35 
36 enum LoadState {
37     Created,
38     Started,
39     Response,
40     GotData,
41     Cancelled,
42     Finished,
43     Deleted
44 };
45 
46 class UrlInterceptResponse;
47 class WebFrame;
48 class WebRequestContext;
49 class WebResourceRequest;
50 class WebUrlLoaderClient;
51 
52 // All methods in this class must be called on the io thread
53 class WebRequest : public net::URLRequest::Delegate, public base::RefCountedThreadSafe<WebRequest> {
54 public:
55     WebRequest(WebUrlLoaderClient*, const WebResourceRequest&);
56 
57     // If this is an android specific url or the application wants to load
58     // custom data, we load the data through an input stream.
59     // Used for:
60     // - file:///android_asset
61     // - file:///android_res
62     // - content://
63     WebRequest(WebUrlLoaderClient*, const WebResourceRequest&, UrlInterceptResponse* intercept);
64 
65     // Optional, but if used has to be called before start
66     void appendBytesToUpload(Vector<char>* data);
67     void appendFileToUpload(const std::string& filename);
68 
69     void setRequestContext(WebRequestContext* context);
70     void start();
71     void cancel();
72     void pauseLoad(bool pause);
73 
74     // From URLRequest::Delegate
75     virtual void OnReceivedRedirect(net::URLRequest*, const GURL&, bool* deferRedirect);
76     virtual void OnResponseStarted(net::URLRequest*);
77     virtual void OnReadCompleted(net::URLRequest*, int bytesRead);
78     virtual void OnAuthRequired(net::URLRequest*, net::AuthChallengeInfo*);
79     virtual void OnSSLCertificateError(net::URLRequest* request, int cert_error, net::X509Certificate* cert);
80     virtual void OnCertificateRequested(net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info);
81 
82     // Methods called during a request by the UI code (via WebUrlLoaderClient).
83     void setAuth(const string16& username, const string16& password);
84     void cancelAuth();
85     void followDeferredRedirect();
86     void proceedSslCertError();
87     void cancelSslCertError(int cert_error);
88     void sslClientCert(EVP_PKEY* pkey, scoped_refptr<net::X509Certificate> chain);
89 
90     const std::string& getUrl() const;
91     const std::string& getUserAgent() const;
92     const std::string& getReferer() const;
93 
setSync(bool sync)94     void setSync(bool sync) { m_isSync = sync; }
95 private:
96     void startReading();
97     bool read(int* bytesRead);
98 
99     friend class base::RefCountedThreadSafe<WebRequest>;
100     virtual ~WebRequest();
101     void handleDataURL(GURL);
102     void handleBrowserURL(GURL);
103     void handleInterceptedURL();
104     void finish(bool success);
105     void updateLoadFlags(int& loadFlags);
106 
107     scoped_refptr<WebUrlLoaderClient> m_urlLoader;
108     OwnPtr<net::URLRequest> m_request;
109     scoped_refptr<net::IOBuffer> m_networkBuffer;
110     scoped_ptr<UrlInterceptResponse> m_interceptResponse;
111     std::string m_url;
112     std::string m_userAgent;
113     std::string m_referer;
114     LoadState m_loadState;
115     int m_authRequestCount;
116     int m_cacheMode;
117     ScopedRunnableMethodFactory<WebRequest> m_runnableFactory;
118     bool m_wantToPause;
119     bool m_isPaused;
120     bool m_isSync;
121 #ifdef LOG_REQUESTS
122     time_t m_startTime;
123 #endif
124 };
125 
126 } // namespace android
127 
128 #endif
129