summaryrefslogtreecommitdiff
path: root/Userland/Services/WebServer
diff options
context:
space:
mode:
authorThomas Keppler <winfr34k@gmail.com>2022-12-20 16:46:30 +0100
committerAndreas Kling <kling@serenityos.org>2022-12-26 09:38:03 +0100
commitdc8be499e6e55404a329fac93c663a00961e81bf (patch)
tree70c4ab7fb3738a652a6039425a685d85ac6efc66 /Userland/Services/WebServer
parent1d6528b94b258b031dd5a59287fed6c09bda697f (diff)
downloadserenity-dc8be499e6e55404a329fac93c663a00961e81bf.zip
WebServer: Use new String type internally as much as possible
Here, we try to use the new String type for everything internal, keeping the public interface and the interface to other code the same.
Diffstat (limited to 'Userland/Services/WebServer')
-rw-r--r--Userland/Services/WebServer/Client.cpp31
-rw-r--r--Userland/Services/WebServer/Client.h8
2 files changed, 24 insertions, 15 deletions
diff --git a/Userland/Services/WebServer/Client.cpp b/Userland/Services/WebServer/Client.cpp
index 2291d22851..f9dd8ec2ba 100644
--- a/Userland/Services/WebServer/Client.cpp
+++ b/Userland/Services/WebServer/Client.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2021, Max Wipfli <mail@maxwipfli.ch>
+ * Copyright (c) 2022, Thomas Keppler <serenity@tkeppler.de>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -116,21 +117,23 @@ ErrorOr<bool> Client::handle_request(ReadonlyBytes raw_request)
if (Configuration::the().credentials().has_value()) {
bool has_authenticated = verify_credentials(request.headers());
if (!has_authenticated) {
- TRY(send_error_response(401, request, { "WWW-Authenticate: Basic realm=\"WebServer\", charset=\"UTF-8\"" }));
+ auto const basic_auth_header = TRY(String::from_utf8("WWW-Authenticate: Basic realm=\"WebServer\", charset=\"UTF-8\""sv));
+ Vector<String> headers {};
+ TRY(headers.try_append(basic_auth_header));
+ TRY(send_error_response(401, request, move(headers)));
return false;
}
}
- auto requested_path = LexicalPath::join("/"sv, resource_decoded).string();
+ auto requested_path = TRY(String::from_deprecated_string(LexicalPath::join("/"sv, resource_decoded).string()));
dbgln_if(WEBSERVER_DEBUG, "Canonical requested path: '{}'", requested_path);
StringBuilder path_builder;
path_builder.append(Configuration::the().document_root_path());
path_builder.append(requested_path);
- auto real_path = path_builder.to_deprecated_string();
-
- if (Core::File::is_directory(real_path)) {
+ auto real_path = TRY(path_builder.to_string());
+ if (Core::File::is_directory(real_path.bytes_as_string_view())) {
if (!resource_decoded.ends_with('/')) {
StringBuilder red;
@@ -144,7 +147,7 @@ ErrorOr<bool> Client::handle_request(ReadonlyBytes raw_request)
StringBuilder index_html_path_builder;
index_html_path_builder.append(real_path);
index_html_path_builder.append("/index.html"sv);
- auto index_html_path = index_html_path_builder.to_deprecated_string();
+ auto index_html_path = TRY(index_html_path_builder.to_string());
if (!Core::File::exists(index_html_path)) {
TRY(handle_directory_listing(requested_path, real_path, request));
return true;
@@ -152,7 +155,7 @@ ErrorOr<bool> Client::handle_request(ReadonlyBytes raw_request)
real_path = index_html_path;
}
- auto file = Core::File::construct(real_path);
+ auto file = Core::File::construct(real_path.bytes_as_string_view());
if (!file->open(Core::OpenMode::ReadOnly)) {
TRY(send_error_response(404, request));
return false;
@@ -165,7 +168,11 @@ ErrorOr<bool> Client::handle_request(ReadonlyBytes raw_request)
Core::InputFileStream stream { file };
- TRY(send_response(stream, request, { .type = Core::guess_mime_type_based_on_filename(real_path), .length = TRY(Core::File::size(real_path)) }));
+ auto const info = ContentInfo {
+ .type = TRY(String::from_deprecated_string(Core::guess_mime_type_based_on_filename(real_path.bytes_as_string_view()))),
+ .length = TRY(Core::File::size(real_path.bytes_as_string_view()))
+ };
+ TRY(send_response(stream, request, move(info)));
return true;
}
@@ -255,7 +262,7 @@ static DeprecatedString file_image_data()
return cache;
}
-ErrorOr<void> Client::handle_directory_listing(DeprecatedString const& requested_path, DeprecatedString const& real_path, HTTP::HttpRequest const& request)
+ErrorOr<void> Client::handle_directory_listing(String const& requested_path, String const& real_path, HTTP::HttpRequest const& request)
{
StringBuilder builder;
@@ -278,7 +285,7 @@ ErrorOr<void> Client::handle_directory_listing(DeprecatedString const& requested
builder.append("<hr>\n"sv);
builder.append("<code><table>\n"sv);
- Core::DirIterator dt(real_path);
+ Core::DirIterator dt(real_path.bytes_as_string_view());
Vector<DeprecatedString> names;
while (dt.has_next())
names.append(dt.next_path());
@@ -331,10 +338,10 @@ ErrorOr<void> Client::handle_directory_listing(DeprecatedString const& requested
auto response = builder.to_deprecated_string();
InputMemoryStream stream { response.bytes() };
- return send_response(stream, request, { .type = "text/html", .length = response.length() });
+ return send_response(stream, request, { .type = TRY(String::from_utf8("text/html"sv)), .length = response.length() });
}
-ErrorOr<void> Client::send_error_response(unsigned code, HTTP::HttpRequest const& request, Vector<DeprecatedString> const& headers)
+ErrorOr<void> Client::send_error_response(unsigned code, HTTP::HttpRequest const& request, Vector<String> const& headers)
{
auto reason_phrase = HTTP::HttpResponse::reason_phrase_for_code(code);
diff --git a/Userland/Services/WebServer/Client.h b/Userland/Services/WebServer/Client.h
index 4e23bf563a..c93176ed11 100644
--- a/Userland/Services/WebServer/Client.h
+++ b/Userland/Services/WebServer/Client.h
@@ -1,11 +1,13 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2022, Thomas Keppler <serenity@tkeppler.de>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
+#include <AK/String.h>
#include <LibCore/Object.h>
#include <LibCore/Stream.h>
#include <LibHTTP/Forward.h>
@@ -23,17 +25,17 @@ private:
Client(NonnullOwnPtr<Core::Stream::BufferedTCPSocket>, Core::Object* parent);
struct ContentInfo {
- DeprecatedString type;
+ String type;
size_t length {};
};
ErrorOr<bool> handle_request(ReadonlyBytes);
ErrorOr<void> send_response(InputStream&, HTTP::HttpRequest const&, ContentInfo);
ErrorOr<void> send_redirect(StringView redirect, HTTP::HttpRequest const&);
- ErrorOr<void> send_error_response(unsigned code, HTTP::HttpRequest const&, Vector<DeprecatedString> const& headers = {});
+ ErrorOr<void> send_error_response(unsigned code, HTTP::HttpRequest const&, Vector<String> const& headers = {});
void die();
void log_response(unsigned code, HTTP::HttpRequest const&);
- ErrorOr<void> handle_directory_listing(DeprecatedString const& requested_path, DeprecatedString const& real_path, HTTP::HttpRequest const&);
+ ErrorOr<void> handle_directory_listing(String const& requested_path, String const& real_path, HTTP::HttpRequest const&);
bool verify_credentials(Vector<HTTP::HttpRequest::Header> const&);
NonnullOwnPtr<Core::Stream::BufferedTCPSocket> m_socket;