Skip to content

Commit

Permalink
WebServer: Ensure directory listing URLs end with a slash
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
cbsirb authored and awesomekling committed Feb 13, 2020
1 parent f88fe5d commit 7590270
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
25 changes: 25 additions & 0 deletions Servers/WebServer/Client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions Servers/WebServer/Client.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class Client final : public Core::Object {

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&);
Expand Down

0 comments on commit 7590270

Please sign in to comment.