blob: e0682643b184bbdc8897f1e0349849f690389480 [file] [log] [blame]
/*
* Copyright (C) 2009 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_URL_RESPONSE_H_
#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_URL_RESPONSE_H_
#include <memory>
#include <optional>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "net/base/auth.h"
#include "net/base/ip_endpoint.h"
#include "net/cert/ct_policy_status.h"
#include "net/http/alternate_protocol_usage.h"
#include "net/http/http_connection_info.h"
#include "third_party/blink/public/common/security/security_style.h"
#include "third_party/blink/public/platform/web_common.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_vector.h"
namespace network {
namespace mojom {
enum class AlternateProtocolUsage;
enum class FetchResponseSource;
enum class FetchResponseType : int32_t;
enum class IPAddressSpace : int32_t;
enum class PrivateNetworkAccessPreflightResult;
class URLResponseHead;
class LoadTimingInfo;
class ServiceWorkerRouterInfo;
} // namespace mojom
} // namespace network
namespace net {
class SSLInfo;
}
namespace blink {
class ResourceResponse;
class WebHTTPHeaderVisitor;
class WebURL;
class BLINK_PLATFORM_EXPORT WebURLResponse {
public:
enum HTTPVersion {
kHTTPVersionUnknown,
kHTTPVersion_0_9,
kHTTPVersion_1_0,
kHTTPVersion_1_1,
kHTTPVersion_2_0
};
static WebURLResponse Create(const WebURL& url,
const network::mojom::URLResponseHead& head,
bool report_security_info,
int request_id);
~WebURLResponse();
WebURLResponse();
WebURLResponse(const WebURLResponse&);
explicit WebURLResponse(const WebURL& current_request_url);
WebURLResponse& operator=(const WebURLResponse&);
bool IsNull() const;
// The current request URL for this resource (the URL after redirects).
// Corresponds to:
// https://fetch.spec.whatwg.org/#concept-request-current-url
//
// It is usually wrong to use this for security checks. See detailed
// documentation at blink::ResourceResponse::CurrentRequestUrl().
WebURL CurrentRequestUrl() const;
void SetCurrentRequestUrl(const WebURL&);
// The response URL of this resource. Corresponds to:
// https://fetch.spec.whatwg.org/#concept-response-url
//
// This may be the empty URL. See detailed documentation at
// blink::ResourceResponse::ResponseUrl().
WebURL ResponseUrl() const;
void SetConnectionID(unsigned);
void SetConnectionReused(bool);
void SetLoadTiming(const network::mojom::LoadTimingInfo&);
base::Time ResponseTime() const;
void SetResponseTime(base::Time);
WebString MimeType() const;
void SetMimeType(const WebString&);
int64_t ExpectedContentLength() const;
void SetExpectedContentLength(int64_t);
void SetTextEncodingName(const WebString&);
HTTPVersion HttpVersion() const;
void SetHttpVersion(HTTPVersion);
int RequestId() const;
void SetRequestId(int);
int HttpStatusCode() const;
void SetHttpStatusCode(int);
WebString HttpStatusText() const;
void SetHttpStatusText(const WebString&);
bool EmittedExtraInfo() const;
void SetEmittedExtraInfo(bool);
WebString HttpHeaderField(const WebString& name) const;
void SetHttpHeaderField(const WebString& name, const WebString& value);
void AddHttpHeaderField(const WebString& name, const WebString& value);
void ClearHttpHeaderField(const WebString& name);
void VisitHttpHeaderFields(WebHTTPHeaderVisitor*) const;
void SetHasMajorCertificateErrors(bool);
void SetHasRangeRequested(bool);
void SetTimingAllowPassed(bool);
bool TimingAllowPassed() const;
void SetSecurityStyle(SecurityStyle);
void SetSSLInfo(const net::SSLInfo&);
void SetAsyncRevalidationRequested(bool);
void SetNetworkAccessed(bool);
#if INSIDE_BLINK
const ResourceResponse& ToResourceResponse() const;
#endif
// Flag whether this request was served from the disk cache entry.
void SetWasCached(bool);
// Flag whether this request was loaded via the SPDY protocol or not.
// SPDY is an experimental web protocol, see http://dev.chromium.org/spdy
bool WasFetchedViaSPDY() const;
void SetWasFetchedViaSPDY(bool);
// Flag whether this request was loaded via a ServiceWorker.
// See network.mojom.URLResponseHead.was_fetched_via_service_worker.
bool WasFetchedViaServiceWorker() const;
void SetWasFetchedViaServiceWorker(bool);
// Set when this request was loaded via a ServiceWorker.
// See network.mojom.URLResponseHead.service_worker_response_source.
network::mojom::FetchResponseSource GetServiceWorkerResponseSource() const;
void SetServiceWorkerResponseSource(network::mojom::FetchResponseSource);
// See network.mojom.URLResponseHead.static_routing_info.
void SetServiceWorkerRouterInfo(
const network::mojom::ServiceWorkerRouterInfo&);
// Flag whether a shared dictionary was used to decompress the response body.
void SetDidUseSharedDictionary(bool);
// https://fetch.spec.whatwg.org/#concept-response-type
void SetType(network::mojom::FetchResponseType);
network::mojom::FetchResponseType GetType() const;
// Pre-computed padding. This should only be non-zero if the type is
// kOpaque. In addition, it is only set for responses provided by a
// service worker FetchEvent handler.
void SetPadding(int64_t);
int64_t GetPadding() const;
// The URL list of the Response object the ServiceWorker passed to
// respondWith().
// See network.mojom.URLResponseHead.url_list_via_service_worker.
void SetUrlListViaServiceWorker(const WebVector<WebURL>&);
// Returns true if the URL list is not empty.
bool HasUrlListViaServiceWorker() const;
// The cache name of the CacheStorage from where the response is served via
// the ServiceWorker. Null if the response isn't from the CacheStorage.
WebString CacheStorageCacheName() const;
void SetCacheStorageCacheName(const WebString&);
// The headers that should be exposed according to CORS. Only guaranteed
// to be set if the response was served by a ServiceWorker.
WebVector<WebString> CorsExposedHeaderNames() const;
void SetCorsExposedHeaderNames(const WebVector<WebString>&);
// Whether service worker navigation preload occurred.
// See network.mojom.URLResponseHead.did_navigation_preload.
void SetDidServiceWorkerNavigationPreload(bool);
// Remote IP endpoint of the socket which fetched this resource.
net::IPEndPoint RemoteIPEndpoint() const;
void SetRemoteIPEndpoint(const net::IPEndPoint&);
// Address space from which this resource was fetched.
network::mojom::IPAddressSpace AddressSpace() const;
void SetAddressSpace(network::mojom::IPAddressSpace);
network::mojom::IPAddressSpace ClientAddressSpace() const;
void SetClientAddressSpace(network::mojom::IPAddressSpace);
// Information about any preflight sent for this resource.
// TODO(https://crbug.com/1268378): Remove this once preflights are enforced.
network::mojom::PrivateNetworkAccessPreflightResult
PrivateNetworkAccessPreflightResult() const;
void SetPrivateNetworkAccessPreflightResult(
network::mojom::PrivateNetworkAccessPreflightResult);
// ALPN negotiated protocol of the socket which fetched this resource.
bool WasAlpnNegotiated() const;
void SetWasAlpnNegotiated(bool);
WebString AlpnNegotiatedProtocol() const;
void SetAlpnNegotiatedProtocol(const WebString&);
void SetAlternateProtocolUsage(net::AlternateProtocolUsage);
bool HasAuthorizationCoveredByWildcardOnPreflight() const;
void SetHasAuthorizationCoveredByWildcardOnPreflight(bool);
// Whether the response could use alternate protocol.
bool WasAlternateProtocolAvailable() const;
void SetWasAlternateProtocolAvailable(bool);
// Information about the type of connection used to fetch this resource.
net::HttpConnectionInfo ConnectionInfo() const;
void SetConnectionInfo(net::HttpConnectionInfo);
// Whether the response was cached and validated over the network.
void SetIsValidated(bool);
// Original size of the response before decompression.
void SetEncodedDataLength(int64_t);
// Original size of the response body before decompression.
int64_t EncodedBodyLength() const;
void SetEncodedBodyLength(uint64_t);
void SetIsSignedExchangeInnerResponse(bool);
void SetIsWebBundleInnerResponse(bool);
void SetWasInPrefetchCache(bool);
void SetWasCookieInRequest(bool);
void SetRecursivePrefetchToken(const std::optional<base::UnguessableToken>&);
// Whether this resource is from a MHTML archive.
bool FromArchive() const;
// Sets any DNS aliases for the requested URL. The alias chain order is
// expected to be in reverse, from canonical name (i.e. address record name)
// through to query name.
void SetDnsAliases(const WebVector<WebString>&);
void SetAuthChallengeInfo(const std::optional<net::AuthChallengeInfo>&);
const std::optional<net::AuthChallengeInfo>& AuthChallengeInfo() const;
// The request's |includeCredentials| value from the "HTTP-network fetch"
// algorithm.
// See: https://fetch.spec.whatwg.org/#concept-http-network-fetch
void SetRequestIncludeCredentials(bool);
bool RequestIncludeCredentials() const;
void SetShouldUseSourceHashForJSCodeCache(bool);
bool ShouldUseSourceHashForJSCodeCache() const;
void SetWasFetchedViaCache(bool);
#if INSIDE_BLINK
protected:
// Permit subclasses to set arbitrary ResourceResponse pointer as
// |resource_response_|. |owned_resource_response_| is not set in this case.
explicit WebURLResponse(ResourceResponse&);
#endif
private:
// If this instance owns a ResourceResponse then |owned_resource_response_|
// is non-null and |resource_response_| points to the ResourceResponse
// instance it contains.
const std::unique_ptr<ResourceResponse> owned_resource_response_;
// Should never be null.
const raw_ptr<ResourceResponse> resource_response_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_URL_RESPONSE_H_