From a602a4c780e76aa26f31d076e569254c163da46b Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sat, 24 Sep 2022 00:28:11 +0100 Subject: [PATCH] LibWeb: Heap-allocate returned Fetch::Infrastructure::{Request,Response} A Request/Response instance should always be heap-allocated and have clear ownership, so let's also wrap it in a NonnullOwnPtr instead of putting them on the stack. --- .../Fetch/Infrastructure/HTTP/Requests.cpp | 4 +-- .../Fetch/Infrastructure/HTTP/Requests.h | 2 +- .../Fetch/Infrastructure/HTTP/Responses.cpp | 30 +++++++++---------- .../Fetch/Infrastructure/HTTP/Responses.h | 14 ++++----- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.cpp b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.cpp index bffcf88a2e..74f4ec7bc9 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.cpp @@ -158,14 +158,14 @@ ErrorOr Request::byte_serialize_origin() const } // https://fetch.spec.whatwg.org/#concept-request-clone -Request Request::clone() const +NonnullOwnPtr Request::clone() const { // To clone a request request, run these steps: // 1. Let newRequest be a copy of request, except for its body. BodyType body; swap(body, const_cast(m_body)); - auto new_request = *this; + auto new_request = adopt_own(*new Infrastructure::Request(*this)); swap(body, const_cast(m_body)); // FIXME: 2. If request’s body is non-null, set newRequest’s body to the result of cloning request’s body. diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h index eb4d74b503..cb92d96ff2 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Requests.h @@ -284,7 +284,7 @@ public: [[nodiscard]] String serialize_origin() const; [[nodiscard]] ErrorOr byte_serialize_origin() const; - [[nodiscard]] Request clone() const; + [[nodiscard]] NonnullOwnPtr clone() const; [[nodiscard]] ErrorOr add_range_reader(u64 first, Optional const& last); diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp index 33d614023e..6483b75ee2 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.cpp @@ -12,19 +12,19 @@ namespace Web::Fetch::Infrastructure { // A network error is a response whose status is always 0, status message is always // the empty byte sequence, header list is always empty, and body is always null. -Response Response::aborted_network_error() +NonnullOwnPtr Response::aborted_network_error() { auto response = network_error(); - response.set_aborted(true); + response->set_aborted(true); return response; } -Response Response::network_error() +NonnullOwnPtr Response::network_error() { - Response response; - response.set_status(0); - response.set_type(Type::Error); - VERIFY(!response.body().has_value()); + auto response = make(); + response->set_status(0); + response->set_type(Type::Error); + VERIFY(!response->body().has_value()); return response; } @@ -85,7 +85,7 @@ FilteredResponse::~FilteredResponse() { } -ErrorOr BasicFilteredResponse::create(Response& internal_response) +ErrorOr> BasicFilteredResponse::create(Response& internal_response) { // A basic filtered response is a filtered response whose type is "basic" and header list excludes // any headers in internal response’s header list whose name is a forbidden response-header name. @@ -95,7 +95,7 @@ ErrorOr BasicFilteredResponse::create(Response& internal_ TRY(header_list.append(header)); } - return BasicFilteredResponse(internal_response, move(header_list)); + return adopt_own(*new BasicFilteredResponse(internal_response, move(header_list))); } BasicFilteredResponse::BasicFilteredResponse(Response& internal_response, HeaderList header_list) @@ -104,7 +104,7 @@ BasicFilteredResponse::BasicFilteredResponse(Response& internal_response, Header { } -ErrorOr CORSFilteredResponse::create(Response& internal_response) +ErrorOr> CORSFilteredResponse::create(Response& internal_response) { // A CORS filtered response is a filtered response whose type is "cors" and header list excludes // any headers in internal response’s header list whose name is not a CORS-safelisted response-header @@ -119,7 +119,7 @@ ErrorOr CORSFilteredResponse::create(Response& internal_re TRY(header_list.append(header)); } - return CORSFilteredResponse(internal_response, move(header_list)); + return adopt_own(*new CORSFilteredResponse(internal_response, move(header_list))); } CORSFilteredResponse::CORSFilteredResponse(Response& internal_response, HeaderList header_list) @@ -128,11 +128,11 @@ CORSFilteredResponse::CORSFilteredResponse(Response& internal_response, HeaderLi { } -OpaqueFilteredResponse OpaqueFilteredResponse::create(Response& internal_response) +NonnullOwnPtr OpaqueFilteredResponse::create(Response& internal_response) { // An opaque-redirect filtered response is a filtered response whose type is "opaqueredirect", // status is 0, status message is the empty byte sequence, header list is empty, and body is null. - return OpaqueFilteredResponse(internal_response); + return adopt_own(*new OpaqueFilteredResponse(internal_response)); } OpaqueFilteredResponse::OpaqueFilteredResponse(Response& internal_response) @@ -140,9 +140,9 @@ OpaqueFilteredResponse::OpaqueFilteredResponse(Response& internal_response) { } -OpaqueRedirectFilteredResponse OpaqueRedirectFilteredResponse::create(Response& internal_response) +NonnullOwnPtr OpaqueRedirectFilteredResponse::create(Response& internal_response) { - return OpaqueRedirectFilteredResponse(internal_response); + return adopt_own(*new OpaqueRedirectFilteredResponse(internal_response)); } OpaqueRedirectFilteredResponse::OpaqueRedirectFilteredResponse(Response& internal_response) diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h index 2ab0fafbcd..0ed41efe31 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Responses.h @@ -44,8 +44,8 @@ public: u64 decoded_size { 0 }; }; - [[nodiscard]] static Response aborted_network_error(); - [[nodiscard]] static Response network_error(); + [[nodiscard]] static NonnullOwnPtr aborted_network_error(); + [[nodiscard]] static NonnullOwnPtr network_error(); Response() = default; virtual ~Response() = default; @@ -157,7 +157,7 @@ private: }; // https://fetch.spec.whatwg.org/#concept-filtered-response -class FilteredResponse : protected Response { +class FilteredResponse : public Response { public: explicit FilteredResponse(Response&); virtual ~FilteredResponse() = 0; @@ -187,7 +187,7 @@ protected: // https://fetch.spec.whatwg.org/#concept-filtered-response-basic class BasicFilteredResponse final : public FilteredResponse { public: - static ErrorOr create(Response&); + static ErrorOr> create(Response&); [[nodiscard]] virtual Type type() const override { return Type::Basic; } [[nodiscard]] virtual HeaderList const& header_list() const override { return m_header_list; } @@ -201,7 +201,7 @@ private: // https://fetch.spec.whatwg.org/#concept-filtered-response-cors class CORSFilteredResponse final : public FilteredResponse { public: - static ErrorOr create(Response&); + static ErrorOr> create(Response&); [[nodiscard]] virtual Type type() const override { return Type::CORS; } [[nodiscard]] virtual HeaderList const& header_list() const override { return m_header_list; } @@ -215,7 +215,7 @@ private: // https://fetch.spec.whatwg.org/#concept-filtered-response-opaque class OpaqueFilteredResponse final : public FilteredResponse { public: - static OpaqueFilteredResponse create(Response&); + static NonnullOwnPtr create(Response&); [[nodiscard]] virtual Type type() const override { return Type::Opaque; } [[nodiscard]] virtual Vector const& url_list() const override { return m_url_list; } @@ -235,7 +235,7 @@ private: // https://fetch.spec.whatwg.org/#concept-filtered-response-opaque-redirect class OpaqueRedirectFilteredResponse final : public FilteredResponse { public: - static OpaqueRedirectFilteredResponse create(Response&); + static NonnullOwnPtr create(Response&); [[nodiscard]] virtual Type type() const override { return Type::OpaqueRedirect; } [[nodiscard]] virtual Status status() const override { return 0; }