1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:48:12 +00:00

LibCore+WebServer+LibWeb: Make MIME type guesser take a StringView

This reverts my previous commit in WebServer and fixes the whole issue
in a much better way. Instead of having the MIME type guesser take a
URL (which we don't actually have in the WebServer at that point),
just take a path as a StringView.

Also, make use of the case-insensitive StringView::ends_with() :^)
This commit is contained in:
Andreas Kling 2020-10-21 21:14:16 +02:00
parent 9c14e2ea5d
commit 5043c4a3e5
4 changed files with 15 additions and 25 deletions

View file

@ -70,30 +70,29 @@ void MimeData::set_text(const String& text)
set_data("text/plain", text.to_byte_buffer()); set_data("text/plain", text.to_byte_buffer());
} }
String guess_mime_type_based_on_filename(const URL& url) String guess_mime_type_based_on_filename(const StringView& path)
{ {
String lowercase_url = url.path().to_lowercase(); if (path.ends_with(".pbm", CaseSensitivity::CaseInsensitive))
if (lowercase_url.ends_with(".pbm"))
return "image/xportablebitmap"; return "image/xportablebitmap";
if (url.path().ends_with(".pgm")) if (path.ends_with(".pgm", CaseSensitivity::CaseInsensitive))
return "image/xportablegraymap"; return "image/xportablegraymap";
if (url.path().ends_with(".png")) if (path.ends_with(".png", CaseSensitivity::CaseInsensitive))
return "image/png"; return "image/png";
if (lowercase_url.ends_with(".ppm")) if (path.ends_with(".ppm", CaseSensitivity::CaseInsensitive))
return "image/xportablepixmap"; return "image/xportablepixmap";
if (lowercase_url.ends_with(".gif")) if (path.ends_with(".gif", CaseSensitivity::CaseInsensitive))
return "image/gif"; return "image/gif";
if (lowercase_url.ends_with(".bmp")) if (path.ends_with(".bmp", CaseSensitivity::CaseInsensitive))
return "image/bmp"; return "image/bmp";
if (lowercase_url.ends_with(".jpg") || lowercase_url.ends_with(".jpeg")) if (path.ends_with(".jpg", CaseSensitivity::CaseInsensitive) || path.ends_with(".jpeg", CaseSensitivity::CaseInsensitive))
return "image/jpeg"; return "image/jpeg";
if (lowercase_url.ends_with(".svg")) if (path.ends_with(".svg", CaseSensitivity::CaseInsensitive))
return "image/svg+xml"; return "image/svg+xml";
if (lowercase_url.ends_with(".md")) if (path.ends_with(".md", CaseSensitivity::CaseInsensitive))
return "text/markdown"; return "text/markdown";
if (lowercase_url.ends_with(".html") || lowercase_url.ends_with(".htm")) if (path.ends_with(".html", CaseSensitivity::CaseInsensitive) || path.ends_with(".htm", CaseSensitivity::CaseInsensitive))
return "text/html"; return "text/html";
if (lowercase_url.ends_with("/")) if (path.ends_with("/", CaseSensitivity::CaseInsensitive))
return "text/html"; return "text/html";
return "text/plain"; return "text/plain";
} }

View file

@ -61,6 +61,6 @@ private:
HashMap<String, ByteBuffer> m_data; HashMap<String, ByteBuffer> m_data;
}; };
String guess_mime_type_based_on_filename(const URL&); String guess_mime_type_based_on_filename(const StringView&);
} }

View file

@ -109,7 +109,7 @@ void Resource::did_load(Badge<ResourceLoader>, const ByteBuffer& data, const Has
dbg() << "No Content-Type header to go on! Guessing based on filename..."; dbg() << "No Content-Type header to go on! Guessing based on filename...";
#endif #endif
m_encoding = "utf-8"; // FIXME: This doesn't seem nice. m_encoding = "utf-8"; // FIXME: This doesn't seem nice.
m_mime_type = Core::guess_mime_type_based_on_filename(url()); m_mime_type = Core::guess_mime_type_based_on_filename(url().path());
} }
for_each_client([](auto& client) { for_each_client([](auto& client) {

View file

@ -96,8 +96,6 @@ void Client::handle_request(ByteBuffer raw_request)
path_builder.append(requested_path); path_builder.append(requested_path);
auto real_path = path_builder.to_string(); auto real_path = path_builder.to_string();
String forced_mime_type;
if (Core::File::is_directory(real_path)) { if (Core::File::is_directory(real_path)) {
if (!request.resource().ends_with("/")) { if (!request.resource().ends_with("/")) {
@ -119,7 +117,6 @@ void Client::handle_request(ByteBuffer raw_request)
return; return;
} }
real_path = index_html_path; real_path = index_html_path;
forced_mime_type = "text/html";
} }
auto file = Core::File::construct(real_path); auto file = Core::File::construct(real_path);
@ -128,13 +125,7 @@ void Client::handle_request(ByteBuffer raw_request)
return; return;
} }
String mime_type; send_response(file->read_all(), request, Core::guess_mime_type_based_on_filename(real_path));
if (!forced_mime_type.is_null())
mime_type = forced_mime_type;
else
mime_type = Core::guess_mime_type_based_on_filename(request.url());
send_response(file->read_all(), request, mime_type);
} }
void Client::send_response(StringView response, const HTTP::HttpRequest& request, const String& content_type) void Client::send_response(StringView response, const HTTP::HttpRequest& request, const String& content_type)