[evolution/gnome-3-24] [Mail] Cached remote content not always found in cache



commit 0b7ba944180f8c161760026344aa4b8d9eec8d9a
Author: Milan Crha <mcrha redhat com>
Date:   Fri Mar 24 11:18:17 2017 +0100

    [Mail] Cached remote content not always found in cache
    
    The URL being used to check whether the image is already locally cached
    and the URL which was used to actually download the remote content did not
    match, thus the file were not found in the local cache. While I've been in
    it I also noticed that the remote content is not shown in the composer,
    even when it's downloaded locally, thus I fixed that as well.
    
    Reported downstream at:
    https://bugzilla.redhat.com/show_bug.cgi?id=1435288

 src/mail/e-http-request.c                   |   13 +++++-
 src/mail/e-mail-display.c                   |    4 ++
 src/modules/webkit-editor/CMakeLists.txt    |    1 +
 src/modules/webkit-editor/e-webkit-editor.c |   57 +++++++++++++++++++++++++++
 4 files changed, 73 insertions(+), 2 deletions(-)
---
diff --git a/src/mail/e-http-request.c b/src/mail/e-http-request.c
index f956c80..54e9bc1 100644
--- a/src/mail/e-http-request.c
+++ b/src/mail/e-http-request.c
@@ -184,7 +184,7 @@ e_http_request_process_sync (EContentRequest *request,
                             GError **error)
 {
        SoupURI *soup_uri;
-       gchar *evo_uri, *use_uri;
+       gchar *evo_uri = NULL, *use_uri;
        gchar *mail_uri = NULL;
        GInputStream *stream;
        gboolean force_load_images = FALSE;
@@ -219,6 +219,14 @@ e_http_request_process_sync (EContentRequest *request,
 
                g_hash_table_remove (query, "__evo-mail");
 
+               /* Required, because soup_uri_set_query_from_form() can change
+                  order of arguments, then the URL checksum doesn't match. */
+               evo_uri = g_hash_table_lookup (query, "__evo-original-uri");
+               if (evo_uri)
+                       evo_uri = g_strdup (evo_uri);
+
+               g_hash_table_remove (query, "__evo-original-uri");
+
                /* Remove __evo-load-images if present (and in such case set
                 * force_load_images to TRUE) */
                force_load_images = g_hash_table_remove (query, "__evo-load-images");
@@ -227,7 +235,8 @@ e_http_request_process_sync (EContentRequest *request,
                g_hash_table_unref (query);
        }
 
-       evo_uri = soup_uri_to_string (soup_uri, FALSE);
+       if (!evo_uri)
+               evo_uri = soup_uri_to_string (soup_uri, FALSE);
 
        if (camel_debug_start ("emformat:requests")) {
                printf (
diff --git a/src/mail/e-mail-display.c b/src/mail/e-mail-display.c
index 5d0bce8..cb4c661 100644
--- a/src/mail/e-mail-display.c
+++ b/src/mail/e-mail-display.c
@@ -1739,6 +1739,10 @@ mail_display_uri_requested_cb (EWebView *web_view,
                enc = soup_uri_encode (mail_uri, NULL);
                g_hash_table_insert (query, g_strdup ("__evo-mail"), enc);
 
+               /* Required, because soup_uri_set_query_from_form() can change
+                  order of arguments, then the URL checksum doesn't match. */
+               g_hash_table_insert (query, g_strdup ("__evo-original-uri"), g_strdup (uri));
+
                if (display->priv->force_image_load || can_download_uri) {
                        g_hash_table_insert (
                                query,
diff --git a/src/modules/webkit-editor/CMakeLists.txt b/src/modules/webkit-editor/CMakeLists.txt
index d974218..3dadd07 100644
--- a/src/modules/webkit-editor/CMakeLists.txt
+++ b/src/modules/webkit-editor/CMakeLists.txt
@@ -1,4 +1,5 @@
 set(extra_deps
+       evolution-mail
        evolution-mail-composer
 )
 set(sources
diff --git a/src/modules/webkit-editor/e-webkit-editor.c b/src/modules/webkit-editor/e-webkit-editor.c
index 71023a0..36dc898 100644
--- a/src/modules/webkit-editor/e-webkit-editor.c
+++ b/src/modules/webkit-editor/e-webkit-editor.c
@@ -22,6 +22,7 @@
 
 #include "e-util/e-util.h"
 #include "composer/e-msg-composer.h"
+#include "mail/e-http-request.h"
 
 #include <string.h>
 
@@ -4989,9 +4990,58 @@ webkit_editor_get_web_extension (EWebKitEditor *wk_editor)
 }
 
 static void
+webkit_editor_uri_request_done_cb (GObject *source_object,
+                                  GAsyncResult *result,
+                                  gpointer user_data)
+{
+       WebKitURISchemeRequest *request = user_data;
+       GInputStream *stream = NULL;
+       gint64 stream_length = -1;
+       gchar *mime_type = NULL;
+       GError *error = NULL;
+
+       g_return_if_fail (E_IS_CONTENT_REQUEST (source_object));
+       g_return_if_fail (WEBKIT_IS_URI_SCHEME_REQUEST (request));
+
+       if (!e_content_request_process_finish (E_CONTENT_REQUEST (source_object),
+               result, &stream, &stream_length, &mime_type, &error)) {
+               webkit_uri_scheme_request_finish_error (request, error);
+               g_clear_error (&error);
+       } else {
+               webkit_uri_scheme_request_finish (request, stream, stream_length, mime_type);
+
+               g_clear_object (&stream);
+               g_free (mime_type);
+       }
+
+       g_object_unref (request);
+}
+
+static void
+webkit_editor_process_uri_request_cb (WebKitURISchemeRequest *request,
+                                     gpointer user_data)
+{
+       EContentRequest *content_request = user_data;
+       const gchar *uri;
+       GObject *requester;
+
+       g_return_if_fail (WEBKIT_IS_URI_SCHEME_REQUEST (request));
+       g_return_if_fail (E_IS_CONTENT_REQUEST (content_request));
+
+       uri = webkit_uri_scheme_request_get_uri (request);
+       requester = G_OBJECT (webkit_uri_scheme_request_get_web_view (request));
+
+       g_return_if_fail (e_content_request_can_process_uri (content_request, uri));
+
+       e_content_request_process (content_request, uri, requester, NULL,
+               webkit_editor_uri_request_done_cb, g_object_ref (request));
+}
+
+static void
 webkit_editor_constructed (GObject *object)
 {
        EWebKitEditor *wk_editor;
+       EContentRequest *content_request;
        gchar **languages;
        WebKitWebContext *web_context;
        WebKitSettings *web_settings;
@@ -5012,6 +5062,13 @@ webkit_editor_constructed (GObject *object)
        webkit_web_context_set_spell_checking_languages (web_context, (const gchar * const *) languages);
        g_strfreev (languages);
 
+       content_request = e_http_request_new ();
+       webkit_web_context_register_uri_scheme (web_context, "evo-http", webkit_editor_process_uri_request_cb,
+               g_object_ref (content_request), g_object_unref);
+       webkit_web_context_register_uri_scheme (web_context, "evo-https", 
webkit_editor_process_uri_request_cb,
+               g_object_ref (content_request), g_object_unref);
+       g_object_unref (content_request);
+
        webkit_web_view_set_editable (web_view, TRUE);
 
        web_settings = webkit_web_view_get_settings (web_view);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]