1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 09:28:11 +00:00

ProtocolServer: Pass HTTP response headers to the client

We now store the response headers in a download object on the protocol
server side and pass it to the client when finishing up a download.

Response headers are passed as an IPC::Dictionary. :^)
This commit is contained in:
Andreas Kling 2020-05-03 22:20:49 +02:00
parent a83d74b38c
commit eb6e35a1be
18 changed files with 49 additions and 30 deletions

View file

@ -47,14 +47,14 @@ ResourceLoader::ResourceLoader()
{
}
void ResourceLoader::load_sync(const URL& url, Function<void(const ByteBuffer&)> success_callback, Function<void(const String&)> error_callback)
void ResourceLoader::load_sync(const URL& url, Function<void(const ByteBuffer&, const HashMap<String, String>& response_headers)> success_callback, Function<void(const String&)> error_callback)
{
Core::EventLoop loop;
load(
url,
[&](auto& data) {
success_callback(data);
[&](auto& data, auto& response_headers) {
success_callback(data, response_headers);
loop.quit(0);
},
[&](auto& string) {
@ -66,7 +66,7 @@ void ResourceLoader::load_sync(const URL& url, Function<void(const ByteBuffer&)>
loop.exec();
}
void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&)> success_callback, Function<void(const String&)> error_callback)
void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&, const HashMap<String, String>& response_headers)> success_callback, Function<void(const String&)> error_callback)
{
if (is_port_blocked(url.port())) {
dbg() << "ResourceLoader::load: Error: blocked port " << url.port() << " for URL: " << url;
@ -83,7 +83,7 @@ void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&)> succ
data = url.data_payload().to_byte_buffer();
deferred_invoke([data = move(data), success_callback = move(success_callback)](auto&) {
success_callback(data);
success_callback(data, {});
});
return;
}
@ -100,7 +100,7 @@ void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&)> succ
auto data = f->read_all();
deferred_invoke([data = move(data), success_callback = move(success_callback)](auto&) {
success_callback(data);
success_callback(data, {});
});
return;
}
@ -112,7 +112,7 @@ void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&)> succ
error_callback("Failed to initiate load");
return;
}
download->on_finish = [this, success_callback = move(success_callback), error_callback = move(error_callback)](bool success, const ByteBuffer& payload, auto) {
download->on_finish = [this, success_callback = move(success_callback), error_callback = move(error_callback)](bool success, const ByteBuffer& payload, auto, auto& response_headers) {
--m_pending_loads;
if (on_load_counter_change)
on_load_counter_change();
@ -121,7 +121,7 @@ void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&)> succ
error_callback("HTTP load failed");
return;
}
success_callback(ByteBuffer::copy(payload.data(), payload.size()));
success_callback(ByteBuffer::copy(payload.data(), payload.size()), response_headers);
};
++m_pending_loads;
if (on_load_counter_change)