diff --git a/Userland/Libraries/LibWeb/Loader/ImageLoader.cpp b/Userland/Libraries/LibWeb/Loader/ImageLoader.cpp index aa60056331..d777e2da1c 100644 --- a/Userland/Libraries/LibWeb/Loader/ImageLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/ImageLoader.cpp @@ -21,6 +21,12 @@ ImageLoader::ImageLoader(DOM::Element& owner_element) } void ImageLoader::load(const AK::URL& url) +{ + m_redirects_count = 0; + load_without_resetting_redirect_counter(url); +} + +void ImageLoader::load_without_resetting_redirect_counter(AK::URL const& url) { m_loading_state = LoadingState::Loading; @@ -45,6 +51,25 @@ void ImageLoader::resource_did_load() { VERIFY(resource()); + // For 3xx (Redirection) responses, the Location value refers to the preferred target resource for automatically redirecting the request. + auto status_code = resource()->status_code(); + if (status_code.has_value() && *status_code >= 300 && *status_code <= 399) { + auto location = resource()->response_headers().get("Location"); + if (location.has_value()) { + if (m_redirects_count > maximum_redirects_allowed) { + m_redirects_count = 0; + m_loading_state = LoadingState::Failed; + if (on_fail) + on_fail(); + return; + } + m_redirects_count++; + load_without_resetting_redirect_counter(resource()->url().complete_url(location.value())); + return; + } + } + m_redirects_count = 0; + if (!resource()->mime_type().starts_with("image/")) { m_loading_state = LoadingState::Failed; if (on_fail) diff --git a/Userland/Libraries/LibWeb/Loader/ImageLoader.h b/Userland/Libraries/LibWeb/Loader/ImageLoader.h index a5aa248ff8..43fa0da297 100644 --- a/Userland/Libraries/LibWeb/Loader/ImageLoader.h +++ b/Userland/Libraries/LibWeb/Loader/ImageLoader.h @@ -35,6 +35,8 @@ public: Function on_animate; private: + void load_without_resetting_redirect_counter(AK::URL const&); + // ^ImageResourceClient virtual void resource_did_load() override; virtual void resource_did_fail() override; @@ -57,6 +59,7 @@ private: size_t m_loops_completed { 0 }; LoadingState m_loading_state { LoadingState::Loading }; NonnullRefPtr m_timer; + size_t m_redirects_count { 0 }; }; }