Ver código fonte

LibWeb: Implement the legacy extracting an encoding AO

Timothy Flynn 2 anos atrás
pai
commit
29d90ccf3b

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

@@ -15,6 +15,7 @@
 #include <LibJS/Heap/Heap.h>
 #include <LibJS/Runtime/VM.h>
 #include <LibRegex/Regex.h>
+#include <LibTextCodec/Decoder.h>
 #include <LibWeb/Fetch/Infrastructure/HTTP.h>
 #include <LibWeb/Fetch/Infrastructure/HTTP/Headers.h>
 #include <LibWeb/Fetch/Infrastructure/HTTP/Methods.h>
@@ -392,6 +393,29 @@ ErrorOr<Optional<MimeSniff::MimeType>> HeaderList::extract_mime_type() const
     return mime_type;
 }
 
+// https://fetch.spec.whatwg.org/#legacy-extract-an-encoding
+StringView legacy_extract_an_encoding(Optional<MimeSniff::MimeType> const& mime_type, StringView fallback_encoding)
+{
+    // 1. If mimeType is failure, then return fallbackEncoding.
+    if (!mime_type.has_value())
+        return fallback_encoding;
+
+    // 2. If mimeType["charset"] does not exist, then return fallbackEncoding.
+    auto charset = mime_type->parameters().get("charset"sv);
+    if (!charset.has_value())
+        return fallback_encoding;
+
+    // 3. Let tentativeEncoding be the result of getting an encoding from mimeType["charset"].
+    auto tentative_encoding = TextCodec::get_standardized_encoding(*charset);
+
+    // 4. If tentativeEncoding is failure, then return fallbackEncoding.
+    if (!tentative_encoding.has_value())
+        return fallback_encoding;
+
+    // 5. Return tentativeEncoding.
+    return *tentative_encoding;
+}
+
 // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set
 ErrorOr<OrderedHashTable<ByteBuffer>> convert_header_names_to_a_sorted_lowercase_set(Span<ReadonlyBytes> header_names)
 {

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

@@ -70,6 +70,7 @@ struct RangeHeaderValue {
 struct ExtractHeaderParseFailure {
 };
 
+[[nodiscard]] StringView legacy_extract_an_encoding(Optional<MimeSniff::MimeType> const& mime_type, StringView fallback_encoding);
 [[nodiscard]] ErrorOr<Optional<Vector<String>>> get_decode_and_split_header_value(ReadonlyBytes);
 [[nodiscard]] ErrorOr<OrderedHashTable<ByteBuffer>> convert_header_names_to_a_sorted_lowercase_set(Span<ReadonlyBytes>);
 [[nodiscard]] bool is_header_name(ReadonlyBytes);