⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285919 in webkit


Ignore:
Timestamp:
Nov 17, 2021, 12:53:02 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:

[GTK][WPE] Support getting and setting HTTP headers in custom URI scheme handlers
https://bugs.webkit.org/show_bug.cgi?id=203273

Patch by Zixing Liu <liushuyu011@gmail.com> on 2021-11-17
Reviewed by Carlos Garcia Campos.

Source/WebKit:

  • UIProcess/API/glib/WebKitURISchemeRequest.cpp:

(webkit_uri_scheme_request_get_http_headers): Added new API function
(webkitURISchemeRequestReadCallback): Include user-specified headers

  • UIProcess/API/glib/WebKitURISchemeResponse.cpp:

(WebKitURISchemeResponseGetHeaders): Added a new private getter
(webkit_uri_scheme_response_set_http_headers): Added new API function

  • UIProcess/API/glib/WebKitURISchemeResponsePrivate.h:
  • UIProcess/API/gtk/WebKitURISchemeRequest.h: Added function prototype for

webkit_uri_scheme_request_get_http_headers

  • UIProcess/API/gtk/WebKitURISchemeResponse.h: Added function prototype for

webkit_uri_scheme_request_set_http_headers

  • UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Added new symbols
  • UIProcess/API/wpe/WebKitURISchemeRequest.h: Added function prototype for

webkit_uri_scheme_request_get_http_headers

  • UIProcess/API/wpe/WebKitURISchemeResponse.h: Added function prototype for

webkit_uri_scheme_request_set_http_headers

  • UIProcess/API/wpe/docs/wpe-1.0-sections.txt: Added new symbols

Tools:

  • TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp:

