diff --git a/Servers/WebServer/Client.cpp b/Servers/WebServer/Client.cpp index 08a12d89c1..3ad486eeaf 100644 --- a/Servers/WebServer/Client.cpp +++ b/Servers/WebServer/Client.cpp @@ -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; diff --git a/Servers/WebServer/Client.h b/Servers/WebServer/Client.h index 9b0061b133..bf43ffdfbb 100644 --- a/Servers/WebServer/Client.h +++ b/Servers/WebServer/Client.h @@ -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&);