Path: blob/master/test/jdk/java/net/httpclient/ByteArrayPublishers.java
41149 views
/*1* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 822296826* @summary ByteArrayPublisher is not thread-safe resulting in broken re-use of HttpRequests27* @run main/othervm ByteArrayPublishers28*/2930import java.net.InetAddress;31import java.net.URI;32import java.net.URISyntaxException;33import java.net.http.HttpClient;34import java.net.http.HttpRequest;35import java.net.http.HttpResponse;36import java.util.ArrayList;37import java.util.concurrent.LinkedBlockingQueue;38import java.util.concurrent.CompletableFuture;3940import com.sun.net.httpserver.HttpExchange;41import com.sun.net.httpserver.HttpServer;4243import java.io.IOException;44import java.net.InetSocketAddress;45import java.nio.charset.StandardCharsets;46import static java.net.http.HttpRequest.BodyPublisher;47import static java.net.http.HttpRequest.BodyPublishers;4849public class ByteArrayPublishers {50private static final BodyPublisher BODY_PUBLISHER =51BodyPublishers.ofByteArray("abcdefghijklmnopqrstuvwxyz".getBytes());5253static int LOOPS = 100;5455public static void main(String[] args) throws Exception {56HttpServer server = null;57try {58InetAddress loopBack = InetAddress.getLoopbackAddress();59String lpBackStr = loopBack.getHostAddress();60InetSocketAddress serverAddr = new InetSocketAddress(loopBack, 0);61server = HttpServer.create(serverAddr, 500);62server.createContext("/", (HttpExchange e) -> {63e.getRequestBody().readAllBytes();64String response = "Hello world";65e.sendResponseHeaders(200, response.length());66e.getResponseBody().write(response.getBytes(StandardCharsets.ISO_8859_1));67e.close();68});69server.start();70var address = server.getAddress();71URI dest = new URI("http://" + lpBackStr + ":"72+ Integer.toString(address.getPort()) + "/");7374HttpClient client = createClient();7576ArrayList<CompletableFuture<HttpResponse<Void>>> futures = new ArrayList<>(LOOPS);77LinkedBlockingQueue<Object> results = new LinkedBlockingQueue<Object>();78for (int i=0;i<LOOPS;i++) {79futures.add(80client.sendAsync(createRequest(dest), HttpResponse.BodyHandlers.discarding())81.handle((v, t) -> {82if (t != null)83results.add(t);84else85results.add(v);86return null;87}));88}8990for (int i=0; i<LOOPS; i++) {91Object o = results.take();92if (o instanceof Exception) {93throw new RuntimeException((Exception)o);94}95}96} finally {97server.stop(1);98}99}100101private static HttpRequest createRequest(URI uri) throws URISyntaxException {102HttpRequest.Builder builder = HttpRequest.newBuilder(uri)103.method("POST", BODY_PUBLISHER)104.version(HttpClient.Version.HTTP_1_1);105builder.header("content-type", "text/plain");106return builder.build();107}108109private static HttpClient createClient() {110return HttpClient.newBuilder()111.version(HttpClient.Version.HTTP_1_1)112.build();113114}115}116117118