mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 01:17:35 +00:00
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:
parent
f88fe5dc3f
commit
7590270e13
2 changed files with 26 additions and 0 deletions
|
@ -91,6 +91,17 @@ void Client::handle_request(ByteBuffer raw_request)
|
||||||
auto real_path = path_builder.to_string();
|
auto real_path = path_builder.to_string();
|
||||||
|
|
||||||
if (Core::File::is_directory(real_path)) {
|
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;
|
StringBuilder index_html_path_builder;
|
||||||
index_html_path_builder.append(real_path);
|
index_html_path_builder.append(real_path);
|
||||||
index_html_path_builder.append("/index.html");
|
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);
|
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)
|
void Client::handle_directory_listing(const String& requested_path, const String& real_path, const Core::HttpRequest& request)
|
||||||
{
|
{
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
|
|
|
@ -45,6 +45,7 @@ private:
|
||||||
|
|
||||||
void handle_request(ByteBuffer);
|
void handle_request(ByteBuffer);
|
||||||
void send_response(StringView, const Core::HttpRequest&);
|
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 send_error_response(unsigned code, const StringView& message, const Core::HttpRequest&);
|
||||||
void die();
|
void die();
|
||||||
void log_response(unsigned code, const Core::HttpRequest&);
|
void log_response(unsigned code, const Core::HttpRequest&);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue