Skip to content

Commit

Permalink
[Curl] Add some missing NetworkLoadMetrics information for curl port
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=247160

Reviewed by Fujii Hironori.

Add some missing NetworkLoadMetrics information for curl port.

* LayoutTests/platform/wincairo/TestExpectations:
* Source/WebCore/platform/network/curl/CurlContext.cpp:
(WebCore::CurlHandle::getNetworkLoadMetrics):
(WebCore::CurlHandle::addExtraNetworkLoadMetrics):
* Source/WebCore/platform/network/curl/CurlRequest.cpp:
(WebCore::CurlRequest::networkLoadMetrics):
* Source/WebCore/platform/network/curl/CurlResourceHandleDelegate.cpp:
(WebCore::CurlResourceHandleDelegate::updateNetworkLoadMetrics):
* Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp:
(WebCore::ResourceHandle::willSendRequest):
* Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp:
(WebKit::NetworkDataTaskCurl::willPerformHTTPRedirection):
(WebKit::NetworkDataTaskCurl::updateNetworkLoadMetrics):
* Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h:

Canonical link: https://commits.webkit.org/256133@main
  • Loading branch information
kshukuwa authored and fujii committed Oct 29, 2022
1 parent c80dcb4 commit d65c8d1
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 8 deletions.
4 changes: 4 additions & 0 deletions LayoutTests/platform/wincairo/TestExpectations
Expand Up @@ -2138,3 +2138,7 @@ webkit.org/b/188980 fast/css/vertical-align-block-elements.html [ ImageOnlyFailu
imported/w3c/web-platform-tests/resource-timing/cross-origin-redirects.html [ Pass ]
imported/w3c/web-platform-tests/resource-timing/cross-origin-start-end-time-with-redirects.html [ Pass ]
imported/w3c/web-platform-tests/resource-timing/resource_reuse.sub.html [ Pass ]
imported/w3c/web-platform-tests/resource-timing/resource_TAO_cross_origin_redirect_chain.html [ Pass ]
imported/w3c/web-platform-tests/resource-timing/resource_timing_same_origin_redirect.html [ Pass ]
imported/w3c/web-platform-tests/resource-timing/resource_timing_TAO_cross_origin_redirect.html [ Pass ]
imported/w3c/web-platform-tests/resource-timing/resource-timing-level1.sub.html [ Pass ]
14 changes: 7 additions & 7 deletions Source/WebCore/platform/network/curl/CurlContext.cpp
Expand Up @@ -793,6 +793,7 @@ std::optional<NetworkLoadMetrics> CurlHandle::getNetworkLoadMetrics(MonotonicTim
double appConnect = 0.0;
double startTransfer = 0.0;
long version = 0;
curl_off_t responseBodySize = 0;

if (!m_handle)
return std::nullopt;
Expand All @@ -817,6 +818,10 @@ std::optional<NetworkLoadMetrics> CurlHandle::getNetworkLoadMetrics(MonotonicTim
if (errorCode != CURLE_OK)
return std::nullopt;

errorCode = curl_easy_getinfo(m_handle, CURLINFO_SIZE_DOWNLOAD_T, &responseBodySize);
if (errorCode != CURLE_OK)
return std::nullopt;

NetworkLoadMetrics networkLoadMetrics;

networkLoadMetrics.fetchStart = startTime;
Expand All @@ -842,6 +847,8 @@ std::optional<NetworkLoadMetrics> CurlHandle::getNetworkLoadMetrics(MonotonicTim
else if (version == CURL_HTTP_VERSION_3)
networkLoadMetrics.protocol = httpVersion3;

networkLoadMetrics.responseBodyBytesReceived = responseBodySize;

return networkLoadMetrics;
}

Expand All @@ -850,7 +857,6 @@ void CurlHandle::addExtraNetworkLoadMetrics(NetworkLoadMetrics& networkLoadMetri
long requestHeaderSize = 0;
curl_off_t requestBodySize = 0;
long responseHeaderSize = 0;
curl_off_t responseBodySize = 0;
char* ip = nullptr;
long port = 0;

Expand All @@ -867,10 +873,6 @@ void CurlHandle::addExtraNetworkLoadMetrics(NetworkLoadMetrics& networkLoadMetri
if (errorCode != CURLE_OK)
return;

errorCode = curl_easy_getinfo(m_handle, CURLINFO_SIZE_DOWNLOAD_T, &responseBodySize);
if (errorCode != CURLE_OK)
return;

errorCode = curl_easy_getinfo(m_handle, CURLINFO_PRIMARY_IP, &ip);
if (errorCode != CURLE_OK)
return;
Expand All @@ -879,8 +881,6 @@ void CurlHandle::addExtraNetworkLoadMetrics(NetworkLoadMetrics& networkLoadMetri
if (errorCode != CURLE_OK)
return;

networkLoadMetrics.responseBodyBytesReceived = responseBodySize;

auto additionalMetrics = AdditionalNetworkLoadMetricsForWebInspector::create();
if (!m_tlsConnectionInfo) {
if (auto ssl = sslConnection()) {
Expand Down
3 changes: 2 additions & 1 deletion Source/WebCore/platform/network/curl/CurlRequest.cpp
Expand Up @@ -756,11 +756,12 @@ NetworkLoadMetrics CurlRequest::networkLoadMetrics()
if (!networkLoadMetrics)
return NetworkLoadMetrics();

networkLoadMetrics->responseBodyDecodedSize = m_totalReceivedSize;

if (m_captureExtraMetrics) {
m_curlHandle->addExtraNetworkLoadMetrics(*networkLoadMetrics);
if (auto* additionalMetrics = networkLoadMetrics->additionalNetworkLoadMetricsForWebInspector.get())
additionalMetrics->requestHeaders = m_requestHeaders;
networkLoadMetrics->responseBodyDecodedSize = m_totalReceivedSize;
}

return WTFMove(*networkLoadMetrics);
Expand Down
Expand Up @@ -181,9 +181,15 @@ void CurlResourceHandleDelegate::curlDidFailWithError(CurlRequest&, ResourceErro

void CurlResourceHandleDelegate::updateNetworkLoadMetrics(NetworkLoadMetrics& networkLoadMetrics)
{
if (!d()->m_startTime)
d()->m_startTime = networkLoadMetrics.fetchStart;

m_handle.checkTAO(m_response);

networkLoadMetrics.redirectStart = m_handle.startTimeBeforeRedirects();
networkLoadMetrics.redirectCount = m_handle.redirectCount();
networkLoadMetrics.failsTAOCheck = m_handle.failsTAOCheck();
networkLoadMetrics.hasCrossOriginRedirect = m_handle.hasCrossOriginRedirect();
}

} // namespace WebCore
Expand Down
6 changes: 6 additions & 0 deletions Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp
Expand Up @@ -482,6 +482,12 @@ void ResourceHandle::willSendRequest()
newRequest.clearHTTPOrigin();
}

// Check if the redirected url is allowed to access the redirecting url's timing information.
if (!hasCrossOriginRedirect() && !WebCore::SecurityOrigin::create(newRequest.url())->canRequest(delegate()->response().url()))
markAsHavingCrossOriginRedirect();

incrementRedirectCount();

ResourceResponse responseCopy = delegate()->response();
client()->willSendRequestAsync(this, WTFMove(newRequest), WTFMove(responseCopy), [this, protectedThis = Ref { *this }] (ResourceRequest&& request) {
continueAfterWillSendRequest(WTFMove(request));
Expand Down
8 changes: 8 additions & 0 deletions Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp
Expand Up @@ -335,6 +335,8 @@ void NetworkDataTaskCurl::willPerformHTTPRedirection()
redirectedURL.setFragmentIdentifier(request.url().fragmentIdentifier());
request.setURL(redirectedURL);

m_hasCrossOriginRedirect = m_hasCrossOriginRedirect || !SecurityOrigin::create(m_response.url())->canRequest(request.url());

// Should not set Referer after a redirect from a secure resource to non-secure one.
if (m_shouldClearReferrerOnHTTPSToHTTPRedirect && !request.url().protocolIs("https"_s) && protocolIs(request.httpReferrer(), "https"_s))
request.clearHTTPReferrer();
Expand Down Expand Up @@ -587,13 +589,19 @@ bool NetworkDataTaskCurl::isThirdPartyRequest(const WebCore::ResourceRequest& re

void NetworkDataTaskCurl::updateNetworkLoadMetrics(WebCore::NetworkLoadMetrics& networkLoadMetrics)
{
if (!m_startTime)
m_startTime = networkLoadMetrics.fetchStart;

if (!m_failsTAOCheck) {
RefPtr<SecurityOrigin> origin = isTopLevelNavigation() ? SecurityOrigin::create(firstRequest().url()) : m_sourceOrigin;
if (origin)
m_failsTAOCheck = !passesTimingAllowOriginCheck(m_response, *origin);
}

networkLoadMetrics.redirectStart = m_startTime;
networkLoadMetrics.redirectCount = m_redirectCount;
networkLoadMetrics.failsTAOCheck = m_failsTAOCheck;
networkLoadMetrics.hasCrossOriginRedirect = m_hasCrossOriginRedirect;
}

} // namespace WebKit
2 changes: 2 additions & 0 deletions Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h
Expand Up @@ -115,7 +115,9 @@ class NetworkDataTaskCurl final : public NetworkDataTask, public WebCore::CurlRe

bool m_blockingCookies { false };

MonotonicTime m_startTime;
bool m_failsTAOCheck { false };
bool m_hasCrossOriginRedirect { false };
};

} // namespace WebKit

0 comments on commit d65c8d1

Please sign in to comment.