1 /* 2 * Copyright (C) 2007, 2008 Holger Hans Peter Freyther 3 * Copyright (C) 2009 Gustavo Noronha Silva 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public License 16 * along with this library; see the file COPYING.LIB. If not, write to 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21 #include "config.h" 22 #include "webkitnetworkrequest.h" 23 24 #include "GRefPtr.h" 25 #include "ResourceRequest.h" 26 #include "webkitglobalsprivate.h" 27 #include <glib/gi18n-lib.h> 28 #include <wtf/text/CString.h> 29 30 /** 31 * SECTION:webkitnetworkrequest 32 * @short_description: The target of a navigation request 33 * @see_also: #WebKitWebView::navigation-policy-decision-requested 34 * 35 * This class represents the network related aspects of a navigation 36 * request. It is used whenever WebKit wants to provide information 37 * about a request that will be sent, or has been sent. Inside it you 38 * can find the URI of the request, and, for valid URIs, a 39 * #SoupMessage object, which provides access to further information 40 * such as headers. 41 * 42 */ 43 44 G_DEFINE_TYPE(WebKitNetworkRequest, webkit_network_request, G_TYPE_OBJECT); 45 46 struct _WebKitNetworkRequestPrivate { 47 gchar* uri; 48 SoupMessage* message; 49 }; 50 51 enum { 52 PROP_0, 53 54 PROP_URI, 55 PROP_MESSAGE, 56 }; 57 58 static void webkit_network_request_dispose(GObject* object) 59 { 60 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 61 WebKitNetworkRequestPrivate* priv = request->priv; 62 63 if (priv->message) { 64 g_object_unref(priv->message); 65 priv->message = NULL; 66 } 67 68 G_OBJECT_CLASS(webkit_network_request_parent_class)->dispose(object); 69 } 70 71 static void webkit_network_request_finalize(GObject* object) 72 { 73 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 74 WebKitNetworkRequestPrivate* priv = request->priv; 75 76 g_free(priv->uri); 77 78 G_OBJECT_CLASS(webkit_network_request_parent_class)->finalize(object); 79 } 80 81 static void webkit_network_request_get_property(GObject* object, guint propertyID, GValue* value, GParamSpec* pspec) 82 { 83 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 84 85 switch(propertyID) { 86 case PROP_URI: 87 g_value_set_string(value, webkit_network_request_get_uri(request)); 88 break; 89 case PROP_MESSAGE: 90 g_value_set_object(value, webkit_network_request_get_message(request)); 91 break; 92 default: 93 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyID, pspec); 94 } 95 } 96 97 static void webkit_network_request_set_property(GObject* object, guint propertyID, const GValue* value, GParamSpec* pspec) 98 { 99 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 100 WebKitNetworkRequestPrivate* priv = request->priv; 101 102 switch(propertyID) { 103 case PROP_URI: 104 webkit_network_request_set_uri(request, g_value_get_string(value)); 105 break; 106 case PROP_MESSAGE: 107 priv->message = SOUP_MESSAGE(g_value_dup_object(value)); 108 break; 109 default: 110 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyID, pspec); 111 } 112 } 113 114 static void webkit_network_request_class_init(WebKitNetworkRequestClass* requestClass) 115 { 116 GObjectClass* objectClass = G_OBJECT_CLASS(requestClass); 117 118 objectClass->dispose = webkit_network_request_dispose; 119 objectClass->finalize = webkit_network_request_finalize; 120 objectClass->get_property = webkit_network_request_get_property; 121 objectClass->set_property = webkit_network_request_set_property; 122 123 webkitInit(); 124 125 /** 126 * WebKitNetworkRequest:uri: 127 * 128 * The URI to which the request will be made. 129 * 130 * Since: 1.1.10 131 */ 132 g_object_class_install_property(objectClass, PROP_URI, 133 g_param_spec_string("uri", 134 _("URI"), 135 _("The URI to which the request will be made."), 136 NULL, 137 (GParamFlags)(WEBKIT_PARAM_READWRITE))); 138 139 /** 140 * WebKitNetworkRequest:message: 141 * 142 * The #SoupMessage that backs the request. 143 * 144 * Since: 1.1.10 145 */ 146 g_object_class_install_property(objectClass, PROP_MESSAGE, 147 g_param_spec_object("message", 148 _("Message"), 149 _("The SoupMessage that backs the request."), 150 SOUP_TYPE_MESSAGE, 151 (GParamFlags)(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY))); 152 153 g_type_class_add_private(requestClass, sizeof(WebKitNetworkRequestPrivate)); 154 } 155 156 static void webkit_network_request_init(WebKitNetworkRequest* request) 157 { 158 WebKitNetworkRequestPrivate* priv = G_TYPE_INSTANCE_GET_PRIVATE(request, WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestPrivate); 159 request->priv = priv; 160 } 161 162 /** 163 * webkit_network_request_new: 164 * @uri: an URI 165 * 166 * Creates a new #WebKitNetworkRequest initialized with an URI. 167 * 168 * Returns: a new #WebKitNetworkRequest, or %NULL if the URI is 169 * invalid. 170 */ 171 WebKitNetworkRequest* webkit_network_request_new(const gchar* uri) 172 { 173 g_return_val_if_fail(uri, NULL); 174 175 return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", uri, NULL)); 176 } 177 178 /** 179 * webkit_network_request_set_uri: 180 * @request: a #WebKitNetworkRequest 181 * @uri: an URI 182 * 183 * Sets the URI held and used by the given request. When the request 184 * has an associated #SoupMessage, its URI will also be set by this 185 * call. 186 * 187 */ 188 void webkit_network_request_set_uri(WebKitNetworkRequest* request, const gchar* uri) 189 { 190 g_return_if_fail(WEBKIT_IS_NETWORK_REQUEST(request)); 191 g_return_if_fail(uri); 192 193 WebKitNetworkRequestPrivate* priv = request->priv; 194 195 if (priv->uri) 196 g_free(priv->uri); 197 priv->uri = g_strdup(uri); 198 199 if (!priv->message) 200 return; 201 202 SoupURI* soupURI = soup_uri_new(uri); 203 g_return_if_fail(soupURI); 204 205 soup_message_set_uri(priv->message, soupURI); 206 soup_uri_free(soupURI); 207 } 208 209 /** 210 * webkit_network_request_get_uri: 211 * @request: a #WebKitNetworkRequest 212 * 213 * Returns: the uri of the #WebKitNetworkRequest 214 * 215 * Since: 1.0.0 216 */ 217 G_CONST_RETURN gchar* webkit_network_request_get_uri(WebKitNetworkRequest* request) 218 { 219 g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL); 220 221 WebKitNetworkRequestPrivate* priv = request->priv; 222 223 if (priv->uri) 224 return priv->uri; 225 226 SoupURI* soupURI = soup_message_get_uri(priv->message); 227 priv->uri = soup_uri_to_string(soupURI, FALSE); 228 return priv->uri; 229 } 230 231 /** 232 * webkit_network_request_get_message: 233 * @request: a #WebKitNetworkRequest 234 * 235 * Obtains the #SoupMessage held and used by the given request. Notice 236 * that modification of the SoupMessage of a request by signal 237 * handlers is only supported (as in, will only affect what is 238 * actually sent to the server) where explicitly documented. 239 * 240 * Returns: (transfer none): the #SoupMessage 241 * Since: 1.1.9 242 */ 243 SoupMessage* webkit_network_request_get_message(WebKitNetworkRequest* request) 244 { 245 g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL); 246 247 WebKitNetworkRequestPrivate* priv = request->priv; 248 249 return priv->message; 250 } 251 252 namespace WebKit { 253 254 WebKitNetworkRequest* kitNew(const WebCore::ResourceRequest& resourceRequest) 255 { 256 GRefPtr<SoupMessage> soupMessage(adoptGRef(resourceRequest.toSoupMessage())); 257 if (soupMessage) 258 return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "message", soupMessage.get(), NULL)); 259 260 return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", resourceRequest.url().string().utf8().data(), NULL)); 261 } 262 263 WebCore::ResourceRequest core(WebKitNetworkRequest* request) 264 { 265 SoupMessage* soupMessage = webkit_network_request_get_message(request); 266 if (soupMessage) 267 return WebCore::ResourceRequest(soupMessage); 268 269 WebCore::KURL url = WebCore::KURL(WebCore::KURL(), String::fromUTF8(webkit_network_request_get_uri(request))); 270 return WebCore::ResourceRequest(url); 271 } 272 273 } 274