summaryrefslogtreecommitdiff
path: root/Services/ProtocolServer
diff options
context:
space:
mode:
authorConrad Pankoff <deoxxa@fknsrs.biz>2020-05-14 18:35:46 +1000
committerAndreas Kling <kling@serenityos.org>2020-05-17 12:41:38 +0200
commitaaa6f90c34dc93bdecfd6a20ed62b93aa2b42d9a (patch)
tree65ec6939525439d423494d8f94ccdb286fa39eba /Services/ProtocolServer
parent308a755c38a35db5ceeb24b85562882747e723cc (diff)
downloadserenity-aaa6f90c34dc93bdecfd6a20ed62b93aa2b42d9a.zip
ProtocolServer: Integrate LibGemini for simple requests
Diffstat (limited to 'Services/ProtocolServer')
-rw-r--r--Services/ProtocolServer/CMakeLists.txt4
-rw-r--r--Services/ProtocolServer/GeminiDownload.cpp63
-rw-r--r--Services/ProtocolServer/GeminiDownload.h45
-rw-r--r--Services/ProtocolServer/GeminiProtocol.cpp49
-rw-r--r--Services/ProtocolServer/GeminiProtocol.h37
-rw-r--r--Services/ProtocolServer/main.cpp2
6 files changed, 199 insertions, 1 deletions
diff --git a/Services/ProtocolServer/CMakeLists.txt b/Services/ProtocolServer/CMakeLists.txt
index 3806d06104..37230778c7 100644
--- a/Services/ProtocolServer/CMakeLists.txt
+++ b/Services/ProtocolServer/CMakeLists.txt
@@ -3,6 +3,8 @@ compile_ipc(ProtocolClient.ipc ProtocolClientEndpoint.h)
set(SOURCES
Download.cpp
+ GeminiDownload.cpp
+ GeminiProtocol.cpp
HttpDownload.cpp
HttpProtocol.cpp
HttpsDownload.cpp
@@ -15,4 +17,4 @@ set(SOURCES
)
serenity_bin(ProtocolServer)
-target_link_libraries(ProtocolServer LibCore LibIPC LibHTTP)
+target_link_libraries(ProtocolServer LibCore LibIPC LibGemini LibHTTP)
diff --git a/Services/ProtocolServer/GeminiDownload.cpp b/Services/ProtocolServer/GeminiDownload.cpp
new file mode 100644
index 0000000000..a08945830c
--- /dev/null
+++ b/Services/ProtocolServer/GeminiDownload.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2020, The SerenityOS developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <LibGemini/GeminiResponse.h>
+#include <LibGemini/GeminiJob.h>
+#include <ProtocolServer/GeminiDownload.h>
+
+GeminiDownload::GeminiDownload(PSClientConnection& client, NonnullRefPtr<Gemini::GeminiJob>&& job)
+ : Download(client)
+ , m_job(job)
+{
+ m_job->on_finish = [this](bool success) {
+ if (auto* response = m_job->response()) {
+ set_payload(response->payload());
+ if (!response->meta().is_empty()) {
+ HashMap<String, String, CaseInsensitiveStringTraits> headers;
+ headers.set("meta", response->meta());
+ set_response_headers(headers);
+ }
+ }
+
+ // signal 100% download progress so any listeners can react
+ // appropriately
+ did_progress(downloaded_size(), downloaded_size());
+
+ did_finish(success);
+ };
+ m_job->on_progress = [this](Optional<u32> total, u32 current) {
+ did_progress(total, current);
+ };
+}
+
+GeminiDownload::~GeminiDownload()
+{
+}
+
+NonnullRefPtr<GeminiDownload> GeminiDownload::create_with_job(Badge<GeminiProtocol>, PSClientConnection& client, NonnullRefPtr<Gemini::GeminiJob>&& job)
+{
+ return adopt(*new GeminiDownload(client, move(job)));
+}
diff --git a/Services/ProtocolServer/GeminiDownload.h b/Services/ProtocolServer/GeminiDownload.h
new file mode 100644
index 0000000000..a5ef599051
--- /dev/null
+++ b/Services/ProtocolServer/GeminiDownload.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2020, The SerenityOS developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <AK/Badge.h>
+#include <LibCore/Forward.h>
+#include <LibGemini/GeminiJob.h>
+#include <ProtocolServer/Download.h>
+
+class GeminiProtocol;
+
+class GeminiDownload final : public Download {
+public:
+ virtual ~GeminiDownload() override;
+ static NonnullRefPtr<GeminiDownload> create_with_job(Badge<GeminiProtocol>, PSClientConnection&, NonnullRefPtr<Gemini::GeminiJob>&&);
+
+private:
+ explicit GeminiDownload(PSClientConnection&, NonnullRefPtr<Gemini::GeminiJob>&&);
+
+ NonnullRefPtr<Gemini::GeminiJob> m_job;
+};
diff --git a/Services/ProtocolServer/GeminiProtocol.cpp b/Services/ProtocolServer/GeminiProtocol.cpp
new file mode 100644
index 0000000000..8eda72eb5b
--- /dev/null
+++ b/Services/ProtocolServer/GeminiProtocol.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2020, The SerenityOS developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <LibGemini/GeminiRequest.h>
+#include <LibGemini/GeminiJob.h>
+#include <ProtocolServer/GeminiDownload.h>
+#include <ProtocolServer/GeminiProtocol.h>
+
+GeminiProtocol::GeminiProtocol()
+ : Protocol("gemini")
+{
+}
+
+GeminiProtocol::~GeminiProtocol()
+{
+}
+
+RefPtr<Download> GeminiProtocol::start_download(PSClientConnection& client, const URL& url)
+{
+ Gemini::GeminiRequest request;
+ request.set_url(url);
+ auto job = Gemini::GeminiJob::construct(request);
+ auto download = GeminiDownload::create_with_job({}, client, (Gemini::GeminiJob&)*job);
+ job->start();
+ return download;
+}
diff --git a/Services/ProtocolServer/GeminiProtocol.h b/Services/ProtocolServer/GeminiProtocol.h
new file mode 100644
index 0000000000..d15e64e327
--- /dev/null
+++ b/Services/ProtocolServer/GeminiProtocol.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2020, The SerenityOS developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <ProtocolServer/Protocol.h>
+
+class GeminiProtocol final : public Protocol {
+public:
+ GeminiProtocol();
+ virtual ~GeminiProtocol() override;
+
+ virtual RefPtr<Download> start_download(PSClientConnection&, const URL&) override;
+};
diff --git a/Services/ProtocolServer/main.cpp b/Services/ProtocolServer/main.cpp
index 9a3da67b78..da307fcefc 100644
--- a/Services/ProtocolServer/main.cpp
+++ b/Services/ProtocolServer/main.cpp
@@ -27,6 +27,7 @@
#include <LibCore/EventLoop.h>
#include <LibCore/LocalServer.h>
#include <LibIPC/ClientConnection.h>
+#include <ProtocolServer/GeminiProtocol.h>
#include <ProtocolServer/HttpProtocol.h>
#include <ProtocolServer/HttpsProtocol.h>
#include <ProtocolServer/PSClientConnection.h>
@@ -52,6 +53,7 @@ int main(int, char**)
return 1;
}
+ (void)*new GeminiProtocol;
(void)*new HttpProtocol;
(void)*new HttpsProtocol;
auto server = Core::LocalServer::construct();