Home | History | Annotate | Download | only in network
      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)
    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 
    222     virtual void refAuthenticationClient() { ref(); }
    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