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 "CString.h" 25 #include "GOwnPtr.h" 26 #include "ResourceRequest.h" 27 #include "webkitprivate.h" 28 29 #include <glib/gi18n-lib.h> 30 31 /** 32 * SECTION:webkitnetworkrequest 33 * @short_description: The target of a navigation request 34 * @see_also: #WebKitWebView::navigation-policy-decision-requested 35 * 36 * This class represents the network related aspects of a navigation 37 * request. It is used whenever WebKit wants to provide information 38 * about a request that will be sent, or has been sent. Inside it you 39 * can find the URI of the request, and, for valid URIs, a 40 * #SoupMessage object, which provides access to further information 41 * such as headers. 42 * 43 */ 44 45 G_DEFINE_TYPE(WebKitNetworkRequest, webkit_network_request, G_TYPE_OBJECT); 46 47 struct _WebKitNetworkRequestPrivate { 48 gchar* uri; 49 SoupMessage* message; 50 }; 51 52 #define WEBKIT_NETWORK_REQUEST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestPrivate)) 53 54 enum { 55 PROP_0, 56 57 PROP_URI, 58 PROP_MESSAGE, 59 }; 60 61 static void webkit_network_request_dispose(GObject* object) 62 { 63 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 64 WebKitNetworkRequestPrivate* priv = request->priv; 65 66 if (priv->message) { 67 g_object_unref(priv->message); 68 priv->message = NULL; 69 } 70 71 G_OBJECT_CLASS(webkit_network_request_parent_class)->dispose(object); 72 } 73 74 static void webkit_network_request_finalize(GObject* object) 75 { 76 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 77 WebKitNetworkRequestPrivate* priv = request->priv; 78 79 g_free(priv->uri); 80 81 G_OBJECT_CLASS(webkit_network_request_parent_class)->finalize(object); 82 } 83 84 static void webkit_network_request_get_property(GObject* object, guint propertyID, GValue* value, GParamSpec* pspec) 85 { 86 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 87 88 switch(propertyID) { 89 case PROP_URI: 90 g_value_set_string(value, webkit_network_request_get_uri(request)); 91 break; 92 case PROP_MESSAGE: 93 g_value_set_object(value, webkit_network_request_get_message(request)); 94 break; 95 default: 96 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyID, pspec); 97 } 98 } 99 100 static void webkit_network_request_set_property(GObject* object, guint propertyID, const GValue* value, GParamSpec* pspec) 101 { 102 WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); 103 WebKitNetworkRequestPrivate* priv = request->priv; 104 105 switch(propertyID) { 106 case PROP_URI: 107 webkit_network_request_set_uri(request, g_value_get_string(value)); 108 break; 109 case PROP_MESSAGE: 110 priv->message = SOUP_MESSAGE(g_value_dup_object(value)); 111 break; 112 default: 113 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyID, pspec); 114 } 115 } 116 117 static void webkit_network_request_class_init(WebKitNetworkRequestClass* requestClass) 118 { 119 GObjectClass* objectClass = G_OBJECT_CLASS(requestClass); 120 121 objectClass->dispose = webkit_network_request_dispose; 122 objectClass->finalize = webkit_network_request_finalize; 123 objectClass->get_property = webkit_network_request_get_property; 124 objectClass->set_property = webkit_network_request_set_property; 125 126 webkit_init(); 127 128 /** 129 * WebKitNetworkRequest:uri: 130 * 131 * The URI to which the request will be made. 132 * 133 * Since: 1.1.10 134 */ 135 g_object_class_install_property(objectClass, PROP_URI, 136 g_param_spec_string("uri", 137 _("URI"), 138 _("The URI to which the request will be made."), 139 NULL, 140 (GParamFlags)(WEBKIT_PARAM_READWRITE))); 141 142 /** 143 * WebKitNetworkRequest:message: 144 * 145 * The #SoupMessage that backs the request. 146 * 147 * Since: 1.1.10 148 */ 149 g_object_class_install_property(objectClass, PROP_MESSAGE, 150 g_param_spec_object("message", 151 _("Message"), 152 _("The SoupMessage that backs the request."), 153 SOUP_TYPE_MESSAGE, 154 (GParamFlags)(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY))); 155 156 g_type_class_add_private(requestClass, sizeof(WebKitNetworkRequestPrivate)); 157 } 158 159 static void webkit_network_request_init(WebKitNetworkRequest* request) 160 { 161 WebKitNetworkRequestPrivate* priv = WEBKIT_NETWORK_REQUEST_GET_PRIVATE(request); 162 request->priv = priv; 163 } 164 165 // for internal use only 166 WebKitNetworkRequest* webkit_network_request_new_with_core_request(const WebCore::ResourceRequest& resourceRequest) 167 { 168 GOwnPtr<SoupMessage> soupMessage(resourceRequest.toSoupMessage()); 169 if (soupMessage) 170 return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "message", soupMessage.get(), NULL)); 171 172 return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", resourceRequest.url().string().utf8().data(), NULL)); 173 } 174 175 /** 176 * webkit_network_request_new: 177 * @uri: an URI 178 * 179 * Creates a new #WebKitNetworkRequest initialized with an URI. 180 * 181 * Returns: a new #WebKitNetworkRequest, or %NULL if the URI is 182 * invalid. 183 */ 184 WebKitNetworkRequest* webkit_network_request_new(const gchar* uri) 185 { 186 g_return_val_if_fail(uri, NULL); 187 188 return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", uri, NULL)); 189 } 190 191 /** 192 * webkit_network_request_set_uri: 193 * @request: a #WebKitNetworkRequest 194 * @uri: an URI 195 * 196 * Sets the URI held and used by the given request. When the request 197 * has an associated #SoupMessage, its URI will also be set by this 198 * call. 199 * 200 */ 201 void webkit_network_request_set_uri(WebKitNetworkRequest* request, const gchar* uri) 202 { 203 g_return_if_fail(WEBKIT_IS_NETWORK_REQUEST(request)); 204 g_return_if_fail(uri); 205 206 WebKitNetworkRequestPrivate* priv = request->priv; 207 208 if (priv->uri) 209 g_free(priv->uri); 210 priv->uri = g_strdup(uri); 211 212 if (!priv->message) 213 return; 214 215 SoupURI* soupURI = soup_uri_new(uri); 216 g_return_if_fail(soupURI); 217 218 soup_message_set_uri(priv->message, soupURI); 219 soup_uri_free(soupURI); 220 } 221 222 /** 223 * webkit_network_request_get_uri: 224 * @request: a #WebKitNetworkRequest 225 * 226 * Returns: the uri of the #WebKitNetworkRequest 227 * 228 * Since: 1.0.0 229 */ 230 G_CONST_RETURN gchar* webkit_network_request_get_uri(WebKitNetworkRequest* request) 231 { 232 g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL); 233 234 WebKitNetworkRequestPrivate* priv = request->priv; 235 236 if (priv->uri) 237 return priv->uri; 238 239 SoupURI* soupURI = soup_message_get_uri(priv->message); 240 priv->uri = soup_uri_to_string(soupURI, FALSE); 241 return priv->uri; 242 } 243 244 /** 245 * webkit_network_request_get_soup_message: 246 * @request: a #WebKitNetworkRequest 247 * 248 * Obtains the #SoupMessage held and used by the given request. Notice 249 * that modification of the SoupMessage of a request by signal 250 * handlers is only supported (as in, will only affect what is 251 * actually sent to the server) where explicitly documented. 252 * 253 * Returns: the #SoupMessage 254 * Since: 1.1.9 255 */ 256 SoupMessage* webkit_network_request_get_message(WebKitNetworkRequest* request) 257 { 258 g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL); 259 260 WebKitNetworkRequestPrivate* priv = request->priv; 261 262 return priv->message; 263 } 264