diff -r b7aa58d7f5aa -r 2b13d126a2d8 src/java.net.http/share/classes/jdk/internal/net/http/RedirectFilter.java --- a/src/java.net.http/share/classes/jdk/internal/net/http/RedirectFilter.java Wed Oct 23 15:48:11 2019 +0200 +++ b/src/java.net.http/share/classes/jdk/internal/net/http/RedirectFilter.java Wed Oct 23 15:54:39 2019 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,6 +89,31 @@ } } + private static boolean isRedirecting(int statusCode) { + // < 300: not a redirect codes + if (statusCode < 300) return false; + // 309-399 Unassigned => don't follow + // > 399: not a redirect code + if (statusCode > 308) return false; + switch (statusCode) { + // 300: MultipleChoice => don't follow + case 300: + return false; + // 304: Not Modified => don't follow + case 304: + return false; + // 305: Proxy Redirect => don't follow. + case 305: + return false; + // 306: Unused => don't follow + case 306: + return false; + // 301, 302, 303, 307, 308: OK to follow. + default: + return true; + } + } + /** * Checks to see if a new request is needed and returns it. * Null means response is ok to return to user. @@ -102,13 +127,13 @@ if (rcode == HTTP_NOT_MODIFIED) return null; - if (rcode >= 300 && rcode <= 399) { + if (isRedirecting(rcode)) { URI redir = getRedirectedURI(r.headers()); String newMethod = redirectedMethod(rcode, method); Log.logTrace("response code: {0}, redirected URI: {1}", rcode, redir); if (canRedirect(redir) && ++exchange.numberOfRedirects < max_redirects) { Log.logTrace("redirect to: {0} with method: {1}", redir, newMethod); - return HttpRequestImpl.newInstanceForRedirection(redir, newMethod, request); + return HttpRequestImpl.newInstanceForRedirection(redir, newMethod, request, rcode != 303); } else { Log.logTrace("not redirecting"); return null;