WebServer: Ensure directory listing URLs end with a slash

We will now send a redirect (301) if a directory listing is requested and the
request URL doesn't end with a slash character. This makes relative file URLs
that we generate in directory listings actually work as expected.
This commit is contained in:
Bogdan 2020-02-13 13:22:00 +02:00 committed by Andreas Kling
parent f88fe5dc3f
commit 7590270e13
Notes: sideshowbarker 2024-07-19 09:21:47 +09:00
2 changed files with 26 additions and 0 deletions

View file

@ -91,6 +91,17 @@ void Client::handle_request(ByteBuffer raw_request)
auto real_path = path_builder.to_string();
if (Core::File::is_directory(real_path)) {
if (!request.resource().ends_with("/")) {
StringBuilder red;
red.append(requested_path);
red.append("/");
send_redirect(red.to_string(), request);
return;
}
StringBuilder index_html_path_builder;
index_html_path_builder.append(real_path);
index_html_path_builder.append("/index.html");
@ -125,6 +136,20 @@ void Client::send_response(StringView response, const Core::HttpRequest& request
log_response(200, request);
}
void Client::send_redirect(StringView redirect_path, const Core::HttpRequest& request)
{
StringBuilder builder;
builder.append("HTTP/1.0 301 Moved Permanently\r\n");
builder.append("Location: ");
builder.append(redirect_path);
builder.append("\r\n");
builder.append("\r\n");
m_socket->write(builder.to_string());
log_response(301, request);
}
void Client::handle_directory_listing(const String& requested_path, const String& real_path, const Core::HttpRequest& request)
{
StringBuilder builder;

View file

@ -45,6 +45,7 @@ private:
void handle_request(ByteBuffer);
void send_response(StringView, const Core::HttpRequest&);
void send_redirect(StringView redirect, const Core::HttpRequest& request);
void send_error_response(unsigned code, const StringView& message, const Core::HttpRequest&);
void die();
void log_response(unsigned code, const Core::HttpRequest&);