| /* |
| * Copyright (C) 2003, 2006 Apple Inc. All rights reserved. |
| * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com> |
| * Copyright (C) 2009, 2012 Google Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef ResourceRequestBase_h |
| #define ResourceRequestBase_h |
| |
| #include "FormData.h" |
| #include "HTTPHeaderMap.h" |
| #include "URL.h" |
| #include "ResourceLoadPriority.h" |
| |
| namespace WebCore { |
| |
| enum ResourceRequestCachePolicy { |
| UseProtocolCachePolicy, // normal load, equivalent to fetch "default" cache mode. |
| ReloadIgnoringCacheData, // reload, equivalent to fetch "reload"cache mode. |
| ReturnCacheDataElseLoad, // back/forward or encoding change - allow stale data, equivalent to fetch "force-cache" cache mode. |
| ReturnCacheDataDontLoad, // results of a post - allow stale data and only use cache, equivalent to fetch "only-if-cached" cache mode. |
| DoNotUseAnyCache, // Bypass the cache entirely, equivalent to fetch "no-store" cache mode. |
| RefreshAnyCacheData, // Serve cache data only if revalidated, equivalent to fetch "no-cache" mode. |
| }; |
| |
| enum HTTPBodyUpdatePolicy { |
| DoNotUpdateHTTPBody, |
| UpdateHTTPBody |
| }; |
| |
| class ResourceRequest; |
| |
| // Do not use this type directly. Use ResourceRequest instead. |
| class ResourceRequestBase { |
| WTF_MAKE_FAST_ALLOCATED; |
| public: |
| ResourceRequest isolatedCopy() const; |
| WEBCORE_EXPORT void setAsIsolatedCopy(const ResourceRequest&); |
| |
| WEBCORE_EXPORT bool isNull() const; |
| WEBCORE_EXPORT bool isEmpty() const; |
| |
| WEBCORE_EXPORT const URL& url() const; |
| WEBCORE_EXPORT void setURL(const URL& url); |
| |
| WEBCORE_EXPORT void removeCredentials(); |
| |
| WEBCORE_EXPORT ResourceRequestCachePolicy cachePolicy() const; |
| WEBCORE_EXPORT void setCachePolicy(ResourceRequestCachePolicy cachePolicy); |
| |
| double timeoutInterval() const; // May return 0 when using platform default. |
| void setTimeoutInterval(double timeoutInterval); |
| |
| WEBCORE_EXPORT const URL& firstPartyForCookies() const; |
| WEBCORE_EXPORT void setFirstPartyForCookies(const URL&); |
| |
| WEBCORE_EXPORT const String& httpMethod() const; |
| WEBCORE_EXPORT void setHTTPMethod(const String& httpMethod); |
| |
| WEBCORE_EXPORT const HTTPHeaderMap& httpHeaderFields() const; |
| WEBCORE_EXPORT void setHTTPHeaderFields(HTTPHeaderMap); |
| |
| WEBCORE_EXPORT String httpHeaderField(const String& name) const; |
| WEBCORE_EXPORT String httpHeaderField(HTTPHeaderName) const; |
| WEBCORE_EXPORT void setHTTPHeaderField(const String& name, const String& value); |
| WEBCORE_EXPORT void setHTTPHeaderField(HTTPHeaderName, const String& value); |
| void addHTTPHeaderField(HTTPHeaderName, const String& value); |
| void addHTTPHeaderField(const String& name, const String& value); |
| void addHTTPHeaderFieldIfNotPresent(HTTPHeaderName, const String&); |
| |
| bool hasHTTPHeaderField(HTTPHeaderName) const; |
| |
| // Instead of passing a string literal to any of these functions, just use a HTTPHeaderName instead. |
| template<size_t length> String httpHeaderField(const char (&)[length]) const = delete; |
| template<size_t length> void setHTTPHeaderField(const char (&)[length], const String&) = delete; |
| template<size_t length> void addHTTPHeaderField(const char (&)[length], const String&) = delete; |
| |
| WEBCORE_EXPORT void clearHTTPAuthorization(); |
| |
| WEBCORE_EXPORT String httpContentType() const; |
| WEBCORE_EXPORT void setHTTPContentType(const String&); |
| void clearHTTPContentType(); |
| |
| bool hasHTTPHeader(HTTPHeaderName) const; |
| |
| WEBCORE_EXPORT String httpReferrer() const; |
| bool hasHTTPReferrer() const; |
| WEBCORE_EXPORT void setHTTPReferrer(const String&); |
| WEBCORE_EXPORT void clearHTTPReferrer(); |
| |
| String httpOrigin() const; |
| bool hasHTTPOrigin() const; |
| void setHTTPOrigin(const String&); |
| WEBCORE_EXPORT void clearHTTPOrigin(); |
| |
| WEBCORE_EXPORT String httpUserAgent() const; |
| WEBCORE_EXPORT void setHTTPUserAgent(const String&); |
| void clearHTTPUserAgent(); |
| |
| String httpAccept() const; |
| void setHTTPAccept(const String&); |
| void clearHTTPAccept(); |
| |
| void clearHTTPAcceptEncoding(); |
| |
| const Vector<String>& responseContentDispositionEncodingFallbackArray() const { return m_responseContentDispositionEncodingFallbackArray; } |
| WEBCORE_EXPORT void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String()); |
| |
| WEBCORE_EXPORT FormData* httpBody() const; |
| WEBCORE_EXPORT void setHTTPBody(RefPtr<FormData>&&); |
| |
| bool allowCookies() const; |
| void setAllowCookies(bool allowCookies); |
| |
| WEBCORE_EXPORT ResourceLoadPriority priority() const; |
| WEBCORE_EXPORT void setPriority(ResourceLoadPriority); |
| |
| WEBCORE_EXPORT bool isConditional() const; |
| WEBCORE_EXPORT void makeUnconditional(); |
| |
| // Whether the associated ResourceHandleClient needs to be notified of |
| // upload progress made for that resource. |
| bool reportUploadProgress() const { return m_reportUploadProgress; } |
| void setReportUploadProgress(bool reportUploadProgress) { m_reportUploadProgress = reportUploadProgress; } |
| |
| // Whether the timing information should be collected for the request. |
| bool reportLoadTiming() const { return m_reportLoadTiming; } |
| void setReportLoadTiming(bool reportLoadTiming) { m_reportLoadTiming = reportLoadTiming; } |
| |
| // Whether actual headers being sent/received should be collected and reported for the request. |
| bool reportRawHeaders() const { return m_reportRawHeaders; } |
| void setReportRawHeaders(bool reportRawHeaders) { m_reportRawHeaders = reportRawHeaders; } |
| |
| // Whether this request should be hidden from the Inspector. |
| bool hiddenFromInspector() const { return m_hiddenFromInspector; } |
| void setHiddenFromInspector(bool hiddenFromInspector) { m_hiddenFromInspector = hiddenFromInspector; } |
| |
| // Whether this request should impact request counting and delay window.onload. |
| bool ignoreForRequestCount() const { return m_ignoreForRequestCount; } |
| void setIgnoreForRequestCount(bool ignoreForRequestCount) { m_ignoreForRequestCount = ignoreForRequestCount; } |
| |
| enum class Requester { Unspecified, Main, XHR, Media }; |
| Requester requester() const { return m_requester; } |
| void setRequester(Requester requester) { m_requester = requester; } |
| |
| // Who initiated the request so the Inspector can associate it with a context. E.g. a Web Worker. |
| String initiatorIdentifier() const { return m_initiatorIdentifier; } |
| void setInitiatorIdentifier(const String& identifier) { m_initiatorIdentifier = identifier; } |
| |
| #if !PLATFORM(COCOA) |
| bool encodingRequiresPlatformData() const { return true; } |
| #endif |
| template<class Encoder> void encodeWithoutPlatformData(Encoder&) const; |
| template<class Decoder> bool decodeWithoutPlatformData(Decoder&); |
| |
| WEBCORE_EXPORT static double defaultTimeoutInterval(); // May return 0 when using platform default. |
| WEBCORE_EXPORT static void setDefaultTimeoutInterval(double); |
| |
| #if PLATFORM(IOS) |
| WEBCORE_EXPORT static bool defaultAllowCookies(); |
| WEBCORE_EXPORT static void setDefaultAllowCookies(bool); |
| #endif |
| |
| static bool compare(const ResourceRequest&, const ResourceRequest&); |
| |
| protected: |
| // Used when ResourceRequest is initialized from a platform representation of the request |
| ResourceRequestBase() |
| : m_platformRequestUpdated(true) |
| , m_platformRequestBodyUpdated(true) |
| { |
| } |
| |
| ResourceRequestBase(const URL& url, ResourceRequestCachePolicy policy) |
| : m_url(url) |
| , m_timeoutInterval(s_defaultTimeoutInterval) |
| , m_httpMethod(ASCIILiteral("GET")) |
| , m_cachePolicy(policy) |
| #if !PLATFORM(IOS) |
| , m_allowCookies(true) |
| #else |
| , m_allowCookies(ResourceRequestBase::defaultAllowCookies()) |
| #endif |
| , m_resourceRequestUpdated(true) |
| , m_resourceRequestBodyUpdated(true) |
| { |
| } |
| |
| void updatePlatformRequest(HTTPBodyUpdatePolicy = DoNotUpdateHTTPBody) const; |
| void updateResourceRequest(HTTPBodyUpdatePolicy = DoNotUpdateHTTPBody) const; |
| |
| template<class Encoder> void encodeBase(Encoder&) const; |
| template<class Decoder> bool decodeBase(Decoder&); |
| |
| // The ResourceRequest subclass may "shadow" this method to compare platform specific fields |
| static bool platformCompare(const ResourceRequest&, const ResourceRequest&) { return true; } |
| |
| URL m_url; |
| double m_timeoutInterval; // 0 is a magic value for platform default on platforms that have one. |
| URL m_firstPartyForCookies; |
| String m_httpMethod; |
| HTTPHeaderMap m_httpHeaderFields; |
| Vector<String> m_responseContentDispositionEncodingFallbackArray; |
| RefPtr<FormData> m_httpBody; |
| ResourceRequestCachePolicy m_cachePolicy { UseProtocolCachePolicy }; |
| bool m_allowCookies { false }; |
| mutable bool m_resourceRequestUpdated { false }; |
| mutable bool m_platformRequestUpdated { false }; |
| mutable bool m_resourceRequestBodyUpdated { false }; |
| mutable bool m_platformRequestBodyUpdated { false }; |
| bool m_reportUploadProgress { false }; |
| bool m_reportLoadTiming { false }; |
| bool m_reportRawHeaders { false }; |
| bool m_hiddenFromInspector { false }; |
| bool m_ignoreForRequestCount { false }; |
| ResourceLoadPriority m_priority { ResourceLoadPriority::Low }; |
| Requester m_requester { Requester::Unspecified }; |
| String m_initiatorIdentifier; |
| |
| private: |
| const ResourceRequest& asResourceRequest() const; |
| |
| WEBCORE_EXPORT static double s_defaultTimeoutInterval; |
| #if PLATFORM(IOS) |
| static bool s_defaultAllowCookies; |
| #endif |
| }; |
| |
| bool equalIgnoringHeaderFields(const ResourceRequestBase&, const ResourceRequestBase&); |
| |
| inline bool operator==(const ResourceRequest& a, const ResourceRequest& b) { return ResourceRequestBase::compare(a, b); } |
| inline bool operator!=(ResourceRequest& a, const ResourceRequest& b) { return !(a == b); } |
| |
| WEBCORE_EXPORT unsigned initializeMaximumHTTPConnectionCountPerHost(); |
| #if PLATFORM(IOS) |
| WEBCORE_EXPORT void initializeHTTPConnectionSettingsOnStartup(); |
| #endif |
| |
| template<class Encoder> |
| ALWAYS_INLINE void ResourceRequestBase::encodeBase(Encoder& encoder) const |
| { |
| encoder << m_url; |
| encoder << m_timeoutInterval; |
| encoder << m_firstPartyForCookies.string(); |
| encoder << m_httpMethod; |
| encoder << m_httpHeaderFields; |
| encoder << m_responseContentDispositionEncodingFallbackArray; |
| encoder.encodeEnum(m_cachePolicy); |
| encoder << m_allowCookies; |
| encoder.encodeEnum(m_priority); |
| encoder.encodeEnum(m_requester); |
| } |
| |
| template<class Decoder> |
| ALWAYS_INLINE bool ResourceRequestBase::decodeBase(Decoder& decoder) |
| { |
| if (!decoder.decode(m_url)) |
| return false; |
| |
| if (!decoder.decode(m_timeoutInterval)) |
| return false; |
| |
| String firstPartyForCookies; |
| if (!decoder.decode(firstPartyForCookies)) |
| return false; |
| m_firstPartyForCookies = URL(ParsedURLString, firstPartyForCookies); |
| |
| if (!decoder.decode(m_httpMethod)) |
| return false; |
| |
| if (!decoder.decode(m_httpHeaderFields)) |
| return false; |
| |
| if (!decoder.decode(m_responseContentDispositionEncodingFallbackArray)) |
| return false; |
| |
| ResourceRequestCachePolicy cachePolicy; |
| if (!decoder.decodeEnum(cachePolicy)) |
| return false; |
| m_cachePolicy = cachePolicy; |
| |
| bool allowCookies; |
| if (!decoder.decode(allowCookies)) |
| return false; |
| m_allowCookies = allowCookies; |
| |
| ResourceLoadPriority priority; |
| if (!decoder.decodeEnum(priority)) |
| return false; |
| m_priority = priority; |
| |
| if (!decoder.decodeEnum(m_requester)) |
| return false; |
| |
| return true; |
| } |
| |
| template<class Encoder> |
| void ResourceRequestBase::encodeWithoutPlatformData(Encoder& encoder) const |
| { |
| ASSERT(!m_httpBody); |
| ASSERT(!m_platformRequestUpdated); |
| encodeBase(encoder); |
| } |
| |
| template<class Decoder> |
| bool ResourceRequestBase::decodeWithoutPlatformData(Decoder& decoder) |
| { |
| return decodeBase(decoder); |
| } |
| |
| } // namespace WebCore |
| |
| #endif // ResourceRequestBase_h |