1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-24 00:45:07 +00:00

ProtocolServer+LibProtocol: Introduce a server for handling downloads

This patch adds ProtocolServer, a server that handles network requests
on behalf of its clients. The first protocol implemented is HTTP.

The idea here is to use a plug-in architecture where any number of
protocols can be added and implemented without having to mess around
with each client program that wants to use the protocol.

A simple client API is provided through LibProtocol::Client. :^)
This commit is contained in:
Andreas Kling 2019-11-23 21:45:33 +01:00
parent 61f611bf3c
commit fd4349a9f2
21 changed files with 475 additions and 0 deletions

View file

@ -0,0 +1,63 @@
#include <ProtocolServer/Download.h>
#include <ProtocolServer/PSClientConnection.h>
#include <ProtocolServer/Protocol.h>
#include <ProtocolServer/ProtocolClientEndpoint.h>
static HashMap<int, RefPtr<PSClientConnection>> s_connections;
PSClientConnection::PSClientConnection(CLocalSocket& socket, int client_id)
: ConnectionNG(*this, socket, client_id)
{
s_connections.set(client_id, *this);
}
PSClientConnection::~PSClientConnection()
{
}
void PSClientConnection::die()
{
s_connections.remove(client_id());
}
OwnPtr<ProtocolServer::IsSupportedProtocolResponse> PSClientConnection::handle(const ProtocolServer::IsSupportedProtocol& message)
{
bool supported = Protocol::find_by_name(message.protocol().to_lowercase());
return make<ProtocolServer::IsSupportedProtocolResponse>(supported);
}
OwnPtr<ProtocolServer::StartDownloadResponse> PSClientConnection::handle(const ProtocolServer::StartDownload& message)
{
URL url(message.url());
ASSERT(url.is_valid());
auto* protocol = Protocol::find_by_name(url.protocol());
ASSERT(protocol);
auto download = protocol->start_download(*this, url);
return make<ProtocolServer::StartDownloadResponse>(download->id());
}
OwnPtr<ProtocolServer::StopDownloadResponse> PSClientConnection::handle(const ProtocolServer::StopDownload& message)
{
auto* download = Download::find_by_id(message.download_id());
bool success = false;
if (download) {
download->stop();
}
return make<ProtocolServer::StopDownloadResponse>(success);
}
void PSClientConnection::did_finish_download(Badge<Download>, Download& download, bool success)
{
post_message(ProtocolClient::DownloadFinished(download.id(), success));
}
void PSClientConnection::did_progress_download(Badge<Download>, Download& download)
{
post_message(ProtocolClient::DownloadProgress(download.id(), download.total_size(), download.downloaded_size()));
}
OwnPtr<ProtocolServer::GreetResponse> PSClientConnection::handle(const ProtocolServer::Greet& message)
{
set_client_pid(message.client_pid());
return make<ProtocolServer::GreetResponse>(getpid(), client_id());
}