1/*
2 * Copyright (C) 2003, 2006 Apple Inc.  All rights reserved.
3 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#ifndef ResourceRequest_h
28#define ResourceRequest_h
29
30#include "GUniquePtrSoup.h"
31#include "ResourceRequestBase.h"
32#include <libsoup/soup.h>
33#include <wtf/PassOwnPtr.h>
34
35namespace WebCore {
36
37    class ResourceRequest : public ResourceRequestBase {
38    public:
39        ResourceRequest(const String& url)
40            : ResourceRequestBase(URL(ParsedURLString, url), UseProtocolCachePolicy)
41            , m_acceptEncoding(true)
42            , m_soupFlags(static_cast<SoupMessageFlags>(0))
43            , m_initiatingPageID(0)
44        {
45        }
46
47        ResourceRequest(const URL& url)
48            : ResourceRequestBase(url, UseProtocolCachePolicy)
49            , m_acceptEncoding(true)
50            , m_soupFlags(static_cast<SoupMessageFlags>(0))
51            , m_initiatingPageID(0)
52        {
53        }
54
55        ResourceRequest(const URL& url, const String& referrer, ResourceRequestCachePolicy policy = UseProtocolCachePolicy)
56            : ResourceRequestBase(url, policy)
57            , m_acceptEncoding(true)
58            , m_soupFlags(static_cast<SoupMessageFlags>(0))
59            , m_initiatingPageID(0)
60        {
61            setHTTPReferrer(referrer);
62        }
63
64        ResourceRequest()
65            : ResourceRequestBase(URL(), UseProtocolCachePolicy)
66            , m_acceptEncoding(true)
67            , m_soupFlags(static_cast<SoupMessageFlags>(0))
68            , m_initiatingPageID(0)
69        {
70        }
71
72        ResourceRequest(SoupMessage* soupMessage)
73            : ResourceRequestBase(URL(), UseProtocolCachePolicy)
74            , m_acceptEncoding(true)
75            , m_soupFlags(static_cast<SoupMessageFlags>(0))
76            , m_initiatingPageID(0)
77        {
78            updateFromSoupMessage(soupMessage);
79        }
80
81        ResourceRequest(SoupRequest* soupRequest)
82            : ResourceRequestBase(URL(soup_request_get_uri(soupRequest)), UseProtocolCachePolicy)
83            , m_acceptEncoding(true)
84            , m_soupFlags(static_cast<SoupMessageFlags>(0))
85            , m_initiatingPageID(0)
86        {
87            updateFromSoupRequest(soupRequest);
88        }
89
90        void updateFromDelegatePreservingOldProperties(const ResourceRequest& delegateProvidedRequest) { *this = delegateProvidedRequest; }
91
92        bool acceptEncoding() const { return m_acceptEncoding; }
93        void setAcceptEncoding(bool acceptEncoding) { m_acceptEncoding = acceptEncoding; }
94
95        void updateSoupMessageHeaders(SoupMessageHeaders*) const;
96        void updateFromSoupMessageHeaders(SoupMessageHeaders*);
97        void updateSoupMessage(SoupMessage*) const;
98        SoupMessage* toSoupMessage() const;
99        void updateFromSoupMessage(SoupMessage*);
100        void updateSoupRequest(SoupRequest*) const;
101        void updateFromSoupRequest(SoupRequest*);
102
103        SoupMessageFlags soupMessageFlags() const { return m_soupFlags; }
104        void setSoupMessageFlags(SoupMessageFlags soupFlags) { m_soupFlags = soupFlags; }
105
106        uint64_t initiatingPageID() const { return m_initiatingPageID; }
107        void setInitiatingPageID(uint64_t pageID) { m_initiatingPageID = pageID; }
108
109        GUniquePtr<SoupURI> createSoupURI() const;
110
111    private:
112        friend class ResourceRequestBase;
113
114        bool m_acceptEncoding : 1;
115        SoupMessageFlags m_soupFlags;
116        uint64_t m_initiatingPageID;
117
118        void updateSoupMessageMembers(SoupMessage*) const;
119        void doUpdatePlatformRequest() { }
120        void doUpdateResourceRequest() { }
121        void doUpdatePlatformHTTPBody() { }
122        void doUpdateResourceHTTPBody() { }
123
124        PassOwnPtr<CrossThreadResourceRequestData> doPlatformCopyData(PassOwnPtr<CrossThreadResourceRequestData> data) const { return data; }
125        void doPlatformAdopt(PassOwnPtr<CrossThreadResourceRequestData>) { }
126    };
127
128    struct CrossThreadResourceRequestData : public CrossThreadResourceRequestDataBase {
129    };
130
131#if SOUP_CHECK_VERSION(2, 43, 1)
132inline SoupMessagePriority toSoupMessagePriority(ResourceLoadPriority priority)
133{
134    switch (priority) {
135    case ResourceLoadPriorityUnresolved:
136        return SOUP_MESSAGE_PRIORITY_NORMAL;
137    case ResourceLoadPriorityVeryLow:
138        return SOUP_MESSAGE_PRIORITY_VERY_LOW;
139    case ResourceLoadPriorityLow:
140        return SOUP_MESSAGE_PRIORITY_LOW;
141    case ResourceLoadPriorityMedium:
142        return SOUP_MESSAGE_PRIORITY_NORMAL;
143    case ResourceLoadPriorityHigh:
144        return SOUP_MESSAGE_PRIORITY_HIGH;
145    case ResourceLoadPriorityVeryHigh:
146        return SOUP_MESSAGE_PRIORITY_VERY_HIGH;
147    }
148
149    ASSERT_NOT_REACHED();
150    return SOUP_MESSAGE_PRIORITY_VERY_LOW;
151}
152#endif
153
154} // namespace WebCore
155
156#endif // ResourceRequest_h
157