Title: [272010] trunk/Source
Revision
272010
Author
carlo...@webkit.org
Date
2021-01-28 04:42:14 -0800 (Thu, 28 Jan 2021)

Log Message

[SOUP] Stop using SoupRequest API in preparation for libsoup3
https://bugs.webkit.org/show_bug.cgi?id=220764

Reviewed by Adrian Perez de Castro.

Source/WebCore:

* 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:

Source/WebKit:

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.

Modified Paths

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);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to