ee937f196619eb954bb6acc564d24220060dfc36
[WebKit-https.git] / WebCore / platform / network / ResourceHandle.h
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 "HTTPHeaderMap.h"
31 #include <wtf/OwnPtr.h>
32
33 #if PLATFORM(CF)
34 typedef const struct __CFData * CFDataRef;
35 #endif
36
37 #if PLATFORM(WIN)
38 typedef unsigned long DWORD;
39 typedef unsigned long DWORD_PTR;
40 typedef void* LPVOID;
41 typedef LPVOID HINTERNET;
42 typedef unsigned WPARAM;
43 typedef long LPARAM;
44 typedef struct HWND__* HWND;
45 typedef _W64 long LONG_PTR;
46 typedef LONG_PTR LRESULT;
47 #endif
48
49
50 #if PLATFORM(MAC)
51 #include <wtf/RetainPtr.h>
52 #ifdef __OBJC__
53 @class NSData;
54 @class NSError;
55 @class NSURLConnection;
56 @class WebCoreResourceHandleAsDelegate;
57 #else
58 class NSData;
59 class NSError;
60 class NSURLConnection;
61 class WebCoreResourceHandleAsDelegate;
62 typedef struct objc_object *id;
63 #endif
64 #endif
65
66 #if USE(CFNETWORK)
67 typedef struct _CFURLConnection* CFURLConnectionRef;
68 typedef int CFHTTPCookieStorageAcceptPolicy;
69 typedef struct OpaqueCFHTTPCookieStorage* CFHTTPCookieStorageRef;
70 #endif
71
72 namespace WebCore {
73
74 class AuthenticationChallenge;
75 class Credential;
76 class FormData;
77 class Frame;
78 class KURL;
79 class ResourceError;
80 class ResourceHandleClient;
81 class ResourceHandleInternal;
82 class ResourceRequest;
83 class ResourceResponse;
84 class SchedulePair;
85 class SharedBuffer;
86
87 template <typename T> class Timer;
88
89 class ResourceHandle : public RefCounted<ResourceHandle> {
90 private:
91     ResourceHandle(const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff, bool mightDownloadFromHandle);
92
93     enum FailureType {
94         BlockedFailure,
95         InvalidURLFailure
96     };
97
98 public:
99     // FIXME: should not need the Frame
100     static PassRefPtr<ResourceHandle> create(const ResourceRequest&, ResourceHandleClient*, Frame*, bool defersLoading, bool shouldContentSniff, bool mightDownloadFromHandle = false);
101
102     static void loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data, Frame* frame);
103     static bool willLoadFromCache(ResourceRequest&);
104 #if PLATFORM(MAC)
105     static bool didSendBodyDataDelegateExists();
106 #endif
107
108     ~ResourceHandle();
109
110 #if PLATFORM(MAC) || USE(CFNETWORK)
111     bool shouldUseCredentialStorage();
112 #endif
113 #if PLATFORM(MAC) || USE(CFNETWORK) || USE(CURL)
114     void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
115     void receivedCredential(const AuthenticationChallenge&, const Credential&);
116     void receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&);
117     void receivedCancellation(const AuthenticationChallenge&);
118 #endif
119
120 #if PLATFORM(MAC)
121     void didCancelAuthenticationChallenge(const AuthenticationChallenge&);
122     NSURLConnection *connection() const;
123     WebCoreResourceHandleAsDelegate *delegate();
124     void releaseDelegate();
125     id releaseProxy();
126
127     void schedule(SchedulePair*);
128     void unschedule(SchedulePair*);
129 #elif USE(CFNETWORK)
130     static CFRunLoopRef loaderRunLoop();
131     CFURLConnectionRef connection() const;
132     CFURLConnectionRef releaseConnectionForDownload();
133     static void setHostAllowsAnyHTTPSCertificate(const String&);
134     static void setClientCertificate(const String& host, CFDataRef);
135 #endif
136
137 #if PLATFORM(WIN) && USE(CURL)
138     static void setHostAllowsAnyHTTPSCertificate(const String&);
139 #endif
140 #if PLATFORM(WIN) && USE(CURL) && PLATFORM(CF)
141     static void setClientCertificate(const String& host, CFDataRef);
142 #endif
143
144     PassRefPtr<SharedBuffer> bufferedData();
145     static bool supportsBufferedData();
146
147 #if USE(WININET)
148     void setHasReceivedResponse(bool = true);
149     bool hasReceivedResponse() const;
150     void fileLoadTimer(Timer<ResourceHandle>*);
151     void onHandleCreated(LPARAM);
152     void onRequestRedirected(LPARAM);
153     void onRequestComplete(LPARAM);
154     friend void __stdcall transferJobStatusCallback(HINTERNET, DWORD_PTR, DWORD, LPVOID, DWORD);
155     friend LRESULT __stdcall ResourceHandleWndProc(HWND, unsigned message, WPARAM, LPARAM);
156 #endif
157
158 #if PLATFORM(QT) || USE(CURL) || USE(SOUP)
159     ResourceHandleInternal* getInternal() { return d.get(); }
160 #endif
161
162     // Used to work around the fact that you don't get any more NSURLConnection callbacks until you return from the one you're in.
163     static bool loadsBlocked();    
164     
165     void clearAuthentication();
166     void cancel();
167
168     // The client may be 0, in which case no callbacks will be made.
169     ResourceHandleClient* client() const;
170     void setClient(ResourceHandleClient*);
171
172     void setDefersLoading(bool);
173       
174     const ResourceRequest& request() const;
175
176     void fireFailure(Timer<ResourceHandle>*);
177
178 private:
179 #if USE(SOUP)
180     bool startData(String urlString);
181     bool startHttp(String urlString);
182     bool startGio(KURL url);
183 #endif
184
185     void scheduleFailure(FailureType);
186
187     bool start(Frame*);
188
189     friend class ResourceHandleInternal;
190     OwnPtr<ResourceHandleInternal> d;
191 };
192
193 }
194
195 #endif // ResourceHandle_h