/** * webkit_network_response_get_message: * @response: a #WebKitNetworkResponse * * Obtains the #SoupMessage that represents the given response. Notice * that only the response side of the HTTP conversation is * represented. * * Returns: (transfer none): the #SoupMessage * Since: 1.1.14 */ SoupMessage* webkit_network_response_get_message(WebKitNetworkResponse* response) { g_return_val_if_fail(WEBKIT_IS_NETWORK_RESPONSE(response), NULL); WebKitNetworkResponsePrivate* priv = response->priv; return priv->message; }
/** * webkit_network_response_get_uri: * @response: a #WebKitNetworkResponse * * Returns: the uri of the #WebKitNetworkResponse * * Since: 1.1.14 */ const gchar* webkit_network_response_get_uri(WebKitNetworkResponse* response) { g_return_val_if_fail(WEBKIT_IS_NETWORK_RESPONSE(response), NULL); WebKitNetworkResponsePrivate* priv = response->priv; if (priv->uri) return priv->uri; SoupURI* soupURI = soup_message_get_uri(priv->message); priv->uri = soup_uri_to_string(soupURI, FALSE); return priv->uri; }
/** * webkit_network_response_set_uri: * @response: a #WebKitNetworkResponse * @uri: an URI * * Sets the URI held and used by the given response. When the response * has an associated #SoupMessage, its URI will also be set by this * call. * * Since: 1.1.14 */ void webkit_network_response_set_uri(WebKitNetworkResponse* response, const gchar* uri) { g_return_if_fail(WEBKIT_IS_NETWORK_RESPONSE(response)); g_return_if_fail(uri); WebKitNetworkResponsePrivate* priv = response->priv; if (priv->uri) g_free(priv->uri); priv->uri = g_strdup(uri); if (!priv->message) return; SoupURI* soupURI = soup_uri_new(uri); g_return_if_fail(soupURI); soup_message_set_uri(priv->message, soupURI); soup_uri_free(soupURI); }
gboolean download_cb(WebKitWebView *web_view, WebKitDownload *download, gpointer user_data) { (void) web_view; (void) user_data; /* get the URI being downloaded */ const gchar *uri = webkit_download_get_uri(download); /* get the destination path, if specified. * this is only intended to be set when this function is trigger by an * explicit download using uzbl's 'download' action. */ const gchar *destination = user_data; if (uzbl.state.verbose) printf("Download requested -> %s\n", uri); if (!uzbl.behave.download_handler) { webkit_download_cancel(download); return FALSE; /* reject downloads when there's no download handler */ } /* get a reasonable suggestion for a filename */ const gchar *suggested_filename; #ifdef USE_WEBKIT2 WebKitURIResponse *response; g_object_get(download, "network-response", &response, NULL); #if WEBKIT_CHECK_VERSION (1, 9, 90) g_object_get(response, "suggested-filename", &suggested_filename, NULL); #else suggested_filename = webkit_uri_response_get_suggested_filename(respose); #endif #elif WEBKIT_CHECK_VERSION (1, 9, 6) WebKitNetworkResponse *response; g_object_get(download, "network-response", &response, NULL); g_object_get(response, "suggested-filename", &suggested_filename, NULL); #else g_object_get(download, "suggested-filename", &suggested_filename, NULL); #endif /* get the mimetype of the download */ const gchar *content_type = NULL; WebKitNetworkResponse *r = webkit_download_get_network_response(download); /* downloads can be initiated from the context menu, in that case there is no network response yet and trying to get one would crash. */ if(WEBKIT_IS_NETWORK_RESPONSE(r)) { SoupMessage *m = webkit_network_response_get_message(r); SoupMessageHeaders *h = NULL; g_object_get(m, "response-headers", &h, NULL); if(h) /* some versions of libsoup don't have "response-headers" here */ content_type = soup_message_headers_get_one(h, "Content-Type"); } if(!content_type) content_type = "application/octet-stream"; /* get the filesize of the download, as given by the server. (this may be inaccurate, there's nothing we can do about that.) */ unsigned int total_size = webkit_download_get_total_size(download); GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*)); const CommandInfo *c = parse_command_parts(uzbl.behave.download_handler, a); if(!c) { webkit_download_cancel(download); g_array_free(a, TRUE); return FALSE; } g_array_append_val(a, uri); g_array_append_val(a, suggested_filename); g_array_append_val(a, content_type); gchar *total_size_s = g_strdup_printf("%d", total_size); g_array_append_val(a, total_size_s); if(destination) g_array_append_val(a, destination); GString *result = g_string_new (""); run_parsed_command(c, a, result); g_free(total_size_s); g_array_free(a, TRUE); /* no response, cancel the download */ if(result->len == 0) { webkit_download_cancel(download); return FALSE; } /* we got a response, it's the path we should download the file to */ gchar *destination_path = result->str; g_string_free(result, FALSE); /* presumably people don't need newlines in their filenames. */ char *p = strchr(destination_path, '\n'); if ( p != NULL ) *p = '\0'; /* set up progress callbacks */ g_signal_connect(download, "notify::status", G_CALLBACK(download_status_cb), NULL); g_signal_connect(download, "notify::progress", G_CALLBACK(download_progress_cb), NULL); /* convert relative path to absolute path */ if(destination_path[0] != '/') { gchar *rel_path = destination_path; gchar *cwd = g_get_current_dir(); destination_path = g_strconcat(cwd, "/", destination_path, NULL); g_free(cwd); g_free(rel_path); } send_event(DOWNLOAD_STARTED, NULL, TYPE_STR, destination_path, NULL); /* convert absolute path to file:// URI */ gchar *destination_uri = g_strconcat("file://", destination_path, NULL); g_free(destination_path); webkit_download_set_destination_uri(download, destination_uri); g_free(destination_uri); return TRUE; }