• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 ResourceHandle_h
27 #define ResourceHandle_h
28 
29 #include "AuthenticationChallenge.h"
30 #include "AuthenticationClient.h"
31 #include "HTTPHeaderMap.h"
32 #include "NetworkingContext.h"
33 #include "ThreadableLoader.h"
34 #include <wtf/OwnPtr.h>
35 
36 #if USE(SOUP)
37 typedef struct _SoupSession SoupSession;
38 #endif
39 
40 #if USE(CF)
41 typedef const struct __CFData * CFDataRef;
42 #endif
43 
44 #if USE(WININET)
45 typedef unsigned long DWORD;
46 typedef unsigned long DWORD_PTR;
47 typedef void* LPVOID;
48 typedef LPVOID HINTERNET;
49 #endif
50 
51 
52 #if PLATFORM(MAC)
53 #include <wtf/RetainPtr.h>
54 #ifdef __OBJC__
55 @class NSData;
56 @class NSError;
57 @class NSURLConnection;
58 @class WebCoreResourceHandleAsDelegate;
59 #else
60 class NSData;
61 class NSError;
62 class NSURLConnection;
63 class WebCoreResourceHandleAsDelegate;
64 typedef struct objc_object *id;
65 #endif
66 #endif
67 
68 #if USE(CFNETWORK)
69 typedef struct _CFURLConnection* CFURLConnectionRef;
70 typedef int CFHTTPCookieStorageAcceptPolicy;
71 typedef struct OpaqueCFHTTPCookieStorage* CFHTTPCookieStorageRef;
72 #endif
73 
74 #if USE(CFURLSTORAGESESSIONS)
75 typedef const struct __CFURLStorageSession* CFURLStorageSessionRef;
76 #endif
77 
78 namespace WebCore {
79 
80 class AuthenticationChallenge;
81 class Credential;
82 class FormData;
83 class Frame;
84 class KURL;
85 class ProtectionSpace;
86 class ResourceError;
87 class ResourceHandleClient;
88 class ResourceHandleInternal;
89 class ResourceRequest;
90 class ResourceResponse;
91 class SchedulePair;
92 class SharedBuffer;
93 
94 template <typename T> class Timer;
95 
96 class ResourceHandle : public RefCounted<ResourceHandle>
97 #if PLATFORM(MAC) || USE(CFNETWORK) || USE(CURL)
98     , public AuthenticationClient
99 #endif
100     {
101 public:
102     static PassRefPtr<ResourceHandle> create(NetworkingContext*, const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
103     static void loadResourceSynchronously(NetworkingContext*, const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data);
104 
105     static void prepareForURL(const KURL&);
106     static bool willLoadFromCache(ResourceRequest&, Frame*);
107     static void cacheMetadata(const ResourceResponse&, const Vector<char>&);
108 #if PLATFORM(MAC)
109     static bool didSendBodyDataDelegateExists();
110 #endif
111 
112     virtual ~ResourceHandle();
113 
114 #if PLATFORM(MAC) || USE(CFNETWORK)
115     void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse);
116     bool shouldUseCredentialStorage();
117 #endif
118 #if PLATFORM(MAC) || USE(CFNETWORK) || USE(CURL)
119     void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
120     virtual void receivedCredential(const AuthenticationChallenge&, const Credential&);
121     virtual void receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&);
122     virtual void receivedCancellation(const AuthenticationChallenge&);
123 #endif
124 
125 #if PLATFORM(MAC)
126     void didCancelAuthenticationChallenge(const AuthenticationChallenge&);
127 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
128     bool canAuthenticateAgainstProtectionSpace(const ProtectionSpace&);
129 #endif
130     NSURLConnection *connection() const;
131     WebCoreResourceHandleAsDelegate *delegate();
132     void releaseDelegate();
133     id releaseProxy();
134 
135     void schedule(SchedulePair*);
136     void unschedule(SchedulePair*);
137 #elif USE(CFNETWORK)
138     CFURLConnectionRef connection() const;
139     CFURLConnectionRef releaseConnectionForDownload();
140     static void setHostAllowsAnyHTTPSCertificate(const String&);
141     static void setClientCertificate(const String& host, CFDataRef);
142 #endif
143 
144 #if PLATFORM(WIN) && USE(CURL)
145     static void setHostAllowsAnyHTTPSCertificate(const String&);
146 #endif
147 #if PLATFORM(WIN) && USE(CURL) && USE(CF)
148     static void setClientCertificate(const String& host, CFDataRef);
149 #endif
150 
151     PassRefPtr<SharedBuffer> bufferedData();
152     static bool supportsBufferedData();
153 
154     bool shouldContentSniff() const;
155     static bool shouldContentSniffURL(const KURL&);
156 
157     static void forceContentSniffing();
158 
159 #if USE(WININET)
160     void setSynchronousInternetHandle(HINTERNET);
161     void fileLoadTimer(Timer<ResourceHandle>*);
162     void onRedirect();
163     bool onRequestComplete();
164     static void CALLBACK internetStatusCallback(HINTERNET, DWORD_PTR, DWORD, LPVOID, DWORD);
165 #endif
166 
167 #if PLATFORM(QT) || USE(CURL) || USE(SOUP) || PLATFORM(ANDROID)
getInternal()168     ResourceHandleInternal* getInternal() { return d.get(); }
169 #endif
170 
171 #if USE(SOUP)
172     static SoupSession* defaultSession();
173 #endif
174 
175     // Used to work around the fact that you don't get any more NSURLConnection callbacks until you return from the one you're in.
176     static bool loadsBlocked();
177 
178     bool hasAuthenticationChallenge() const;
179     void clearAuthentication();
180     virtual void cancel();
181 
182     // The client may be 0, in which case no callbacks will be made.
183     ResourceHandleClient* client() const;
184     void setClient(ResourceHandleClient*);
185 
186     void setDefersLoading(bool);
187 #if PLATFORM(ANDROID)
188 // TODO: this needs upstreaming.
189     void pauseLoad(bool);
190 #endif
191 
192     ResourceRequest& firstRequest();
193     const String& lastHTTPMethod() const;
194 
195     void fireFailure(Timer<ResourceHandle>*);
196 
197 #if USE(CFURLSTORAGESESSIONS)
198     static void setPrivateBrowsingEnabled(bool);
199     static CFURLStorageSessionRef privateBrowsingStorageSession();
200     static void setPrivateBrowsingStorageSessionIdentifierBase(const String&);
201 #endif
202 
203     using RefCounted<ResourceHandle>::ref;
204     using RefCounted<ResourceHandle>::deref;
205 
206 protected:
207     ResourceHandle(const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
208 
209 private:
210     enum FailureType {
211         NoFailure,
212         BlockedFailure,
213         InvalidURLFailure
214     };
215 
216     void platformSetDefersLoading(bool);
217 
218     void scheduleFailure(FailureType);
219 
220     bool start(NetworkingContext*);
221 
refAuthenticationClient()222     virtual void refAuthenticationClient() { ref(); }
derefAuthenticationClient()223     virtual void derefAuthenticationClient() { deref(); }
224 
225 #if PLATFORM(MAC)
226     void createNSURLConnection(id delegate, bool shouldUseCredentialStorage, bool shouldContentSniff);
227 #elif USE(CF)
228     void createCFURLConnection(bool shouldUseCredentialStorage, bool shouldContentSniff);
229 #endif
230 
231 #if USE(CFURLSTORAGESESSIONS)
232     static RetainPtr<CFURLStorageSessionRef> createPrivateBrowsingStorageSession(CFStringRef identifier);
233     static String privateBrowsingStorageSessionIdentifierDefaultBase();
234 #endif
235 
236     friend class ResourceHandleInternal;
237     OwnPtr<ResourceHandleInternal> d;
238 };
239 
240 }
241 
242 #endif // ResourceHandle_h
243