瀏覽代碼

LibCore: Add Content-Encoding handling to CHttpJob

Marcel Schneider 5 年之前
父節點
當前提交
c40935e79f
共有 1 個文件被更改,包括 34 次插入1 次删除
  1. 34 1
      Libraries/LibCore/CHttpJob.cpp

+ 34 - 1
Libraries/LibCore/CHttpJob.cpp

@@ -4,8 +4,37 @@
 #include <stdio.h>
 #include <unistd.h>
 
+#include <CGzip.h>
+
 #define CHTTPJOB_DEBUG
 
+static ByteBuffer handle_content_encoding(const ByteBuffer& buf, const String& content_encoding)
+{
+    dbg() << "CHttpJob::handle_content_encoding: buf has content_encoding = " << content_encoding;
+
+    if (content_encoding == "gzip") {
+        if (!Gzip::is_compressed(buf)) {
+            dbg() << "CHttpJob::handle_content_encoding: buf is not gzip compressed!";
+        }
+
+        dbg() << "CHttpJob::handle_content_encoding: buf is gzip compressed!";
+
+        auto uncompressed = Gzip::decompress(buf);
+        if (!uncompressed.has_value()) {
+            dbg() << "CHttpJob::handle_content_encoding: Gzip::decompress() failed. Returning original buffer.";
+            return buf;
+        }
+
+        dbg() << "CHttpJob::handle_content_encoding: Gzip::decompress() successful.\n"
+              << "  Input size = " << buf.size() << "\n"
+              << "  Output size = " << uncompressed.value().size();
+
+        return uncompressed.value();
+    }
+
+    return buf;
+}
+
 CHttpJob::CHttpJob(const CHttpRequest& request)
     : m_request(request)
 {
@@ -113,6 +142,11 @@ void CHttpJob::finish_up()
     }
     m_received_buffers.clear();
 
+    auto content_encoding = m_headers.get("Content-Encoding");
+    if (content_encoding.has_value()) {
+        flattened_buffer = handle_content_encoding(flattened_buffer, content_encoding.value());
+    }
+
     auto response = CHttpResponse::create(m_code, move(m_headers), move(flattened_buffer));
     deferred_invoke([this, response](auto&) {
         did_finish(move(response));
@@ -146,4 +180,3 @@ void CHttpJob::shutdown()
     remove_child(*m_socket);
     m_socket = nullptr;
 }
-