Diff
Modified: trunk/Source/WebCore/ChangeLog (272009 => 272010)
--- trunk/Source/WebCore/ChangeLog 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebCore/ChangeLog 2021-01-28 12:42:14 UTC (rev 272010)
@@ -1,5 +1,23 @@
2021-01-28 Carlos Garcia Campos <cgar...@igalia.com>
+ [SOUP] Stop using SoupRequest API in preparation for libsoup3
+ https://bugs.webkit.org/show_bug.cgi?id=220764
+
+ Reviewed by Adrian Perez de Castro.
+
+ * platform/network/soup/ResourceError.h: Error constructors now receive the failing URL instead of a SoupRequest
+ that is only used to get its URL.
+ * platform/network/soup/ResourceErrorSoup.cpp:
+ (WebCore::ResourceError::transportError):
+ (WebCore::ResourceError::httpError):
+ (WebCore::ResourceError::genericGError):
+ * platform/network/soup/ResourceRequest.h: Remmove the constructor that receives a SoupRequest and the
+ initiating page ID since it's currently unsused.
+ * platform/network/soup/ResourceRequestSoup.cpp:
+ * platform/network/soup/SoupNetworkSession.h:
+
+2021-01-28 Carlos Garcia Campos <cgar...@igalia.com>
+
Load data URLs in the web process also for synchronous loads
https://bugs.webkit.org/show_bug.cgi?id=220981
Modified: trunk/Source/WebCore/platform/network/soup/ResourceError.h (272009 => 272010)
--- trunk/Source/WebCore/platform/network/soup/ResourceError.h 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebCore/platform/network/soup/ResourceError.h 2021-01-28 12:42:14 UTC (rev 272010)
@@ -23,8 +23,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ResourceError_h
-#define ResourceError_h
+#pragma once
#include "ResourceErrorBase.h"
@@ -33,29 +32,25 @@
#include <wtf/glib/GRefPtr.h>
typedef struct _GTlsCertificate GTlsCertificate;
-typedef struct _SoupRequest SoupRequest;
typedef struct _SoupMessage SoupMessage;
namespace WebCore {
-class ResourceError : public ResourceErrorBase
-{
+class ResourceError : public ResourceErrorBase {
public:
ResourceError(Type type = Type::Null)
: ResourceErrorBase(type)
- , m_tlsErrors(0)
{
}
ResourceError(const String& domain, int errorCode, const URL& failingURL, const String& localizedDescription, Type type = Type::General)
: ResourceErrorBase(domain, errorCode, failingURL, localizedDescription, type)
- , m_tlsErrors(0)
{
}
- static ResourceError httpError(SoupMessage*, GError*, SoupRequest*);
- static ResourceError transportError(SoupRequest*, int statusCode, const String& reasonPhrase);
- static ResourceError genericGError(GError*, SoupRequest*);
+ static ResourceError httpError(SoupMessage*, GError*);
+ static ResourceError transportError(const URL&, int statusCode, const String& reasonPhrase);
+ static ResourceError genericGError(const URL&, GError*);
static ResourceError tlsError(const URL&, unsigned tlsErrors, GTlsCertificate*);
static ResourceError timeoutError(const URL& failingURL);
static ResourceError authenticationError(SoupMessage*);
@@ -71,12 +66,10 @@
friend class ResourceErrorBase;
void doPlatformIsolatedCopy(const ResourceError&);
- unsigned m_tlsErrors;
+ unsigned m_tlsErrors { 0 };
GRefPtr<GTlsCertificate> m_certificate;
};
-}
+} // namespace WebCore
-#endif
-
-#endif // ResourceError_h_
+#endif // USE(SOUP)
Modified: trunk/Source/WebCore/platform/network/soup/ResourceErrorSoup.cpp (272009 => 272010)
--- trunk/Source/WebCore/platform/network/soup/ResourceErrorSoup.cpp 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebCore/platform/network/soup/ResourceErrorSoup.cpp 2021-01-28 12:42:14 UTC (rev 272010)
@@ -42,27 +42,19 @@
return soupURIToURL(soupURI);
}
-static URL failingURI(SoupRequest* request)
+ResourceError ResourceError::transportError(const URL& failingURL, int statusCode, const String& reasonPhrase)
{
- ASSERT(request);
- return failingURI(soup_request_get_uri(request));
+ return ResourceError(g_quark_to_string(SOUP_HTTP_ERROR), statusCode, failingURL, reasonPhrase);
}
-ResourceError ResourceError::transportError(SoupRequest* request, int statusCode, const String& reasonPhrase)
+ResourceError ResourceError::httpError(SoupMessage* message, GError* error)
{
- return ResourceError(g_quark_to_string(SOUP_HTTP_ERROR), statusCode,
- failingURI(request), reasonPhrase);
+ ASSERT(message);
+ if (SOUP_STATUS_IS_TRANSPORT_ERROR(message->status_code))
+ return transportError(failingURI(soup_message_get_uri(message)), message->status_code, String::fromUTF8(message->reason_phrase));
+ return genericGError(failingURI(soup_message_get_uri(message)), error);
}
-ResourceError ResourceError::httpError(SoupMessage* message, GError* error, SoupRequest* request)
-{
- if (message && SOUP_STATUS_IS_TRANSPORT_ERROR(message->status_code))
- return transportError(request, message->status_code,
- String::fromUTF8(message->reason_phrase));
- else
- return genericGError(error, request);
-}
-
ResourceError ResourceError::authenticationError(SoupMessage* message)
{
ASSERT(message);
@@ -70,10 +62,9 @@
failingURI(soup_message_get_uri(message)), String::fromUTF8(message->reason_phrase));
}
-ResourceError ResourceError::genericGError(GError* error, SoupRequest* request)
+ResourceError ResourceError::genericGError(const URL& failingURL, GError* error)
{
- return ResourceError(g_quark_to_string(error->domain), error->code,
- failingURI(request), String::fromUTF8(error->message));
+ return ResourceError(g_quark_to_string(error->domain), error->code, failingURL, String::fromUTF8(error->message));
}
ResourceError ResourceError::tlsError(const URL& failingURL, unsigned tlsErrors, GTlsCertificate* certificate)
Modified: trunk/Source/WebCore/platform/network/soup/ResourceRequest.h (272009 => 272010)
--- trunk/Source/WebCore/platform/network/soup/ResourceRequest.h 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebCore/platform/network/soup/ResourceRequest.h 2021-01-28 12:42:14 UTC (rev 272010)
@@ -24,8 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ResourceRequest_h
-#define ResourceRequest_h
+#pragma once
#include "PageIdentifier.h"
#include "ResourceRequestBase.h"
@@ -33,96 +32,65 @@
namespace WebCore {
- class BlobRegistryImpl;
+class BlobRegistryImpl;
- class ResourceRequest : public ResourceRequestBase {
- public:
- ResourceRequest(const String& url)
- : ResourceRequestBase(URL({ }, url), ResourceRequestCachePolicy::UseProtocolCachePolicy)
- , m_acceptEncoding(true)
- , m_soupFlags(static_cast<SoupMessageFlags>(0))
- {
- }
+class ResourceRequest : public ResourceRequestBase {
+public:
+ explicit ResourceRequest(const String& url)
+ : ResourceRequestBase(URL({ }, url), ResourceRequestCachePolicy::UseProtocolCachePolicy)
+ {
+ }
- ResourceRequest(const URL& url)
- : ResourceRequestBase(url, ResourceRequestCachePolicy::UseProtocolCachePolicy)
- , m_acceptEncoding(true)
- , m_soupFlags(static_cast<SoupMessageFlags>(0))
- {
- }
+ ResourceRequest(const URL& url)
+ : ResourceRequestBase(url, ResourceRequestCachePolicy::UseProtocolCachePolicy)
+ {
+ }
- ResourceRequest(const URL& url, const String& referrer, ResourceRequestCachePolicy policy = ResourceRequestCachePolicy::UseProtocolCachePolicy)
- : ResourceRequestBase(url, policy)
- , m_acceptEncoding(true)
- , m_soupFlags(static_cast<SoupMessageFlags>(0))
- {
- setHTTPReferrer(referrer);
- }
+ ResourceRequest(const URL& url, const String& referrer, ResourceRequestCachePolicy policy = ResourceRequestCachePolicy::UseProtocolCachePolicy)
+ : ResourceRequestBase(url, policy)
+ {
+ setHTTPReferrer(referrer);
+ }
- ResourceRequest()
- : ResourceRequestBase(URL(), ResourceRequestCachePolicy::UseProtocolCachePolicy)
- , m_acceptEncoding(true)
- , m_soupFlags(static_cast<SoupMessageFlags>(0))
- {
- }
+ ResourceRequest()
+ : ResourceRequestBase(URL(), ResourceRequestCachePolicy::UseProtocolCachePolicy)
+ {
+ }
- ResourceRequest(SoupMessage* soupMessage)
- : ResourceRequestBase(URL(), ResourceRequestCachePolicy::UseProtocolCachePolicy)
- , m_acceptEncoding(true)
- , m_soupFlags(static_cast<SoupMessageFlags>(0))
- {
- updateFromSoupMessage(soupMessage);
- }
+ void updateFromDelegatePreservingOldProperties(const ResourceRequest& delegateProvidedRequest) { *this = delegateProvidedRequest; }
- ResourceRequest(SoupRequest* soupRequest)
- : ResourceRequestBase(soupURIToURL(soup_request_get_uri(soupRequest)), ResourceRequestCachePolicy::UseProtocolCachePolicy)
- , m_acceptEncoding(true)
- , m_soupFlags(static_cast<SoupMessageFlags>(0))
- {
- updateFromSoupRequest(soupRequest);
- }
+ bool acceptEncoding() const { return m_acceptEncoding; }
+ void setAcceptEncoding(bool acceptEncoding) { m_acceptEncoding = acceptEncoding; }
- void updateFromDelegatePreservingOldProperties(const ResourceRequest& delegateProvidedRequest) { *this = delegateProvidedRequest; }
+ void updateSoupMessageHeaders(SoupMessageHeaders*) const;
+ void updateFromSoupMessageHeaders(SoupMessageHeaders*);
+ void updateSoupMessage(SoupMessage*, BlobRegistryImpl&) const;
+ void updateFromSoupMessage(SoupMessage*);
- bool acceptEncoding() const { return m_acceptEncoding; }
- void setAcceptEncoding(bool acceptEncoding) { m_acceptEncoding = acceptEncoding; }
+ SoupMessageFlags soupMessageFlags() const { return m_soupFlags; }
+ void setSoupMessageFlags(SoupMessageFlags soupFlags) { m_soupFlags = soupFlags; }
- void updateSoupMessageHeaders(SoupMessageHeaders*) const;
- void updateFromSoupMessageHeaders(SoupMessageHeaders*);
- void updateSoupMessage(SoupMessage*, BlobRegistryImpl&) const;
- void updateFromSoupMessage(SoupMessage*);
- void updateSoupRequest(SoupRequest*) const;
- void updateFromSoupRequest(SoupRequest*);
+ GUniquePtr<SoupURI> createSoupURI() const;
- SoupMessageFlags soupMessageFlags() const { return m_soupFlags; }
- void setSoupMessageFlags(SoupMessageFlags soupFlags) { m_soupFlags = soupFlags; }
+ template<class Encoder> void encodeWithPlatformData(Encoder&) const;
+ template<class Decoder> WARN_UNUSED_RETURN bool decodeWithPlatformData(Decoder&);
- // WebPageProxyIdentifier.
- Optional<uint64_t> initiatingPageID() const { return m_initiatingPageID; }
- void setInitiatingPageID(uint64_t pageID) { m_initiatingPageID = pageID; }
+private:
+ friend class ResourceRequestBase;
- GUniquePtr<SoupURI> createSoupURI() const;
+ bool m_acceptEncoding { true };
+ SoupMessageFlags m_soupFlags { static_cast<SoupMessageFlags>(0) };
- template<class Encoder> void encodeWithPlatformData(Encoder&) const;
- template<class Decoder> WARN_UNUSED_RETURN bool decodeWithPlatformData(Decoder&);
+ void updateSoupMessageMembers(SoupMessage*) const;
+ void updateSoupMessageBody(SoupMessage*, BlobRegistryImpl&) const;
+ void doUpdatePlatformRequest() { }
+ void doUpdateResourceRequest() { }
+ void doUpdatePlatformHTTPBody() { }
+ void doUpdateResourceHTTPBody() { }
- private:
- friend class ResourceRequestBase;
+ void doPlatformSetAsIsolatedCopy(const ResourceRequest&) { }
+};
- bool m_acceptEncoding : 1;
- SoupMessageFlags m_soupFlags;
- Optional<uint64_t> m_initiatingPageID;
-
- void updateSoupMessageMembers(SoupMessage*) const;
- void updateSoupMessageBody(SoupMessage*, BlobRegistryImpl&) const;
- void doUpdatePlatformRequest() { }
- void doUpdateResourceRequest() { }
- void doUpdatePlatformHTTPBody() { }
- void doUpdateResourceHTTPBody() { }
-
- void doPlatformSetAsIsolatedCopy(const ResourceRequest&) { }
- };
-
template<class Encoder>
void ResourceRequest::encodeWithPlatformData(Encoder& encoder) const
{
@@ -136,7 +104,6 @@
encoder << m_httpBody->flattenToString();
encoder << static_cast<uint32_t>(m_soupFlags);
- encoder << m_initiatingPageID;
encoder << static_cast<bool>(m_acceptEncoding);
}
@@ -161,12 +128,6 @@
return false;
m_soupFlags = static_cast<SoupMessageFlags>(soupMessageFlags);
- Optional<Optional<uint64_t>> initiatingPageID;
- decoder >> initiatingPageID;
- if (!initiatingPageID)
- return false;
- m_initiatingPageID = *initiatingPageID;
-
bool acceptEncoding;
if (!decoder.decode(acceptEncoding))
return false;
@@ -196,4 +157,3 @@
} // namespace WebCore
-#endif // ResourceRequest_h
Modified: trunk/Source/WebCore/platform/network/soup/ResourceRequestSoup.cpp (272009 => 272010)
--- trunk/Source/WebCore/platform/network/soup/ResourceRequestSoup.cpp 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebCore/platform/network/soup/ResourceRequestSoup.cpp 2021-01-28 12:42:14 UTC (rev 272010)
@@ -200,23 +200,6 @@
#endif
}
-static const char* gSoupRequestInitiatingPageIDKey = "wk-soup-request-initiating-page-id";
-
-void ResourceRequest::updateSoupRequest(SoupRequest* soupRequest) const
-{
- if (m_initiatingPageID) {
- uint64_t* initiatingPageIDPtr = static_cast<uint64_t*>(fastMalloc(sizeof(uint64_t)));
- *initiatingPageIDPtr = *m_initiatingPageID;
- g_object_set_data_full(G_OBJECT(soupRequest), g_intern_static_string(gSoupRequestInitiatingPageIDKey), initiatingPageIDPtr, fastFree);
- }
-}
-
-void ResourceRequest::updateFromSoupRequest(SoupRequest* soupRequest)
-{
- uint64_t* initiatingPageIDPtr = static_cast<uint64_t*>(g_object_get_data(G_OBJECT(soupRequest), gSoupRequestInitiatingPageIDKey));
- m_initiatingPageID = initiatingPageIDPtr ? *initiatingPageIDPtr : 0;
-}
-
unsigned initializeMaximumHTTPConnectionCountPerHost()
{
// Soup has its own queue control; it wants to have all requests
Modified: trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h (272009 => 272010)
--- trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h 2021-01-28 12:42:14 UTC (rev 272010)
@@ -37,7 +37,6 @@
typedef struct _SoupCache SoupCache;
typedef struct _SoupCookieJar SoupCookieJar;
typedef struct _SoupMessage SoupMessage;
-typedef struct _SoupRequest SoupRequest;
typedef struct _SoupSession SoupSession;
namespace WebCore {
Modified: trunk/Source/WebKit/ChangeLog (272009 => 272010)
--- trunk/Source/WebKit/ChangeLog 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebKit/ChangeLog 2021-01-28 12:42:14 UTC (rev 272010)
@@ -1,5 +1,37 @@
2021-01-28 Carlos Garcia Campos <cgar...@igalia.com>
+ [SOUP] Stop using SoupRequest API in preparation for libsoup3
+ https://bugs.webkit.org/show_bug.cgi?id=220764
+
+ Reviewed by Adrian Perez de Castro.
+
+ It's gone in libsoup3, we can just use soup_session_send_async() instead, which is what SoupRequest does
+ internally.
+
+ * NetworkProcess/soup/NetworkDataTaskSoup.cpp:
+ (WebKit::NetworkDataTaskSoup::createRequest): Manually create the SoupMessage. Also connect to content-sniffed
+ signal that it was handled by SoupRequest internally.
+ (WebKit::NetworkDataTaskSoup::clearRequest): Remove the SoupRequest reset and clear m_sniffedContentType.
+ (WebKit::NetworkDataTaskSoup::resume): Use soup_session_send_async(). We need to know the message for passed to
+ the function from the async ready callback, so we use a struct to pass both the task and the message. In case of
+ being suspended the struct was attached to the pending result.
+ (WebKit::NetworkDataTaskSoup::sendRequestCallback): Finish the soup_session_send_async() operation.
+ (WebKit::NetworkDataTaskSoup::didSendRequest): Set the sniffed content type from m_sniffedContentType.
+ (WebKit::NetworkDataTaskSoup::tlsConnectionAcceptCertificate): Use SoupMessage instead of SoupRequest to get the URI.
+ (WebKit::NetworkDataTaskSoup::didSniffContentCallback): Build the sniffed content type and call didSniffContent().
+ (WebKit::NetworkDataTaskSoup::didSniffContent): Save the passed content type.
+ (WebKit::NetworkDataTaskSoup::continueAuthenticate): Use m_currentRequest instead of the SoupRequest to build
+ the authentication error.
+ (WebKit::NetworkDataTaskSoup::skipInputStreamForRedirectionCallback): Pass the failing URL to the ResourceError constructor.
+ (WebKit::NetworkDataTaskSoup::continueHTTPRedirection): Ditto.
+ (WebKit::NetworkDataTaskSoup::readCallback): Ditto.
+ (WebKit::NetworkDataTaskSoup::requestNextPartCallback): Ditto.
+ * NetworkProcess/soup/NetworkDataTaskSoup.h:
+ * WebProcess/InjectedBundle/API/glib/WebKitWebPage.cpp: Stop setting the initiating page ID in the request because
+ it's unused.
+
+2021-01-28 Carlos Garcia Campos <cgar...@igalia.com>
+
Load data URLs in the web process also for synchronous loads
https://bugs.webkit.org/show_bug.cgi?id=220981
Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp (272009 => 272010)
--- trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp 2021-01-28 12:42:14 UTC (rev 272010)
@@ -119,33 +119,19 @@
}
GUniquePtr<SoupURI> soupURI = m_currentRequest.createSoupURI();
- if (!soupURI) {
+ if (!soupURI || !SOUP_URI_VALID_FOR_HTTP(soupURI.get())) {
scheduleFailure(InvalidURLFailure);
return;
}
- GRefPtr<SoupRequest> soupRequest = adoptGRef(soup_session_request_uri(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), soupURI.get(), nullptr));
- if (!soupRequest) {
- scheduleFailure(InvalidURLFailure);
- return;
- }
+ restrictRequestReferrerToOriginIfNeeded(m_currentRequest);
- m_currentRequest.updateSoupRequest(soupRequest.get());
+ m_soupMessage = adoptGRef(soup_message_new_from_uri(SOUP_METHOD_GET, soupURI.get()));
+ m_currentRequest.updateSoupMessage(m_soupMessage.get(), m_session->blobRegistry());
- // HTTP request.
- GRefPtr<SoupMessage> soupMessage = adoptGRef(soup_request_http_get_message(SOUP_REQUEST_HTTP(soupRequest.get())));
- if (!soupMessage) {
- scheduleFailure(InvalidURLFailure);
- return;
- }
-
- restrictRequestReferrerToOriginIfNeeded(m_currentRequest);
-
unsigned messageFlags = SOUP_MESSAGE_NO_REDIRECT;
-
- m_currentRequest.updateSoupMessage(soupMessage.get(), m_session->blobRegistry());
if (m_shouldContentSniff == ContentSniffingPolicy::DoNotSniffContent)
- soup_message_disable_feature(soupMessage.get(), SOUP_TYPE_CONTENT_SNIFFER);
+ soup_message_disable_feature(m_soupMessage.get(), SOUP_TYPE_CONTENT_SNIFFER);
if (m_user.isEmpty() && m_password.isEmpty() && m_storedCredentialsPolicy == StoredCredentialsPolicy::DoNotUse) {
#if SOUP_CHECK_VERSION(2, 57, 1)
messageFlags |= SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE;
@@ -152,9 +138,11 @@
#else
// In case credential is not available and credential storage should not to be used,
// disable authentication manager so that credentials stored in libsoup are not used.
- soup_message_disable_feature(soupMessage.get(), SOUP_TYPE_AUTH_MANAGER);
+ soup_message_disable_feature(m_soupMessage.get(), SOUP_TYPE_AUTH_MANAGER);
#endif
}
+ soup_message_set_flags(m_soupMessage.get(), static_cast<SoupMessageFlags>(soup_message_get_flags(m_soupMessage.get()) | messageFlags));
+ soup_message_set_priority(m_soupMessage.get(), toSoupMessagePriority(m_currentRequest.priority()));
#if ENABLE(RESOURCE_LOAD_STATISTICS)
bool shouldBlockCookies = wasBlockingCookies == WasBlockingCookies::Yes ? true : m_storedCredentialsPolicy == StoredCredentialsPolicy::EphemeralStateless;
@@ -163,33 +151,27 @@
shouldBlockCookies = networkStorageSession->shouldBlockCookies(m_currentRequest, m_frameID, m_pageID, WebCore::ShouldRelaxThirdPartyCookieBlocking::No);
}
if (shouldBlockCookies)
- soup_message_disable_feature(soupMessage.get(), SOUP_TYPE_COOKIE_JAR);
+ soup_message_disable_feature(m_soupMessage.get(), SOUP_TYPE_COOKIE_JAR);
m_isBlockingCookies = shouldBlockCookies;
#endif
#if SOUP_CHECK_VERSION(2, 67, 1)
if ((m_currentRequest.url().protocolIs("https") && !shouldAllowHSTSPolicySetting()) || (m_currentRequest.url().protocolIs("http") && !shouldAllowHSTSProtocolUpgrade()))
- soup_message_disable_feature(soupMessage.get(), SOUP_TYPE_HSTS_ENFORCER);
+ soup_message_disable_feature(m_soupMessage.get(), SOUP_TYPE_HSTS_ENFORCER);
else
g_signal_connect(soup_session_get_feature(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), SOUP_TYPE_HSTS_ENFORCER), "hsts-enforced", G_CALLBACK(hstsEnforced), this);
#endif
// Make sure we have an Accept header for subresources; some sites want this to serve some of their subresources.
- if (!soup_message_headers_get_one(soupMessage->request_headers, "Accept"))
- soup_message_headers_append(soupMessage->request_headers, "Accept", "*/*");
+ if (!soup_message_headers_get_one(m_soupMessage->request_headers, "Accept"))
+ soup_message_headers_append(m_soupMessage->request_headers, "Accept", "*/*");
// In the case of XHR .send() and .send("") explicitly tell libsoup to send a zero content-lenght header
// for consistency with other UA implementations like Firefox. It's done in the backend here instead of
// in XHR code since in XHR CORS checking prevents us from this kind of late header manipulation.
- if ((soupMessage->method == SOUP_METHOD_POST || soupMessage->method == SOUP_METHOD_PUT) && !soupMessage->request_body->length)
- soup_message_headers_set_content_length(soupMessage->request_headers, 0);
+ if ((m_soupMessage->method == SOUP_METHOD_POST || m_soupMessage->method == SOUP_METHOD_PUT) && !m_soupMessage->request_body->length)
+ soup_message_headers_set_content_length(m_soupMessage->request_headers, 0);
- soup_message_set_flags(soupMessage.get(), static_cast<SoupMessageFlags>(soup_message_get_flags(soupMessage.get()) | messageFlags));
- soup_message_set_priority(soupMessage.get(), toSoupMessagePriority(m_currentRequest.priority()));
-
- m_soupRequest = WTFMove(soupRequest);
- m_soupMessage = WTFMove(soupMessage);
-
g_signal_connect(m_soupMessage.get(), "got-headers", G_CALLBACK(gotHeadersCallback), this);
g_signal_connect(m_soupMessage.get(), "wrote-body-data", G_CALLBACK(wroteBodyDataCallback), this);
g_signal_connect(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), "authenticate", G_CALLBACK(authenticateCallback), this);
@@ -196,6 +178,8 @@
g_signal_connect(m_soupMessage.get(), "network-event", G_CALLBACK(networkEventCallback), this);
g_signal_connect(m_soupMessage.get(), "restarted", G_CALLBACK(restartedCallback), this);
g_signal_connect(m_soupMessage.get(), "starting", G_CALLBACK(startingCallback), this);
+ if (m_shouldContentSniff == ContentSniffingPolicy::SniffContent)
+ g_signal_connect(m_soupMessage.get(), "content-sniffed", G_CALLBACK(didSniffContentCallback), this);
}
void NetworkDataTaskSoup::clearRequest()
@@ -207,11 +191,11 @@
stopTimeout();
m_pendingResult = nullptr;
- m_soupRequest = nullptr;
m_file = nullptr;
m_inputStream = nullptr;
m_multipartInputStream = nullptr;
m_downloadOutputStream = nullptr;
+ m_sniffedContentType = { };
g_cancellable_cancel(m_cancellable.get());
m_cancellable = nullptr;
m_isBlockingCookies = false;
@@ -240,9 +224,13 @@
startTimeout();
RefPtr<NetworkDataTaskSoup> protectedThis(this);
- if (m_soupRequest && !m_cancellable) {
+ if (m_soupMessage && !m_cancellable) {
m_cancellable = adoptGRef(g_cancellable_new());
- soup_request_send_async(m_soupRequest.get(), m_cancellable.get(), reinterpret_cast<GAsyncReadyCallback>(sendRequestCallback), protectedThis.leakRef());
+ // We need to protect cancellable here, because soup_session_send_async uses it after emitting SoupSession::request-queued, and we
+ // might cancel the operation in a feature callback emitted on request-queued, for example hsts-enforced.
+ GRefPtr<GCancellable> protectCancellable(m_cancellable);
+ soup_session_send_async(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), m_soupMessage.get(), m_cancellable.get(),
+ reinterpret_cast<GAsyncReadyCallback>(sendRequestCallback), new SendRequestData({ m_soupMessage, WTFMove(protectedThis) }));
return;
}
@@ -259,9 +247,10 @@
readCallback(m_inputStream.get(), pendingResult.get(), protectedThis.leakRef());
else if (m_multipartInputStream)
requestNextPartCallback(m_multipartInputStream.get(), pendingResult.get(), protectedThis.leakRef());
- else if (m_soupRequest)
- sendRequestCallback(m_soupRequest.get(), pendingResult.get(), protectedThis.leakRef());
- else if (m_file) {
+ else if (m_soupMessage) {
+ sendRequestCallback(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), pendingResult.get(),
+ static_cast<SendRequestData*>(g_object_steal_data(G_OBJECT(pendingResult.get()), "wk-send-request-data")));
+ } else if (m_file) {
if (m_response.expectedContentLength() == -1)
enumerateFileChildrenCallback(m_file.get(), pendingResult.get(), protectedThis.leakRef());
else
@@ -321,16 +310,18 @@
m_timeoutSource.stop();
}
-void NetworkDataTaskSoup::sendRequestCallback(SoupRequest* soupRequest, GAsyncResult* result, NetworkDataTaskSoup* task)
+void NetworkDataTaskSoup::sendRequestCallback(SoupSession* soupSession, GAsyncResult* result, SendRequestData* data)
{
- RefPtr<NetworkDataTaskSoup> protectedThis = adoptRef(task);
- if (soupRequest != task->m_soupRequest.get()) {
+ std::unique_ptr<SendRequestData> protectedData(data);
+ auto* task = data->task.get();
+
+ if (task->m_soupMessage && task->m_soupMessage != data->soupMessage.get()) {
// This can happen when the request is cancelled and a new one is started before
// the previous async operation completed. This is common when forcing a redirection
// due to HSTS. We can simply ignore this old request.
#if ASSERT_ENABLED
GUniqueOutPtr<GError> error;
- GRefPtr<GInputStream> inputStream = adoptGRef(soup_request_send_finish(soupRequest, result, &error.outPtr()));
+ GRefPtr<GInputStream> inputStream = adoptGRef(soup_session_send_finish(soupSession, result, &error.outPtr()));
ASSERT(g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED));
#endif
return;
@@ -344,13 +335,16 @@
if (task->state() == State::Suspended) {
ASSERT(!task->m_pendingResult);
task->m_pendingResult = result;
+ g_object_set_data_full(G_OBJECT(task->m_pendingResult.get()), "wk-send-request-data", protectedData.release(), [](gpointer data) {
+ delete static_cast<SendRequestData*>(data);
+ });
return;
}
GUniqueOutPtr<GError> error;
- GRefPtr<GInputStream> inputStream = adoptGRef(soup_request_send_finish(soupRequest, result, &error.outPtr()));
+ GRefPtr<GInputStream> inputStream = adoptGRef(soup_session_send_finish(soupSession, result, &error.outPtr()));
if (error)
- task->didFail(ResourceError::httpError(task->m_soupMessage.get(), error.get(), soupRequest));
+ task->didFail(ResourceError::httpError(data->soupMessage.get(), error.get()));
else
task->didSendRequest(WTFMove(inputStream));
}
@@ -357,8 +351,8 @@
void NetworkDataTaskSoup::didSendRequest(GRefPtr<GInputStream>&& inputStream)
{
- if (m_shouldContentSniff == ContentSniffingPolicy::SniffContent && m_soupMessage->status_code != SOUP_STATUS_NOT_MODIFIED)
- m_response.setSniffedContentType(soup_request_get_content_type(m_soupRequest.get()));
+ if (!m_sniffedContentType.isNull() && m_soupMessage->status_code != SOUP_STATUS_NOT_MODIFIED)
+ m_response.setSniffedContentType(m_sniffedContentType.data());
m_response.updateFromSoupMessage(m_soupMessage.get());
if (m_response.mimeType().isEmpty() && m_soupMessage->status_code != SOUP_STATUS_NOT_MODIFIED)
m_response.setMimeType(MIMETypeRegistry::mimeTypeForPath(m_response.url().path().toString()));
@@ -447,8 +441,8 @@
bool NetworkDataTaskSoup::tlsConnectionAcceptCertificate(GTlsCertificate* certificate, GTlsCertificateFlags tlsErrors)
{
- ASSERT(m_soupRequest);
- URL url = ""
+ ASSERT(m_soupMessage);
+ URL url = ""
auto error = static_cast<NetworkSessionSoup&>(*m_session).soupNetworkSession().checkTLSErrors(url, certificate, tlsErrors);
if (!error)
return true;
@@ -459,6 +453,34 @@
return false;
}
+void NetworkDataTaskSoup::didSniffContentCallback(SoupMessage* soupMessage, const char* contentType, GHashTable* parameters, NetworkDataTaskSoup* task)
+{
+ if (task->state() == State::Canceling || task->state() == State::Completed || !task->m_client)
+ return;
+
+ ASSERT(task->m_soupMessage.get() == soupMessage);
+ if (!parameters) {
+ task->didSniffContent(contentType);
+ return;
+ }
+
+ GString* sniffedType = g_string_new(contentType);
+ GHashTableIter iter;
+ gpointer key, value;
+ g_hash_table_iter_init(&iter, parameters);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ g_string_append(sniffedType, "; ");
+ soup_header_g_string_append_param(sniffedType, static_cast<const char*>(key), static_cast<const char*>(value));
+ }
+ task->didSniffContent(sniffedType->str);
+ g_string_free(sniffedType, TRUE);
+}
+
+void NetworkDataTaskSoup::didSniffContent(CString&& contentType)
+{
+ m_sniffedContentType = WTFMove(contentType);
+}
+
bool NetworkDataTaskSoup::persistentCredentialStorageEnabled() const
{
return static_cast<NetworkSessionSoup&>(*m_session).persistentCredentialStorageEnabled();
@@ -560,7 +582,7 @@
if (disposition == AuthenticationChallengeDisposition::Cancel) {
cancel();
- didFail(cancelledError(m_soupRequest.get()));
+ didFail(cancelledError(m_currentRequest));
return;
}
@@ -598,7 +620,7 @@
GUniqueOutPtr<GError> error;
gssize bytesSkipped = g_input_stream_skip_finish(inputStream, result, &error.outPtr());
if (error)
- task->didFail(ResourceError::genericGError(error.get(), task->m_soupRequest.get()));
+ task->didFail(ResourceError::genericGError(task->m_currentRequest.url(), error.get()));
else if (bytesSkipped > 0)
task->skipInputStreamForRedirection();
else
@@ -666,7 +688,7 @@
static const unsigned maxRedirects = 20;
if (m_redirectCount++ > maxRedirects) {
- didFail(ResourceError::transportError(m_soupRequest.get(), SOUP_STATUS_TOO_MANY_REDIRECTS, "Too many redirects"));
+ didFail(ResourceError::transportError(m_currentRequest.url(), SOUP_STATUS_TOO_MANY_REDIRECTS, "Too many redirects"));
return;
}
@@ -738,7 +760,7 @@
request.setHTTPUserAgent(userAgent);
}
createRequest(WTFMove(request), wasBlockingCookies);
- if (m_soupRequest && m_state != State::Suspended) {
+ if (m_soupMessage && m_state != State::Suspended) {
m_state = State::Suspended;
resume();
}
@@ -763,8 +785,8 @@
GUniqueOutPtr<GError> error;
gssize bytesRead = g_input_stream_read_finish(inputStream, result, &error.outPtr());
if (error) {
- if (task->m_soupRequest)
- task->didFail(ResourceError::genericGError(error.get(), task->m_soupRequest.get()));
+ if (task->m_soupMessage)
+ task->didFail(ResourceError::genericGError(task->m_currentRequest.url(), error.get()));
else if (task->m_file)
task->didFail(ResourceError(g_quark_to_string(error->domain), error->code, task->m_firstRequest.url(), String::fromUTF8(error->message)));
else
@@ -835,7 +857,7 @@
GUniqueOutPtr<GError> error;
GRefPtr<GInputStream> inputStream = adoptGRef(soup_multipart_input_stream_next_part_finish(multipartInputStream, result, &error.outPtr()));
if (error)
- task->didFail(ResourceError::httpError(task->m_soupMessage.get(), error.get(), task->m_soupRequest.get()));
+ task->didFail(ResourceError::httpError(task->m_soupMessage.get(), error.get()));
else if (inputStream)
task->didRequestNextPart(WTFMove(inputStream));
else
Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.h (272009 => 272010)
--- trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.h 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.h 2021-01-28 12:42:14 UTC (rev 272010)
@@ -33,6 +33,7 @@
#include <WebCore/ResourceResponse.h>
#include <wtf/RunLoop.h>
#include <wtf/glib/GRefPtr.h>
+#include <wtf/text/CString.h>
namespace WebKit {
@@ -63,7 +64,13 @@
enum class WasBlockingCookies { No, Yes };
void createRequest(WebCore::ResourceRequest&&, WasBlockingCookies);
void clearRequest();
- static void sendRequestCallback(SoupRequest*, GAsyncResult*, NetworkDataTaskSoup*);
+
+ struct SendRequestData {
+ WTF_MAKE_STRUCT_FAST_ALLOCATED;
+ GRefPtr<SoupMessage> soupMessage;
+ RefPtr<NetworkDataTaskSoup> task;
+ };
+ static void sendRequestCallback(SoupSession*, GAsyncResult*, SendRequestData*);
void didSendRequest(GRefPtr<GInputStream>&&);
void dispatchDidReceiveResponse();
void dispatchDidCompleteWithError(const WebCore::ResourceError&);
@@ -71,6 +78,9 @@
static gboolean tlsConnectionAcceptCertificateCallback(GTlsConnection*, GTlsCertificate*, GTlsCertificateFlags, NetworkDataTaskSoup*);
bool tlsConnectionAcceptCertificate(GTlsCertificate*, GTlsCertificateFlags);
+ static void didSniffContentCallback(SoupMessage*, const char* contentType, GHashTable* parameters, NetworkDataTaskSoup*);
+ void didSniffContent(CString&&);
+
bool persistentCredentialStorageEnabled() const;
void applyAuthenticationToRequest(WebCore::ResourceRequest&);
static void authenticateCallback(SoupSession*, SoupMessage*, SoupAuth*, gboolean retrying, NetworkDataTaskSoup*);
@@ -136,7 +146,6 @@
WebCore::PageIdentifier m_pageID;
State m_state { State::Suspended };
WebCore::ContentSniffingPolicy m_shouldContentSniff;
- GRefPtr<SoupRequest> m_soupRequest;
GRefPtr<SoupMessage> m_soupMessage;
GRefPtr<GFile> m_file;
GRefPtr<GInputStream> m_inputStream;
@@ -147,6 +156,7 @@
WebCore::Credential m_credentialForPersistentStorage;
WebCore::ResourceRequest m_currentRequest;
WebCore::ResourceResponse m_response;
+ CString m_sniffedContentType;
Vector<char> m_readBuffer;
unsigned m_redirectCount { 0 };
uint64_t m_bodyDataTotalBytesSent { 0 };
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/API/glib/WebKitWebPage.cpp (272009 => 272010)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/API/glib/WebKitWebPage.cpp 2021-01-28 12:40:45 UTC (rev 272009)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/API/glib/WebKitWebPage.cpp 2021-01-28 12:42:14 UTC (rev 272010)
@@ -252,7 +252,6 @@
}
webkitURIRequestGetResourceRequest(request.get(), resourceRequest);
- resourceRequest.setInitiatingPageID(page.webPageProxyIdentifier().toUInt64());
API::Dictionary::MapType message;
message.set(String::fromUTF8("Page"), &page);