ba29622667723ee961dd1170c47412ff2cae8920
[WebKit-https.git] / Source / WebCore / platform / network / soup / CookieJarSoup.cpp
1 /*
2  *  Copyright (C) 2008 Xan Lopez <xan@gnome.org>
3  *  Copyright (C) 2009 Igalia S.L.
4  *  Copyright (C) 2008 Apple Inc. All rights reserved.
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public
8  *  License as published by the Free Software Foundation; either
9  *  version 2 of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 #include "config.h"
22 #include "CookieJarSoup.h"
23
24 #include "Cookie.h"
25 #include "Document.h"
26 #include "GOwnPtrSoup.h"
27 #include "KURL.h"
28 #include <wtf/text/CString.h>
29
30 namespace WebCore {
31
32 static bool cookiesInitialized;
33 static SoupCookieJar* cookieJar;
34
35 SoupCookieJar* defaultCookieJar()
36 {
37     if (!cookiesInitialized) {
38         cookiesInitialized = true;
39
40         cookieJar = soup_cookie_jar_new();
41 #ifdef HAVE_LIBSOUP_2_29_90
42         soup_cookie_jar_set_accept_policy(cookieJar, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
43 #endif
44     }
45
46     return cookieJar;
47 }
48
49 void setDefaultCookieJar(SoupCookieJar* jar)
50 {
51     cookiesInitialized = true;
52
53     if (cookieJar)
54         g_object_unref(cookieJar);
55
56     cookieJar = jar;
57
58     if (cookieJar)
59         g_object_ref(cookieJar);
60 }
61
62 void setCookies(Document* document, const KURL& url, const String& value)
63 {
64     SoupCookieJar* jar = defaultCookieJar();
65     if (!jar)
66         return;
67
68     GOwnPtr<SoupURI> origin(soup_uri_new(url.string().utf8().data()));
69
70 #ifdef HAVE_LIBSOUP_2_29_90
71     GOwnPtr<SoupURI> firstParty(soup_uri_new(document->firstPartyForCookies().string().utf8().data()));
72
73     soup_cookie_jar_set_cookie_with_first_party(jar,
74                                                 origin.get(),
75                                                 firstParty.get(),
76                                                 value.utf8().data());
77 #else
78     soup_cookie_jar_set_cookie(jar,
79                                origin.get(),
80                                value.utf8().data());
81 #endif
82 }
83
84 String cookies(const Document* /*document*/, const KURL& url)
85 {
86     SoupCookieJar* jar = defaultCookieJar();
87     if (!jar)
88         return String();
89
90     SoupURI* uri = soup_uri_new(url.string().utf8().data());
91     char* cookies = soup_cookie_jar_get_cookies(jar, uri, FALSE);
92     soup_uri_free(uri);
93
94     String result(String::fromUTF8(cookies));
95     g_free(cookies);
96
97     return result;
98 }
99
100 String cookieRequestHeaderFieldValue(const Document* /*document*/, const KURL& url)
101 {
102     SoupCookieJar* jar = defaultCookieJar();
103     if (!jar)
104         return String();
105
106     SoupURI* uri = soup_uri_new(url.string().utf8().data());
107     char* cookies = soup_cookie_jar_get_cookies(jar, uri, TRUE);
108     soup_uri_free(uri);
109
110     String result(String::fromUTF8(cookies));
111     g_free(cookies);
112
113     return result;
114 }
115
116 bool cookiesEnabled(const Document* /*document*/)
117 {
118     return defaultCookieJar();
119 }
120
121 bool getRawCookies(const Document*, const KURL&, Vector<Cookie>& rawCookies)
122 {
123     // FIXME: Not yet implemented
124     rawCookies.clear();
125     return false; // return true when implemented
126 }
127
128 void deleteCookie(const Document*, const KURL&, const String&)
129 {
130     // FIXME: Not yet implemented
131 }
132
133 }