test/jdk/java/net/httpclient/HttpRedirectTest.java
author dfuchs
Wed, 23 Oct 2019 15:54:39 +0100
changeset 58758 2b13d126a2d8
permissions -rw-r--r--
8232625: HttpClient redirect policy should be more conservative Summary: When enabled, HttpClient redirect is fixed to drop the body when the request method is changed, and to relay any redirection code it does not understand to the caller. Reviewed-by: chegar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58758
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     1
/*
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     4
 *
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     7
 * published by the Free Software Foundation.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     8
 *
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    13
 * accompanied this code).
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    14
 *
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    18
 *
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    21
 * questions.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    22
 */
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    23
import com.sun.net.httpserver.HttpServer;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    24
import com.sun.net.httpserver.HttpsConfigurator;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    25
import com.sun.net.httpserver.HttpsServer;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    26
import jdk.test.lib.net.SimpleSSLContext;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    27
import org.testng.annotations.BeforeClass;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    28
import org.testng.annotations.AfterClass;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    29
import org.testng.annotations.DataProvider;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    30
import org.testng.annotations.Test;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    31
import static org.testng.Assert.*;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    32
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    33
import javax.net.ssl.SSLContext;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    34
import java.io.IOException;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    35
import java.io.InputStream;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    36
import java.io.OutputStream;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    37
import java.net.InetAddress;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    38
import java.net.InetSocketAddress;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    39
import java.net.Proxy;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    40
import java.net.ProxySelector;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    41
import java.net.SocketAddress;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    42
import java.net.URI;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    43
import java.net.URISyntaxException;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    44
import java.net.http.HttpClient;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    45
import java.net.http.HttpRequest;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    46
import java.net.http.HttpResponse;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    47
import java.nio.charset.StandardCharsets;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    48
import java.util.List;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    49
import java.util.Map;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    50
import java.util.Random;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    51
import java.util.Set;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    52
import java.util.concurrent.CompletableFuture;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    53
import java.util.concurrent.CopyOnWriteArrayList;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    54
import java.util.concurrent.CopyOnWriteArraySet;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    55
import java.util.concurrent.ExecutorService;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    56
import java.util.concurrent.LinkedBlockingQueue;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    57
import java.util.concurrent.ThreadPoolExecutor;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    58
import java.util.concurrent.TimeUnit;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    59
import java.util.concurrent.atomic.AtomicLong;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    60
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    61
/**
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    62
 * @test
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    63
 * @bug 8232625
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    64
 * @summary This test verifies that the HttpClient works correctly when redirecting a post request.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    65
 * @library /test/lib http2/server
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    66
 * @build jdk.test.lib.net.SimpleSSLContext HttpServerAdapters DigestEchoServer HttpRedirectTest
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    67
 * @modules java.net.http/jdk.internal.net.http.common
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    68
 *          java.net.http/jdk.internal.net.http.frame
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    69
 *          java.net.http/jdk.internal.net.http.hpack
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    70
 *          java.logging
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    71
 *          java.base/sun.net.www.http
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    72
 *          java.base/sun.net.www
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    73
 *          java.base/sun.net
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    74
 * @run testng/othervm -Dtest.requiresHost=true
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    75
 *                   -Djdk.httpclient.HttpClient.log=headers
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    76
 *                   -Djdk.internal.httpclient.debug=false
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    77
 *                   HttpRedirectTest
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    78
 *
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    79
 */
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    80
public class HttpRedirectTest implements HttpServerAdapters {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    81
    static final String GET_RESPONSE_BODY = "Lorem ipsum dolor sit amet";
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    82
    static final String REQUEST_BODY = "Here it goes";
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    83
    static final SSLContext context;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    84
    static {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    85
        try {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    86
            context = new SimpleSSLContext().get();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    87
            SSLContext.setDefault(context);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    88
        } catch (Exception x) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    89
            throw new ExceptionInInitializerError(x);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    90
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    91
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    92
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    93
    final AtomicLong requestCounter = new AtomicLong();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    94
    final AtomicLong responseCounter = new AtomicLong();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    95
    HttpTestServer http1Server;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    96
    HttpTestServer http2Server;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    97
    HttpTestServer https1Server;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    98
    HttpTestServer https2Server;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
    99
    DigestEchoServer.TunnelingProxy proxy;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   100
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   101
    URI http1URI;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   102
    URI https1URI;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   103
    URI http2URI;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   104
    URI https2URI;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   105
    InetSocketAddress proxyAddress;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   106
    ProxySelector proxySelector;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   107
    HttpClient client;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   108
    List<CompletableFuture<?>>  futures = new CopyOnWriteArrayList<>();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   109
    Set<URI> pending = new CopyOnWriteArraySet<>();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   110
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   111
    final ExecutorService executor = new ThreadPoolExecutor(12, 60, 10,
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   112
            TimeUnit.SECONDS, new LinkedBlockingQueue<>()); // Shared by HTTP/1.1 servers
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   113
    final ExecutorService clientexec = new ThreadPoolExecutor(6, 12, 1,
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   114
            TimeUnit.SECONDS, new LinkedBlockingQueue<>()); // Used by the client
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   115
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   116
    public HttpClient newHttpClient(ProxySelector ps) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   117
        HttpClient.Builder builder = HttpClient
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   118
                .newBuilder()
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   119
                .sslContext(context)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   120
                .executor(clientexec)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   121
                .followRedirects(HttpClient.Redirect.ALWAYS)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   122
                .proxy(ps);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   123
        return builder.build();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   124
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   125
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   126
    @DataProvider(name="uris")
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   127
    Object[][] testURIs() throws URISyntaxException {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   128
        List<URI> uris = List.of(
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   129
                http1URI.resolve("direct/orig/"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   130
                https1URI.resolve("direct/orig/"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   131
                https1URI.resolve("proxy/orig/"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   132
                http2URI.resolve("direct/orig/"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   133
                https2URI.resolve("direct/orig/"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   134
                https2URI.resolve("proxy/orig/"));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   135
        List<Map.Entry<Integer, String>> redirects = List.of(
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   136
                Map.entry(301, "GET"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   137
                Map.entry(308, "POST"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   138
                Map.entry(302, "GET"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   139
                Map.entry(303, "GET"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   140
                Map.entry(307, "POST"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   141
                Map.entry(300, "DO_NOT_FOLLOW"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   142
                Map.entry(304, "DO_NOT_FOLLOW"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   143
                Map.entry(305, "DO_NOT_FOLLOW"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   144
                Map.entry(306, "DO_NOT_FOLLOW"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   145
                Map.entry(309, "DO_NOT_FOLLOW"),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   146
                Map.entry(new Random().nextInt(90) + 310, "DO_NOT_FOLLOW")
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   147
        );
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   148
        Object[][] tests = new Object[redirects.size() * uris.size()][3];
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   149
        int count = 0;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   150
        for (int i=0; i < uris.size(); i++) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   151
            URI u = uris.get(i);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   152
            for (int j=0; j < redirects.size() ; j++) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   153
                int code = redirects.get(j).getKey();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   154
                String m = redirects.get(j).getValue();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   155
                tests[count][0] = u.resolve(code +"/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   156
                tests[count][1] = code;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   157
                tests[count][2] = m;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   158
                count++;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   159
            }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   160
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   161
        return tests;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   162
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   163
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   164
    @BeforeClass
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   165
    public void setUp() throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   166
        try {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   167
            InetSocketAddress sa = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   168
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   169
            // HTTP/1.1
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   170
            HttpServer server1 = HttpServer.create(sa, 0);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   171
            server1.setExecutor(executor);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   172
            http1Server = HttpTestServer.of(server1);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   173
            http1Server.addHandler(new HttpTestRedirectHandler("http", http1Server),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   174
                    "/HttpRedirectTest/http1/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   175
            http1Server.start();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   176
            http1URI = new URI("http://" + http1Server.serverAuthority() + "/HttpRedirectTest/http1/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   177
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   178
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   179
            // HTTPS/1.1
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   180
            HttpsServer sserver1 = HttpsServer.create(sa, 100);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   181
            sserver1.setExecutor(executor);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   182
            sserver1.setHttpsConfigurator(new HttpsConfigurator(context));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   183
            https1Server = HttpTestServer.of(sserver1);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   184
            https1Server.addHandler(new HttpTestRedirectHandler("https", https1Server),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   185
                    "/HttpRedirectTest/https1/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   186
            https1Server.start();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   187
            https1URI = new URI("https://" + https1Server.serverAuthority() + "/HttpRedirectTest/https1/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   188
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   189
            // HTTP/2.0
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   190
            http2Server = HttpTestServer.of(
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   191
                    new Http2TestServer("localhost", false, 0));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   192
            http2Server.addHandler(new HttpTestRedirectHandler("http", http2Server),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   193
                    "/HttpRedirectTest/http2/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   194
            http2Server.start();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   195
            http2URI = new URI("http://" + http2Server.serverAuthority() + "/HttpRedirectTest/http2/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   196
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   197
            // HTTPS/2.0
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   198
            https2Server = HttpTestServer.of(
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   199
                    new Http2TestServer("localhost", true, 0));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   200
            https2Server.addHandler(new HttpTestRedirectHandler("https", https2Server),
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   201
                    "/HttpRedirectTest/https2/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   202
            https2Server.start();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   203
            https2URI = new URI("https://" + https2Server.serverAuthority() + "/HttpRedirectTest/https2/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   204
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   205
            proxy = DigestEchoServer.createHttpsProxyTunnel(
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   206
                    DigestEchoServer.HttpAuthSchemeType.NONE);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   207
            proxyAddress = proxy.getProxyAddress();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   208
            proxySelector = new HttpProxySelector(proxyAddress);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   209
            client = newHttpClient(proxySelector);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   210
            System.out.println("Setup: done");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   211
        } catch (Exception x) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   212
            tearDown(); throw x;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   213
        } catch (Error e) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   214
            tearDown(); throw e;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   215
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   216
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   217
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   218
    private void testNonIdempotent(URI u, HttpRequest request,
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   219
                                   int code, String method) throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   220
        System.out.println("Testing with " + u);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   221
        CompletableFuture<HttpResponse<String>> respCf =
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   222
                client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   223
        HttpResponse<String> resp = respCf.join();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   224
        if (method.equals("DO_NOT_FOLLOW")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   225
            assertEquals(resp.statusCode(), code, u + ": status code");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   226
        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   227
            assertEquals(resp.statusCode(), 200, u + ": status code");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   228
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   229
        if (method.equals("POST")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   230
            assertEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   231
        } else if (code == 304) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   232
            assertEquals(resp.body(), "", u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   233
        } else if (method.equals("DO_NOT_FOLLOW")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   234
            assertNotEquals(resp.body(), GET_RESPONSE_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   235
            assertNotEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   236
        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   237
            assertEquals(resp.body(), GET_RESPONSE_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   238
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   239
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   240
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   241
    public void testIdempotent(URI u, HttpRequest request,
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   242
                               int code, String method) throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   243
        CompletableFuture<HttpResponse<String>> respCf =
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   244
                client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   245
        HttpResponse<String> resp = respCf.join();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   246
        if (method.equals("DO_NOT_FOLLOW")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   247
            assertEquals(resp.statusCode(), code, u + ": status code");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   248
        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   249
            assertEquals(resp.statusCode(), 200, u + ": status code");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   250
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   251
        if (method.equals("POST")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   252
            assertEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   253
        } else if (code == 304) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   254
            assertEquals(resp.body(), "", u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   255
        } else if (method.equals("DO_NOT_FOLLOW")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   256
            assertNotEquals(resp.body(), GET_RESPONSE_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   257
            assertNotEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   258
        } else if (code == 303) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   259
            assertEquals(resp.body(), GET_RESPONSE_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   260
        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   261
            assertEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   262
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   263
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   264
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   265
    @Test(dataProvider = "uris")
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   266
    public void testPOST(URI uri, int code, String method) throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   267
        URI u = uri.resolve("foo?n=" + requestCounter.incrementAndGet());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   268
        HttpRequest request = HttpRequest.newBuilder(u)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   269
                .POST(HttpRequest.BodyPublishers.ofString(REQUEST_BODY)).build();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   270
        // POST is not considered idempotent.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   271
        testNonIdempotent(u, request, code, method);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   272
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   273
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   274
    @Test(dataProvider = "uris")
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   275
    public void testPUT(URI uri, int code, String method) throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   276
        URI u = uri.resolve("foo?n=" + requestCounter.incrementAndGet());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   277
        System.out.println("Testing with " + u);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   278
        HttpRequest request = HttpRequest.newBuilder(u)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   279
                .PUT(HttpRequest.BodyPublishers.ofString(REQUEST_BODY)).build();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   280
        // PUT is considered idempotent.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   281
        testIdempotent(u, request, code, method);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   282
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   283
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   284
    @Test(dataProvider = "uris")
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   285
    public void testFoo(URI uri, int code, String method) throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   286
        URI u = uri.resolve("foo?n=" + requestCounter.incrementAndGet());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   287
        System.out.println("Testing with " + u);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   288
        HttpRequest request = HttpRequest.newBuilder(u)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   289
                .method("FOO",
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   290
                        HttpRequest.BodyPublishers.ofString(REQUEST_BODY)).build();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   291
        // FOO is considered idempotent.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   292
        testIdempotent(u, request, code, method);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   293
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   294
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   295
    @Test(dataProvider = "uris")
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   296
    public void testGet(URI uri, int code, String method) throws Exception {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   297
        URI u = uri.resolve("foo?n=" + requestCounter.incrementAndGet());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   298
        System.out.println("Testing with " + u);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   299
        HttpRequest request = HttpRequest.newBuilder(u)
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   300
                .method("GET",
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   301
                        HttpRequest.BodyPublishers.ofString(REQUEST_BODY)).build();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   302
        CompletableFuture<HttpResponse<String>> respCf =
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   303
                client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   304
        HttpResponse<String> resp = respCf.join();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   305
        // body will be preserved except for 304 and 303: this is a GET.
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   306
        if (method.equals("DO_NOT_FOLLOW")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   307
            assertEquals(resp.statusCode(), code, u + ": status code");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   308
        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   309
            assertEquals(resp.statusCode(), 200, u + ": status code");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   310
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   311
        if (code == 304) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   312
            assertEquals(resp.body(), "", u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   313
        } else if (method.equals("DO_NOT_FOLLOW")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   314
            assertNotEquals(resp.body(), GET_RESPONSE_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   315
            assertNotEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   316
        } else if (code == 303) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   317
            assertEquals(resp.body(), GET_RESPONSE_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   318
        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   319
            assertEquals(resp.body(), REQUEST_BODY, u + ": body");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   320
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   321
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   322
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   323
    @AfterClass
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   324
    public void tearDown() {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   325
        proxy = stop(proxy, DigestEchoServer.TunnelingProxy::stop);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   326
        http1Server = stop(http1Server, HttpTestServer::stop);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   327
        https1Server = stop(https1Server, HttpTestServer::stop);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   328
        http2Server = stop(http2Server, HttpTestServer::stop);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   329
        https2Server = stop(https2Server, HttpTestServer::stop);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   330
        client = null;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   331
        try {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   332
            executor.awaitTermination(2000, TimeUnit.MILLISECONDS);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   333
        } catch (Throwable x) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   334
        } finally {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   335
            executor.shutdownNow();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   336
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   337
        try {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   338
            clientexec.awaitTermination(2000, TimeUnit.MILLISECONDS);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   339
        } catch (Throwable x) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   340
        } finally {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   341
            clientexec.shutdownNow();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   342
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   343
        System.out.println("Teardown: done");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   344
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   345
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   346
    private interface Stoppable<T> { public void stop(T service) throws Exception; }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   347
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   348
    static <T>  T stop(T service, Stoppable<T> stop) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   349
        try { if (service != null) stop.stop(service); } catch (Throwable x) { };
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   350
        return null;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   351
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   352
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   353
    static class HttpProxySelector extends ProxySelector {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   354
        private static final List<Proxy> NO_PROXY = List.of(Proxy.NO_PROXY);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   355
        private final List<Proxy> proxyList;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   356
        HttpProxySelector(InetSocketAddress proxyAddress) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   357
            proxyList = List.of(new Proxy(Proxy.Type.HTTP, proxyAddress));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   358
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   359
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   360
        @Override
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   361
        public List<Proxy> select(URI uri) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   362
            // our proxy only supports tunneling
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   363
            if (uri.getScheme().equalsIgnoreCase("https")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   364
                if (uri.getPath().contains("/proxy/")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   365
                    return proxyList;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   366
                }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   367
            }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   368
            return NO_PROXY;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   369
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   370
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   371
        @Override
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   372
        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   373
            System.err.println("Connection to proxy failed: " + ioe);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   374
            System.err.println("Proxy: " + sa);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   375
            System.err.println("\tURI: " + uri);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   376
            ioe.printStackTrace();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   377
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   378
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   379
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   380
    public static class HttpTestRedirectHandler implements HttpTestHandler {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   381
        static final AtomicLong respCounter = new AtomicLong();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   382
        final String scheme;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   383
        final HttpTestServer server;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   384
        HttpTestRedirectHandler(String scheme, HttpTestServer server) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   385
            this.scheme = scheme;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   386
            this.server = server;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   387
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   388
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   389
        @Override
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   390
        public void handle(HttpTestExchange t) throws IOException {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   391
            try (InputStream is = t.getRequestBody()) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   392
                byte[] bytes = is.readAllBytes();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   393
                URI u = t.getRequestURI();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   394
                long responseID = Long.parseLong(u.getQuery().substring(2));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   395
                String path = u.getPath();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   396
                int i = path.lastIndexOf('/');
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   397
                String file = path.substring(i+1);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   398
                String parent =  path.substring(0, i);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   399
                int code = 200;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   400
                if (file.equals("foo")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   401
                    i = parent.lastIndexOf("/");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   402
                    code = Integer.parseInt(parent.substring(i+1));
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   403
                }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   404
                String response;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   405
                if (code == 200) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   406
                    if (t.getRequestMethod().equals("GET")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   407
                        if (bytes.length == 0) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   408
                            response = GET_RESPONSE_BODY;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   409
                        } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   410
                            response = new String(bytes, StandardCharsets.UTF_8);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   411
                        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   412
                    } else if (t.getRequestMethod().equals("POST")) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   413
                        response = new String(bytes, StandardCharsets.UTF_8);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   414
                    } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   415
                        response = new String(bytes, StandardCharsets.UTF_8);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   416
                    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   417
                } else if (code < 300 || code > 399) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   418
                    response = "Unexpected code: " + code;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   419
                    code = 400;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   420
                } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   421
                    try {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   422
                        URI reloc = new URI(scheme, server.serverAuthority(), parent + "/bar", u.getQuery(), null);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   423
                        t.getResponseHeaders().addHeader("Location", reloc.toASCIIString());
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   424
                        if (code != 304) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   425
                            response = "Code: " + code;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   426
                        } else response = null;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   427
                    } catch (URISyntaxException x) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   428
                        x.printStackTrace();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   429
                        x.printStackTrace(System.out);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   430
                        code = 400;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   431
                        response = x.toString();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   432
                    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   433
                }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   434
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   435
                System.out.println("Server " + t.getRequestURI() + " sending response " + responseID);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   436
                System.out.println("code: " + code + " body: " + response);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   437
                t.sendResponseHeaders(code, code == 304 ? 0: -1);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   438
                if (code != 304) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   439
                    try (OutputStream os = t.getResponseBody()) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   440
                        bytes = response.getBytes(StandardCharsets.UTF_8);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   441
                        os.write(bytes);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   442
                        os.flush();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   443
                    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   444
                } else {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   445
                    bytes = new byte[0];
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   446
                }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   447
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   448
                System.out.println("\tresp:" + responseID + ": wrote " + bytes.length + " bytes");
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   449
            } catch (Throwable e) {
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   450
                e.printStackTrace();
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   451
                e.printStackTrace(System.out);
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   452
                throw e;
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   453
            }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   454
        }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   455
    }
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   456
2b13d126a2d8 8232625: HttpClient redirect policy should be more conservative
dfuchs
parents:
diff changeset
   457
}