srctree

Robin Linden parent 4aa738c5 7faa529f
engine: Handle Content-Encoding for non-stylesheet content as well

inlinesplit
engine/engine.cpp added: 41, removed: 2, total 39
@@ -95,6 +95,16 @@ tl::expected<std::unique_ptr<PageState>, NavigationError> Engine::navigate(uri::
}};
}
 
if (!try_decompress_response_body(result.uri_after_redirects, *result.response)) {
return tl::unexpected{NavigationError{
.uri = std::move(result.uri_after_redirects),
.response{protocol::Error{
protocol::ErrorCode::InvalidResponse,
result.response->status_line,
}},
}};
}
 
auto state = std::make_unique<PageState>();
state->uri = std::move(result.uri_after_redirects);
state->response = std::move(result.response.value());
 
engine/engine_test.cpp added: 41, removed: 2, total 39
@@ -377,6 +377,35 @@ int main() {
== end(page->stylesheet.rules));
});
 
// echo -n "<p>hello" | zstd -19 -
std::string zstd_compressed_html =
"\x28\xb5\x2f\xfd\x04\x68\x41\x00\x00\x3c\x70\x3e\x68\x65\x6c\x6c\x6f\x8a\xc4\x1a\x8d"s;
 
etest::test("html, zstd-compressed", [zstd_compressed_html] {
Responses responses;
responses["hax://example.com"s] = Response{
.status_line = {.status_code = 200},
.headers{{"Content-Encoding", "zstd"}},
.body{zstd_compressed_html},
};
engine::Engine e{std::make_unique<FakeProtocolHandler>(responses)};
auto page = e.navigate(uri::Uri::parse("hax://example.com").value()).value();
auto const &body = std::get<dom::Element>(page->dom.html().children.at(1));
expect_eq(body, dom::Element{"body", {}, {dom::Element{"p", {}, {dom::Text{"hello"}}}}});
});
 
etest::test("html, unhandled content-encoding", [zstd_compressed_html] {
Responses responses;
responses["hax://example.com"s] = Response{
.status_line = {.status_code = 200},
.headers{{"Content-Encoding", "aaaaaaaaa"}},
.body{zstd_compressed_html},
};
engine::Engine e{std::make_unique<FakeProtocolHandler>(responses)};
auto page = e.navigate(uri::Uri::parse("hax://example.com").value());
expect_eq(page.error().response.err, protocol::ErrorCode::InvalidResponse);
});
 
etest::test("redirect", [] {
Responses responses;
responses["hax://example.com"s] = Response{