Просмотр исходного кода

LibWeb: Add Fetch::Infrastructure::Header::from_string_pair() helper

This allows us to use this:

```cpp
auto header = TRY_OR_RETURN_OOM(realm,
    Infrastructure::Header::from_string_pair(name, value));
```

Instead of the somewhat unwieldly:

```cpp
auto header = Infrastructure::Header {
    .name = TRY_OR_RETURN_OOM(realm, ByteBuffer::copy(name.bytes())),
    .value = TRY_OR_RETURN_OOM(realm, ByteBuffer::copy(value.bytes())),
};
```
Linus Groh 2 лет назад
Родитель
Сommit
65f5c7adbc

+ 2 - 8
Userland/Libraries/LibWeb/Fetch/Headers.cpp

@@ -277,10 +277,7 @@ WebIDL::ExceptionOr<void> Headers::fill(HeadersInit const& object)
                     return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "Array must contain header key/value pair" };
 
                 // 2. Append (header’s first item, header’s second item) to headers.
-                auto header = Fetch::Infrastructure::Header {
-                    .name = TRY_OR_RETURN_OOM(realm(), ByteBuffer::copy(entry[0].bytes())),
-                    .value = TRY_OR_RETURN_OOM(realm(), ByteBuffer::copy(entry[1].bytes())),
-                };
+                auto header = TRY_OR_RETURN_OOM(realm(), Infrastructure::Header::from_string_pair(entry[0], entry[1].bytes()));
                 TRY(append(move(header)));
             }
             return {};
@@ -288,10 +285,7 @@ WebIDL::ExceptionOr<void> Headers::fill(HeadersInit const& object)
         // 2. Otherwise, object is a record, then for each key → value in object, append (key, value) to headers.
         [this](OrderedHashMap<String, String> const& object) -> WebIDL::ExceptionOr<void> {
             for (auto const& entry : object) {
-                auto header = Fetch::Infrastructure::Header {
-                    .name = TRY_OR_RETURN_OOM(realm(), ByteBuffer::copy(entry.key.bytes())),
-                    .value = TRY_OR_RETURN_OOM(realm(), ByteBuffer::copy(entry.value.bytes())),
-                };
+                auto header = TRY_OR_RETURN_OOM(realm(), Infrastructure::Header::from_string_pair(entry.key, entry.value));
                 TRY(append(move(header)));
             }
             return {};

+ 8 - 0
Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Headers.cpp

@@ -34,6 +34,14 @@ requires(IsSameIgnoringCV<T, u8>) struct CaseInsensitiveBytesTraits : public Tra
     }
 };
 
+ErrorOr<Header> Header::from_string_pair(StringView name, StringView value)
+{
+    return Header {
+        .name = TRY(ByteBuffer::copy(name.bytes())),
+        .value = TRY(ByteBuffer::copy(value.bytes())),
+    };
+}
+
 // https://fetch.spec.whatwg.org/#header-list-contains
 bool HeaderList::contains(ReadonlyBytes name) const
 {

+ 2 - 0
Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Headers.h

@@ -22,6 +22,8 @@ namespace Web::Fetch::Infrastructure {
 struct Header {
     ByteBuffer name;
     ByteBuffer value;
+
+    static ErrorOr<Header> from_string_pair(StringView, StringView);
 };
 
 // https://fetch.spec.whatwg.org/#concept-header-list

+ 1 - 4
Userland/Libraries/LibWeb/Fetch/Response.cpp

@@ -187,10 +187,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Response>> Response::redirect(JS::VM& vm, S
     auto value = parsed_url.serialize();
 
     // 7. Append (`Location`, value) to responseObject’s response’s header list.
-    auto header = Infrastructure::Header {
-        .name = TRY_OR_RETURN_OOM(realm, ByteBuffer::copy("Location"sv.bytes())),
-        .value = TRY_OR_RETURN_OOM(realm, ByteBuffer::copy(value.bytes())),
-    };
+    auto header = TRY_OR_RETURN_OOM(realm, Infrastructure::Header::from_string_pair("Location"sv, value));
     TRY_OR_RETURN_OOM(realm, response_object->response()->header_list()->append(move(header)));
 
     // 8. Return responseObject.

+ 2 - 5
Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp

@@ -218,11 +218,8 @@ MimeSniff::MimeType XMLHttpRequest::get_response_mime_type() const
     // FIXME: Use an actual HeaderList for XHR headers.
     auto header_list = make_ref_counted<Fetch::Infrastructure::HeaderList>();
     for (auto const& entry : m_response_headers) {
-        auto header = Fetch::Infrastructure::Header {
-            .name = MUST(ByteBuffer::copy(entry.key.bytes())),
-            .value = MUST(ByteBuffer::copy(entry.value.bytes())),
-        };
-        MUST(header_list->append(move(header)));
+        auto header = Fetch::Infrastructure::Header::from_string_pair(entry.key, entry.value).release_value_but_fixme_should_propagate_errors();
+        header_list->append(move(header)).release_value_but_fixme_should_propagate_errors();
     }
 
     // 1. Let mimeType be the result of extracting a MIME type from xhr’s response’s header list.