Sfoglia il codice sorgente

LibHTTP: Add support for the deflate content encoding

Luke 4 anni fa
parent
commit
6cad2aba5e
1 ha cambiato i file con 27 aggiunte e 0 eliminazioni
  1. 27 0
      Userland/Libraries/LibHTTP/Job.cpp

+ 27 - 0
Userland/Libraries/LibHTTP/Job.cpp

@@ -26,6 +26,7 @@
 
 #include <AK/Debug.h>
 #include <LibCompress/Gzip.h>
+#include <LibCompress/Zlib.h>
 #include <LibCore/TCPSocket.h>
 #include <LibHTTP/HttpResponse.h>
 #include <LibHTTP/Job.h>
@@ -57,6 +58,32 @@ static ByteBuffer handle_content_encoding(const ByteBuffer& buf, const String& c
             dbgln("  Output size: {}", uncompressed.value().size());
         }
 
+        return uncompressed.value();
+    } else if (content_encoding == "deflate") {
+        dbgln_if(JOB_DEBUG, "Job::handle_content_encoding: buf is deflate compressed!");
+
+        // Even though the content encoding is "deflate", it's actually deflate with the zlib wrapper.
+        // https://tools.ietf.org/html/rfc7230#section-4.2.2
+        auto uncompressed = Compress::Zlib::decompress_all(buf);
+        if (!uncompressed.has_value()) {
+            // From the RFC:
+            // "Note: Some non-conformant implementations send the "deflate"
+            //        compressed data without the zlib wrapper."
+            dbgln_if(JOB_DEBUG, "Job::handle_content_encoding: Zlib::decompress_all() failed. Trying DeflateDecompressor::decompress_all()");
+            uncompressed = Compress::DeflateDecompressor::decompress_all(buf);
+
+            if (!uncompressed.has_value()) {
+                dbgln("Job::handle_content_encoding: DeflateDecompressor::decompress_all() failed, returning original buffer.");
+                return buf;
+            }
+        }
+
+        if constexpr (JOB_DEBUG) {
+            dbgln("Job::handle_content_encoding: Deflate decompression successful.");
+            dbgln("  Input size: {}", buf.size());
+            dbgln("  Output size: {}", uncompressed.value().size());
+        }
+
         return uncompressed.value();
     }