Diff
Modified: trunk/Source/WebKit/ChangeLog (285918 => 285919)
--- trunk/Source/WebKit/ChangeLog 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/ChangeLog 2021-11-17 08:53:02 UTC (rev 285919)
@@ -1,3 +1,28 @@
+2021-11-17 Zixing Liu <[email protected]>
+
+ [GTK][WPE] Support getting and setting HTTP headers in custom URI scheme handlers
+ https://bugs.webkit.org/show_bug.cgi?id=203273
+
+ Reviewed by Carlos Garcia Campos.
+
+ * 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
+
2021-11-16 Ross Kirsling <[email protected]>
Unreviewed, fix WinCairo build following r285881.
Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeRequest.cpp (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeRequest.cpp 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeRequest.cpp 2021-11-17 08:53:02 UTC (rev 285919)
@@ -27,6 +27,7 @@
#include "WebKitWebContextPrivate.h"
#include "WebKitWebView.h"
#include "WebPageProxy.h"
+#include <WebCore/GUniquePtrSoup.h>
#include <WebCore/HTTPParsers.h>
#include <WebCore/MIMETypeRegistry.h>
#include <WebCore/ResourceError.h>
@@ -70,6 +71,7 @@
char readBuffer[gReadBufferSize];
uint64_t bytesRead;
const char* httpMethod;
+ GUniquePtr<SoupMessageHeaders> headers;
};
WEBKIT_DEFINE_TYPE(WebKitURISchemeRequest, webkit_uri_scheme_request, G_TYPE_OBJECT)
@@ -181,6 +183,28 @@
return request->priv->httpMethod;
}
+/*
+ * webkit_uri_scheme_request_get_http_headers:
+ * @request: a #WebKitURISchemeRequest
+ *
+ * Get the #SoupMessageHeaders of the request.
+ *
+ * Returns: (transfer none): the #SoupMessageHeaders of the @request.
+ *
+ * Since: 2.36
+ */
+SoupMessageHeaders* webkit_uri_scheme_request_get_http_headers(WebKitURISchemeRequest* request)
+{
+ g_return_val_if_fail(WEBKIT_IS_URI_SCHEME_REQUEST(request), nullptr);
+
+ if (!request->priv->headers) {
+ request->priv->headers.reset(soup_message_headers_new(SOUP_MESSAGE_HEADERS_REQUEST));
+ request->priv->task->request().updateSoupMessageHeaders(request->priv->headers.get());
+ }
+
+ return request->priv->headers.get();
+}
+
static void webkitURISchemeRequestReadCallback(GInputStream* inputStream, GAsyncResult* result, WebKitURISchemeRequest* schemeRequest)
{
GRefPtr<WebKitURISchemeRequest> request = adoptGRef(schemeRequest);
@@ -199,19 +223,21 @@
WebKitURISchemeResponse* resp = priv->response.get();
if (!priv->bytesRead) {
- CString contentType = WebKitURISchemeResponseGetContentType(resp);
- ResourceResponse response(priv->task->request().url(), extractMIMETypeFromMediaType(contentType.data()), WebKitURISchemeResponseGetStreamLength(resp), emptyString());
+ CString contentType = webKitURISchemeResponseGetContentType(resp);
+ ResourceResponse response(priv->task->request().url(), extractMIMETypeFromMediaType(contentType.data()), webKitURISchemeResponseGetStreamLength(resp), emptyString());
response.setTextEncodingName(extractCharsetFromMediaType(contentType.data()));
- const CString& statusMessage = WebKitURISchemeResponseGetStatusMessage(resp);
+ const CString& statusMessage = webKitURISchemeResponseGetStatusMessage(resp);
if (statusMessage.isNull()) {
response.setHTTPStatusCode(200);
response.setHTTPStatusText("OK"_s);
} else {
- response.setHTTPStatusCode(WebKitURISchemeResponseGetStatusCode(resp));
+ response.setHTTPStatusCode(webKitURISchemeResponseGetStatusCode(resp));
response.setHTTPStatusText(statusMessage.data());
}
if (response.mimeType().isEmpty())
response.setMimeType(MIMETypeRegistry::mimeTypeForPath(response.url().path().toString()));
+ if (auto* headers = webKitURISchemeResponseGetHeaders(resp))
+ response.updateFromSoupMessageHeaders(headers);
priv->task->didReceiveResponse(response);
}
@@ -266,7 +292,7 @@
request->priv->cancellable = adoptGRef(g_cancellable_new());
request->priv->response = response;
- g_input_stream_read_async(WebKitURISchemeResponseGetStream(response), request->priv->readBuffer, gReadBufferSize, RunLoopSourcePriority::AsyncIONetwork, request->priv->cancellable.get(),
+ g_input_stream_read_async(webKitURISchemeResponseGetStream(response), request->priv->readBuffer, gReadBufferSize, RunLoopSourcePriority::AsyncIONetwork, request->priv->cancellable.get(),
reinterpret_cast<GAsyncReadyCallback>(webkitURISchemeRequestReadCallback), g_object_ref(request));
}
Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponse.cpp (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponse.cpp 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponse.cpp 2021-11-17 08:53:02 UTC (rev 285919)
@@ -21,6 +21,7 @@
#include "WebKitURISchemeResponsePrivate.h"
#include "WebKitPrivate.h"
+#include <WebCore/GUniquePtrSoup.h>
#include <glib/gi18n-lib.h>
#include <wtf/glib/GRefPtr.h>
#include <wtf/glib/WTFGType.h>
@@ -62,6 +63,7 @@
int statusCode { -1 };
CString statusMessage;
CString contentType;
+ GUniquePtr<SoupMessageHeaders> headers;
};
WEBKIT_DEFINE_TYPE(WebKitURISchemeResponse, webkit_uri_scheme_response, G_TYPE_OBJECT)
@@ -124,31 +126,36 @@
}
// Private getters
-int WebKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse* response)
+int webKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse* response)
{
return response->priv->statusCode;
}
-GInputStream* WebKitURISchemeResponseGetStream(const WebKitURISchemeResponse* response)
+GInputStream* webKitURISchemeResponseGetStream(const WebKitURISchemeResponse* response)
{
return response->priv->stream.get();
}
-const CString& WebKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse* response)
+const CString& webKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse* response)
{
return response->priv->statusMessage;
}
-const CString& WebKitURISchemeResponseGetContentType(const WebKitURISchemeResponse* response)
+const CString& webKitURISchemeResponseGetContentType(const WebKitURISchemeResponse* response)
{
return response->priv->contentType;
}
-uint64_t WebKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse* response)
+uint64_t webKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse* response)
{
return response->priv->streamLength;
}
+SoupMessageHeaders* webKitURISchemeResponseGetHeaders(WebKitURISchemeResponse* response)
+{
+ return response->priv->headers.get();
+}
+
/**
* webkit_uri_scheme_response_new:
* @input_stream: a #GInputStream to read the contents of the request
@@ -184,6 +191,25 @@
response->priv->contentType = contentType;
}
+/*
+ * webkit_uri_scheme_response_set_http_headers:
+ * @response: a #WebKitURISchemeResponse
+ * @headers: (transfer full): the HTTP headers to be set
+ *
+ * Assign the provided #SoupMessageHeaders to the response.
+ * @headers need to be of the type %SOUP_MESSAGE_HEADERS_RESPONSE.
+ * Any existing headers will be overwritten.
+ *
+ * Since: 2.36
+ */
+void webkit_uri_scheme_response_set_http_headers(WebKitURISchemeResponse* response, SoupMessageHeaders* headers)
+{
+ g_return_if_fail(WEBKIT_IS_URI_SCHEME_RESPONSE(response));
+ g_return_if_fail(soup_message_headers_get_headers_type(headers) == SOUP_MESSAGE_HEADERS_RESPONSE);
+
+ response->priv->headers.reset(headers);
+}
+
/**
* webkit_uri_scheme_response_set_status:
* @response: a #WebKitURISchemeResponse
Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponsePrivate.h (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponsePrivate.h 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitURISchemeResponsePrivate.h 2021-11-17 08:53:02 UTC (rev 285919)
@@ -22,8 +22,9 @@
#include "WebKitURISchemeResponse.h"
#include <wtf/text/CString.h>
-int WebKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse*);
-GInputStream* WebKitURISchemeResponseGetStream(const WebKitURISchemeResponse*);
-const CString& WebKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse*);
-const CString& WebKitURISchemeResponseGetContentType(const WebKitURISchemeResponse*);
-uint64_t WebKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse*);
+int webKitURISchemeResponseGetStatusCode(const WebKitURISchemeResponse*);
+GInputStream* webKitURISchemeResponseGetStream(const WebKitURISchemeResponse*);
+const CString& webKitURISchemeResponseGetStatusMessage(const WebKitURISchemeResponse*);
+const CString& webKitURISchemeResponseGetContentType(const WebKitURISchemeResponse*);
+uint64_t webKitURISchemeResponseGetStreamLength(const WebKitURISchemeResponse*);
+SoupMessageHeaders* webKitURISchemeResponseGetHeaders(WebKitURISchemeResponse*);
Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeRequest.h (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeRequest.h 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeRequest.h 2021-11-17 08:53:02 UTC (rev 285919)
@@ -25,6 +25,7 @@
#define WebKitURISchemeRequest_h
#include <glib-object.h>
+#include <libsoup/soup.h>
#include <webkit2/WebKitDefines.h>
#include <webkit2/WebKitForwardDeclarations.h>
#include <webkit2/WebKitURISchemeResponse.h>
@@ -75,6 +76,9 @@
WEBKIT_API const gchar *
webkit_uri_scheme_request_get_http_method (WebKitURISchemeRequest *request);
+WEBKIT_API SoupMessageHeaders *
+webkit_uri_scheme_request_get_http_headers (WebKitURISchemeRequest *request);
+
WEBKIT_API void
webkit_uri_scheme_request_finish (WebKitURISchemeRequest *request,
GInputStream *stream,
Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeResponse.h (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeResponse.h 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitURISchemeResponse.h 2021-11-17 08:53:02 UTC (rev 285919)
@@ -25,6 +25,7 @@
#define WebKitURISchemeResponse_h
#include <glib-object.h>
+#include <libsoup/soup.h>
#include <webkit2/WebKitDefines.h>
#include <webkit2/WebKitForwardDeclarations.h>
@@ -72,6 +73,10 @@
webkit_uri_scheme_response_set_content_type (WebKitURISchemeResponse *response,
const gchar *content_type);
+WEBKIT_API void
+webkit_uri_scheme_response_set_http_headers (WebKitURISchemeResponse *response,
+ SoupMessageHeaders *headers);
+
G_END_DECLS
#endif
Modified: trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt 2021-11-17 08:53:02 UTC (rev 285919)
@@ -1278,6 +1278,7 @@
webkit_uri_scheme_request_get_path
webkit_uri_scheme_request_get_web_view
webkit_uri_scheme_request_get_http_method
+webkit_uri_scheme_request_get_http_headers
webkit_uri_scheme_request_finish
webkit_uri_scheme_request_finish_with_response
webkit_uri_scheme_request_finish_error
@@ -1302,6 +1303,7 @@
webkit_uri_scheme_response_new
webkit_uri_scheme_response_set_content_type
webkit_uri_scheme_response_set_status
+webkit_uri_scheme_response_set_http_headers
<SUBSECTION Standard>
WebKitURISchemeResponseClass
Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeRequest.h (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeRequest.h 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeRequest.h 2021-11-17 08:53:02 UTC (rev 285919)
@@ -25,6 +25,7 @@
#define WebKitURISchemeRequest_h
#include <glib-object.h>
+#include <libsoup/soup.h>
#include <wpe/WebKitDefines.h>
#include <wpe/WebKitURISchemeResponse.h>
@@ -76,6 +77,9 @@
WEBKIT_API const gchar *
webkit_uri_scheme_request_get_http_method (WebKitURISchemeRequest *request);
+WEBKIT_API SoupMessageHeaders *
+webkit_uri_scheme_request_get_http_headers (WebKitURISchemeRequest *request);
+
WEBKIT_API void
webkit_uri_scheme_request_finish (WebKitURISchemeRequest *request,
GInputStream *stream,
Modified: trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeResponse.h (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeResponse.h 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/wpe/WebKitURISchemeResponse.h 2021-11-17 08:53:02 UTC (rev 285919)
@@ -25,6 +25,7 @@
#define WebKitURISchemeResponse_h
#include <glib-object.h>
+#include <libsoup/soup.h>
#include <wpe/WebKitDefines.h>
G_BEGIN_DECLS
@@ -71,6 +72,10 @@
webkit_uri_scheme_response_set_content_type (WebKitURISchemeResponse *response,
const gchar *content_type);
+WEBKIT_API void
+webkit_uri_scheme_response_set_http_headers (WebKitURISchemeResponse *response,
+ SoupMessageHeaders *headers);
+
G_END_DECLS
#endif
Modified: trunk/Source/WebKit/UIProcess/API/wpe/docs/wpe-1.0-sections.txt (285918 => 285919)
--- trunk/Source/WebKit/UIProcess/API/wpe/docs/wpe-1.0-sections.txt 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Source/WebKit/UIProcess/API/wpe/docs/wpe-1.0-sections.txt 2021-11-17 08:53:02 UTC (rev 285919)
@@ -1215,6 +1215,7 @@
webkit_uri_scheme_request_get_path
webkit_uri_scheme_request_get_web_view
webkit_uri_scheme_request_get_http_method
+webkit_uri_scheme_request_get_http_headers
webkit_uri_scheme_request_finish
webkit_uri_scheme_request_finish_with_response
webkit_uri_scheme_request_finish_error
@@ -1239,6 +1240,7 @@
webkit_uri_scheme_response_new
webkit_uri_scheme_response_set_content_type
webkit_uri_scheme_response_set_status
+webkit_uri_scheme_response_set_http_headers
<SUBSECTION Standard>
WebKitURISchemeResponseClass
Modified: trunk/Tools/ChangeLog (285918 => 285919)
--- trunk/Tools/ChangeLog 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Tools/ChangeLog 2021-11-17 08:53:02 UTC (rev 285919)
@@ -1,3 +1,13 @@
+2021-11-17 Zixing Liu <[email protected]>
+
+ [GTK][WPE] Support getting and setting HTTP headers in custom URI scheme handlers
+ https://bugs.webkit.org/show_bug.cgi?id=203273
+
+ Reviewed by Carlos Garcia Campos.
+
+ * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp:
+ (testWebContextURIScheme): Added a new test to test getting and setting HTTP headers in custom URI scheme handlers
+
2021-11-16 Jonathan Bedard <[email protected]>
[webkitscmpy] Load secrets in kubernetes
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp (285918 => 285919)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp 2021-11-17 07:54:59 UTC (rev 285918)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebContext.cpp 2021-11-17 08:53:02 UTC (rev 285919)
@@ -22,6 +22,7 @@
#include "LoadTrackingTest.h"
#include "WebKitTestServer.h"
#include <WebCore/SoupVersioning.h>
+#include <libsoup/soup.h>
#include <limits.h>
#include <stdlib.h>
#include <wtf/HashMap.h>
@@ -129,6 +130,12 @@
else
g_assert_cmpstr(method, ==, "GET");
+ if (!g_strcmp0(scheme, "headers")) {
+ auto* headers = webkit_uri_scheme_request_get_http_headers(request);
+ g_assert_cmpstr(soup_message_headers_get_one(headers, "x-test"), ==, "A");
+ g_assert_cmpstr(soup_message_headers_get_list(headers, "x-test2"), ==, "1, 2, 3, 4");
+ }
+
const URISchemeHandler& handler = test->m_handlersMap.get(String::fromUTF8(scheme));
GRefPtr<GInputStream> inputStream = adoptGRef(g_memory_input_stream_new());
@@ -166,6 +173,11 @@
auto response = adoptGRef(webkit_uri_scheme_response_new(inputStream.get(), handler.replyLength));
webkit_uri_scheme_response_set_status(response.get(), handler.statusCode, nullptr);
webkit_uri_scheme_response_set_content_type(response.get(), handler.mimeType.data());
+ if (!g_strcmp0(scheme, "headersresp")) {
+ auto* headers = soup_message_headers_new(SOUP_MESSAGE_HEADERS_RESPONSE);
+ soup_message_headers_append(headers, "x-test", "test_value");
+ webkit_uri_scheme_response_set_http_headers(response.get(), headers);
+ }
webkit_uri_scheme_request_finish_with_response(request, response.get());
}
@@ -334,6 +346,25 @@
g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::ProvisionalLoadFailed));
g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::LoadFailed));
+ 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>";
+ test->registerURISchemeHandler("headers", nullptr, 0, "application/json", 204);
+ test->m_loadEvents.clear();
+ test->loadHtml(headersHTML, "headers:form");
+ test->waitUntilLoadFinished();
+ g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::ProvisionalLoadFailed));
+ g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::LoadFailed));
+
+ 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>";
+ test->registerURISchemeHandler("headersresp", nullptr, 0, "application/json", 204);
+ test->m_loadEvents.clear();
+ test->loadHtml(respHTML, "headersresp:form");
+ test->waitUntilLoadFinished();
+ GUniqueOutPtr<GError> respError;
+ test->runJavaScriptAndWaitUntilFinished("if(window.hasError) throw 'Headers are missing or invalid'", &respError.outPtr());
+ g_assert_no_error(respError.get());
+ g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::ProvisionalLoadFailed));
+ g_assert_false(test->m_loadEvents.contains(LoadTrackingTest::LoadFailed));
+
// Torture test time: make sure it still works if we issue a bunch of different requests all at
// once. Each request should finish and return exactly the same data.
int numIterations = 25;