(testWebContextURIScheme): Added a new test to test getting and setting HTTP headers in custom URI scheme handlers

Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r285914 r285919  
     12021-11-17  Zixing Liu  <liushuyu011@gmail.com>
     2
     3        [GTK][WPE] Support getting and setting HTTP headers in custom URI scheme handlers
     4        https://bugs.webkit.org/show_bug.cgi?id=203273
     5
     6        Reviewed by Carlos Garcia Campos.
     7
     8        * UIProcess/API/glib/WebKitURISchemeRequest.cpp:
     9        (webkit_uri_scheme_request_get_http_headers): Added new API function
     10        (webkitURISchemeRequestReadCallback): Include user-specified headers
     11        * UIProcess/API/glib/WebKitURISchemeResponse.cpp:
     12        (WebKitURISchemeResponseGetHeaders): Added a new private getter
     13        (webkit_uri_scheme_response_set_http_headers): Added new API function
     14        * UIProcess/API/glib/WebKitURISchemeResponsePrivate.h:
     15        * UIProcess/API/gtk/WebKitURISchemeRequest.h: Added function prototype for
     16        webkit_uri_scheme_request_get_http_headers
     17        * UIProcess/API/gtk/WebKitURISchemeResponse.h: Added function prototype for
     18        webkit_uri_scheme_request_set_http_headers
     19        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Added new symbols
     20        * UIProcess/API/wpe/WebKitURISchemeRequest.h: Added function prototype for
     21        webkit_uri_scheme_request_get_http_headers
     22        * UIProcess/API/wpe/WebKitURISchemeResponse.h: Added function prototype for
     23        webkit_uri_scheme_request_set_http_headers
     24        * UIProcess/API/wpe/docs/wpe-1.0-sections.txt: Added new symbols
     25
    1262021-11-16  Ross Kirsling  <ross.kirsling@sony.com>
    227
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeRequest.cpp

    r285155 r285919  
    2828#include "WebKitWebView.h"
    2929#include "WebPageProxy.h"
     30#include <WebCore/GUniquePtrSoup.h>
    3031#include <WebCore/HTTPParsers.h>
    3132#include <WebCore/MIMETypeRegistry.h>
     
    7172    uint64_t bytesRead;
    7273    const char* httpMethod;
     74    GUniquePtr<SoupMessageHeaders> headers;
    7375};
    7476
     
    180182
    181183    return request->priv->httpMethod;
     184}
     185
     186/*
     187 * webkit_uri_scheme_request_get_http_headers:
     188 * @request: a #WebKitURISchemeRequest
     189 *
     190 * Get the #SoupMessageHeaders of the request.
     191 *
     192 * Returns: (transfer none): the #SoupMessageHeaders of the @request.
     193 *
     194 * Since: 2.36
     195 */
     196SoupMessageHeaders* webkit_uri_scheme_request_get_http_headers(WebKitURISchemeRequest* request)
     197{
     198    g_return_val_if_fail(WEBKIT_IS_URI_SCHEME_REQUEST(request), nullptr);
     199
     200    if (!request->priv->headers) {
     201        request->priv->headers.reset(soup_message_headers_new(SOUP_MESSAGE_HEADERS_REQUEST));
     202        request->priv->task->request().updateSoupMessageHeaders(request->priv->headers.get());
     203    }
     204
     205    return request->priv->headers.get();
    182206}
    183207
     
    200224    WebKitURISchemeResponse* resp = priv->response.get();
    201225    if (!priv->bytesRead) {
    202         CString contentType = WebKitURISchemeResponseGetContentType(resp);
    203         ResourceResponse response(priv->task->request().url(), extractMIMETypeFromMediaType(contentType.data()), WebKitURISchemeResponseGetStreamLength(resp), emptyString());
     226        CString contentType = webKitURISchemeResponseGetContentType(resp);
     227        ResourceResponse response(priv->task->request().url(), extractMIMETypeFromMediaType(contentType.data()), webKitURISchemeResponseGetStreamLength(resp), emptyString());
    204228        response.setTextEncodingName(extractCharsetFromMediaType(contentType.data()));
    205         const CString& statusMessage = WebKitURISchemeResponseGetStatusMessage(resp);
     229        const CString& statusMessage = webKitURISchemeResponseGetStatusMessage(resp);
    206230        if (statusMessage.isNull()) {
    207231            response.setHTTPStatusCode(200);
    208232            response.setHTTPStatusText("OK"_s);
    209233        } else {
    210             response.setHTTPStatusCode(WebKitURISchemeResponseGetStatusCode(resp));
     234            response.setHTTPStatusCode(webKitURISchemeResponseGetStatusCode(resp));
    211235            response.setHTTPStatusText(statusMessage.data());
    212236        }
    213237        if (response.mimeType().isEmpty())
    214238            response.setMimeType(MIMETypeRegistry::mimeTypeForPath(response.url().path().toString()));
     239        if (auto* headers = webKitURISchemeResponseGetHeaders(resp))
     240            response.updateFromSoupMessageHeaders(headers);
    215241        priv->task->didReceiveResponse(response);
    216242    }
     
    267293    request->priv->response = response;
    268294
    269     g_input_stream_read_async(WebKitURISchemeResponseGetStream(response), request->priv->readBuffer, gReadBufferSize, RunLoopSourcePriority::AsyncIONetwork, request->priv->cancellable.get(),
     295    g_input_stream_read_async(webKitURISchemeResponseGetStream(response), request->priv->readBuffer, gReadBufferSize, RunLoopSourcePriority::AsyncIONetwork, request->priv->cancellable.get(),
    270296        reinterpret_cast<GAsyncReadyCallback>(webkitURISchemeRequestReadCallback), g_object_ref(request));
    271297}
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponse.cpp

    r285155 r285919  
    2222
    2323#include "WebKitPrivate.h"
     24#include <WebCore/GUniquePtrSoup.h>
    2425#include <glib/gi18n-lib.h>
    2526#include <wtf/glib/GRefPtr.h>
     
    6364    CString statusMessage;
    6465    CString contentType;
     66    GUniquePtr<SoupMessageHeaders> headers;
    6567};
    6668
     
    125127
    126128// Private getters
    127 int WebKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse* response)
     129int webKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse* response)
    128130{
    129131    return response->priv->statusCode;
    130132}
    131133
    132 GInputStream* WebKitURISchemeResponseGetStream(const WebKitURISchemeResponse* response)
     134GInputStream* webKitURISchemeResponseGetStream(const WebKitURISchemeResponse* response)
    133135{
    134136    return response->priv->stream.get();
    135137}
    136138
    137 const CString& WebKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse* response)
     139const CString& webKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse* response)
    138140{
    139141    return response->priv->statusMessage;
    140142}
    141143
    142 const CString& WebKitURISchemeResponseGetContentType(const WebKitURISchemeResponse* response)
     144const CString& webKitURISchemeResponseGetContentType(const WebKitURISchemeResponse* response)
    143145{
    144146    return response->priv->contentType;
    145147}
    146148
    147 uint64_t WebKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse* response)
     149uint64_t webKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse* response)
    148150{
    149151    return response->priv->streamLength;
     152}
     153
     154SoupMessageHeaders* webKitURISchemeResponseGetHeaders(WebKitURISchemeResponse* response)
     155{
     156    return response->priv->headers.get();
    150157}
    151158
     
    183190
    184191    response->priv->contentType = contentType;
     192}
     193
     194/*
     195 * webkit_uri_scheme_response_set_http_headers:
     196 * @response: a #WebKitURISchemeResponse
     197 * @headers: (transfer full): the HTTP headers to be set
     198 *
     199 * Assign the provided #SoupMessageHeaders to the response.
     200 * @headers need to be of the type %SOUP_MESSAGE_HEADERS_RESPONSE.
     201 * Any existing headers will be overwritten.
     202 *
     203 * Since: 2.36
     204 */
     205void webkit_uri_scheme_response_set_http_headers(WebKitURISchemeResponse* response, SoupMessageHeaders* headers)
     206{
     207    g_return_if_fail(WEBKIT_IS_URI_SCHEME_RESPONSE(response));
     208    g_return_if_fail(soup_message_headers_get_headers_type(headers) == SOUP_MESSAGE_HEADERS_RESPONSE);
     209
     210    response->priv->headers.reset(headers);
    185211}
    186212
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponsePrivate.h

    r285155 r285919  
    2323#include <wtf/text/CString.h>
    2424
    25 int WebKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse*);
    26 GInputStream* WebKitURISchemeResponseGetStream(const WebKitURISchemeResponse*);
    27 const CString& WebKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse*);
    28 const CString& WebKitURISchemeResponseGetContentType(const WebKitURISchemeResponse*);
    29 uint64_t WebKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse*);
     25int webKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse*);
     26GInputStream* webKitURISchemeResponseGetStream(const WebKitURISchemeResponse*);
     27const CString& webKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse*);
     28const CString& webKitURISchemeResponseGetContentType(const WebKitURISchemeResponse*);
     29uint64_t webKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse*);
     30SoupMessageHeaders* webKitURISchemeResponseGetHeaders(WebKitURISchemeResponse*);
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeRequest.h

    r285155 r285919  
    2626
    2727#include <glib-object.h>
     28#include <libsoup/soup.h>
    2829#include <webkit2/WebKitDefines.h>
    2930#include <webkit2/WebKitForwardDeclarations.h>
     
    7677webkit_uri_scheme_request_get_http_method (WebKitURISchemeRequest *request);
    7778
     79WEBKIT_API SoupMessageHeaders *
     80webkit_uri_scheme_request_get_http_headers (WebKitURISchemeRequest *request);
     81
    7882WEBKIT_API void
    7983webkit_uri_scheme_request_finish       (WebKitURISchemeRequest *request,
  • trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeResponse.h

    r285155 r285919  
    2626
    2727#include <glib-object.h>
     28#include <libsoup/soup.h>
    2829#include <webkit2/WebKitDefines.h>
    2930#include <webkit2/WebKitForwardDeclarations.h>
     
    7374                                               const gchar             *content_type);
    7475
     76WEBKIT_API void
     77webkit_uri_scheme_response_set_http_headers   (WebKitURISchemeResponse *response,
     78                                               SoupMessageHeaders      *headers);
     79
    7580G_END_DECLS
    7681
  • trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt

    r285155 r285919  
    12791279webkit_uri_scheme_request_get_web_view
    12801280webkit_uri_scheme_request_get_http_method
     1281webkit_uri_scheme_request_get_http_headers
    12811282webkit_uri_scheme_request_finish
    12821283webkit_uri_scheme_request_finish_with_response
     
    13031304webkit_uri_scheme_response_set_content_type
    13041305webkit_uri_scheme_response_set_status
     1306webkit_uri_scheme_response_set_http_headers
    13051307
    13061308<SUBSECTION Standard>
  • trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeRequest.h

    r285155 r285919  
    2626
    2727#include <glib-object.h>
     28#include <libsoup/soup.h>
    2829#include <wpe/WebKitDefines.h>
    2930#include <wpe/WebKitURISchemeResponse.h>
     
    7778webkit_uri_scheme_request_get_http_method (WebKitURISchemeRequest *request);
    7879
     80WEBKIT_API SoupMessageHeaders *
     81webkit_uri_scheme_request_get_http_headers (WebKitURISchemeRequest *request);
     82
    7983WEBKIT_API void
    8084webkit_uri_scheme_request_finish       (WebKitURISchemeRequest *request,
  • trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeResponse.h

    r285155 r285919  
    2626
    2727#include <glib-object.h>
     28#include <libsoup/soup.h>
    2829#include <wpe/WebKitDefines.h>
    2930
     
    7273                                               const gchar             *content_type);
    7374
     75WEBKIT_API void
     76webkit_uri_scheme_response_set_http_headers   (WebKitURISchemeResponse *response,
     77                                               SoupMessageHeaders      *headers);
     78
    7479G_END_DECLS
    7580
  • trunk/Source/WebKit/UIProcess/API/wpe/docs/wpe-1.0-sections.txt

    r285155 r285919  
    12161216webkit_uri_scheme_request_get_web_view
    12171217webkit_uri_scheme_request_get_http_method
     1218webkit_uri_scheme_request_get_http_headers
    12181219webkit_uri_scheme_request_finish
    12191220webkit_uri_scheme_request_finish_with_response
     
    12401241webkit_uri_scheme_response_set_content_type
    12411242webkit_uri_scheme_response_set_status
     1243webkit_uri_scheme_response_set_http_headers
    12421244
    12431245<SUBSECTION Standard>
  • trunk/Tools/ChangeLog

    r285900 r285919  
     12021-11-17  Zixing Liu  <liushuyu011@gmail.com>
     2
     3        [GTK][WPE] Support getting and setting HTTP headers in custom URI scheme handlers
     4        https://bugs.webkit.org/show_bug.cgi?id=203273
     5
     6        Reviewed by Carlos Garcia Campos.
     7
     8        * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp:
     9        (testWebContextURIScheme): Added a new test to test getting and setting HTTP headers in custom URI scheme handlers
     10
    1112021-11-16  Jonathan Bedard  <jbedard@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp

    r285155 r285919  
    2323#include "WebKitTestServer.h"
    2424#include <WebCore/SoupVersioning.h>
     25#include <libsoup/soup.h>
    2526#include <limits.h>
    2627#include <stdlib.h>
     
    129130        else
    130131            g_assert_cmpstr(method, ==, "GET");
     132
     133        if (!g_strcmp0(scheme, "headers")) {
     134            auto* headers = webkit_uri_scheme_request_get_http_headers(request);
     135            g_assert_cmpstr(soup_message_headers_get_one(headers, "x-test"), ==, "A");
     136            g_assert_cmpstr(soup_message_headers_get_list(headers, "x-test2"), ==, "1, 2, 3, 4");
     137        }
    131138
    132139        const URISchemeHandler& handler = test->m_handlersMap.get(String::fromUTF8(scheme));
     
    167174        webkit_uri_scheme_response_set_status(response.get(), handler.statusCode, nullptr);
    168175        webkit_uri_scheme_response_set_content_type(response.get(), handler.mimeType.data());
     176        if (!g_strcmp0(scheme, "headersresp")) {
     177            auto* headers = soup_message_headers_new(SOUP_MESSAGE_HEADERS_RESPONSE);
     178            soup_message_headers_append(headers, "x-test", "test_value");
     179            webkit_uri_scheme_response_set_http_headers(response.get(), headers);
     180        }
    169181        webkit_uri_scheme_request_finish_with_response(request, response.get());
    170182    }
     
    332344    g_assert_no_error(postError.get());
    333345    test->waitUntilLoadFinished();
     346    g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::ProvisionalLoadFailed));
     347    g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::LoadFailed));
     348
     349    static const char* headersHTML = "<html><body><script>let hdrs = new Headers({'X-Test': 'A', 'X-Test2': '1, 2, 3'});hdrs.append('X-Test2', '4');fetch('headers:data', {headers: hdrs})</script></body></html>";
     350    test->registerURISchemeHandler("headers", nullptr, 0, "application/json", 204);
     351    test->m_loadEvents.clear();
     352    test->loadHtml(headersHTML, "headers:form");
     353    test->waitUntilLoadFinished();
     354    g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::ProvisionalLoadFailed));
     355    g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::LoadFailed));
     356
     357    static const char* respHTML = "<html><head><script>fetch('headersresp:data').then((d)=>{if(d.headers.get('X-Test') !== 'test_value') window.hasError=1}).catch((e)=> window.hasError=1)</script></head></html>";
     358    test->registerURISchemeHandler("headersresp", nullptr, 0, "application/json", 204);
     359    test->m_loadEvents.clear();
     360    test->loadHtml(respHTML, "headersresp:form");
     361    test->waitUntilLoadFinished();
     362    GUniqueOutPtr<GError> respError;
     363    test->runJavaScriptAndWaitUntilFinished("if(window.hasError) throw 'Headers are missing or invalid'", &respError.outPtr());
     364    g_assert_no_error(respError.get());
    334365    g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::ProvisionalLoadFailed));
    335366    g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::LoadFailed));
Note: See TracChangeset for help on using the changeset viewer.