diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/downloader/Response.java b/extractor/src/main/java/org/schabi/newpipe/extractor/downloader/Response.java index ac792dc756..c95b86cad4 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/downloader/Response.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/downloader/Response.java @@ -5,6 +5,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; /** * A Data class used to hold the results from requests made by the Downloader implementation. @@ -12,19 +14,24 @@ public class Response { private final int responseCode; private final String responseMessage; - private final Map> responseHeaders; + private final SortedMap> responseHeaders; private final String responseBody; - private final String latestUrl; public Response(final int responseCode, final String responseMessage, - @Nullable final Map> responseHeaders, + @Nonnull final Map> responseHeaders, @Nullable final String responseBody, @Nullable final String latestUrl) { this.responseCode = responseCode; this.responseMessage = responseMessage; - this.responseHeaders = responseHeaders == null ? Collections.emptyMap() : responseHeaders; + + if (responseHeaders instanceof SortedMap) { + this.responseHeaders = (SortedMap>) responseHeaders; + } else { + this.responseHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + this.responseHeaders.putAll(responseHeaders); + } this.responseBody = responseBody == null ? "" : responseBody; this.latestUrl = latestUrl; @@ -71,13 +78,8 @@ public String latestUrl() { */ @Nullable public String getHeader(final String name) { - for (final Map.Entry> headerEntry : responseHeaders.entrySet()) { - final String key = headerEntry.getKey(); - if (key != null && key.equalsIgnoreCase(name) && !headerEntry.getValue().isEmpty()) { - return headerEntry.getValue().get(0); - } - } - - return null; + // Header lookup is case-insensitive + final var values = responseHeaders.getOrDefault(name, Collections.emptyList()); + return values.isEmpty() ? null : values.get(0); } }