af529be069
Reviewed-by: dfuchs, jpai
180 lines
5.8 KiB
Java
180 lines
5.8 KiB
Java
/*
|
|
* Copyright (c) 2022, 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
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/*
|
|
* @test
|
|
* @library /test/lib
|
|
* @bug 8278067
|
|
* @run main/othervm -Dhttp.keepAlive.time.server=30 KeepAliveProperty long
|
|
* @run main/othervm -Dhttp.keepAlive.time.server=1 KeepAliveProperty short
|
|
* @run main/othervm -ea -Dhttp.keepAlive.time.server=0 KeepAliveProperty short
|
|
*/
|
|
|
|
import java.net.*;
|
|
import java.io.*;
|
|
import java.nio.charset.*;
|
|
import java.util.logging.*;
|
|
import jdk.test.lib.net.URIBuilder;
|
|
import static java.net.Proxy.NO_PROXY;
|
|
|
|
public class KeepAliveProperty {
|
|
|
|
static volatile boolean pass = false;
|
|
static Logger logger = Logger.getLogger("sun.net.www.protocol.http.HttpURLConnection");
|
|
|
|
static class Server extends Thread {
|
|
final ServerSocket server;
|
|
|
|
Server (ServerSocket server) {
|
|
super ();
|
|
this.server = server;
|
|
}
|
|
|
|
void readAll (Socket s) throws IOException {
|
|
byte[] buf = new byte [128];
|
|
int c;
|
|
String request = "";
|
|
InputStream is = s.getInputStream ();
|
|
while ((c=is.read(buf)) > 0) {
|
|
request += new String(buf, 0, c, StandardCharsets.US_ASCII);
|
|
if (request.contains("\r\n\r\n")) {
|
|
return;
|
|
}
|
|
}
|
|
if (c == -1)
|
|
throw new IOException("Socket closed");
|
|
}
|
|
|
|
Socket s = null;
|
|
String BODY;
|
|
String CLEN;
|
|
PrintStream out;
|
|
|
|
public void run() {
|
|
try {
|
|
s = server.accept();
|
|
readAll(s);
|
|
|
|
BODY = "Hello world";
|
|
CLEN = "Content-Length: " + BODY.length() + "\r\n";
|
|
out = new PrintStream(new BufferedOutputStream(s.getOutputStream() ));
|
|
|
|
/* send the header */
|
|
out.print("HTTP/1.1 200 OK\r\n");
|
|
out.print("Content-Type: text/plain; charset=iso-8859-1\r\n");
|
|
out.print(CLEN);
|
|
out.print("\r\n");
|
|
out.print(BODY);
|
|
out.flush();
|
|
} catch (Exception e) {
|
|
pass = false;
|
|
try {
|
|
if (s != null)
|
|
s.close();
|
|
server.close();
|
|
} catch (IOException unused) {}
|
|
return;
|
|
}
|
|
|
|
// second request may legitimately fail
|
|
|
|
try (Socket s2 = s; ServerSocket server2 = server; PrintStream out2 = out) {
|
|
// wait for second request.
|
|
readAll(s2);
|
|
|
|
BODY = "Goodbye world";
|
|
CLEN = "Content-Length: " + BODY.length() + "\r\n";
|
|
|
|
/* send the header */
|
|
out2.print("HTTP/1.1 200 OK\r\n");
|
|
out2.print("Content-Type: text/plain; charset=iso-8859-1\r\n");
|
|
out2.print(CLEN);
|
|
out2.print("\r\n");
|
|
out2.print(BODY);
|
|
out2.flush();
|
|
pass = !expectClose;
|
|
if (!pass) System.out.println("Failed: expected close");
|
|
} catch (Exception e) {
|
|
pass = expectClose;
|
|
if (!pass) System.out.println("Failed: did not expect close");
|
|
}
|
|
}
|
|
}
|
|
|
|
static String fetch(URL url) throws Exception {
|
|
InputStream in = url.openConnection(NO_PROXY).getInputStream();
|
|
String s = "";
|
|
byte b[] = new byte[128];
|
|
int n;
|
|
do {
|
|
n = in.read(b);
|
|
if (n > 0)
|
|
s += new String(b, 0, n, StandardCharsets.US_ASCII);
|
|
} while (n > 0);
|
|
in.close();
|
|
return s;
|
|
}
|
|
|
|
static volatile boolean expectClose;
|
|
|
|
public static void main(String args[]) throws Exception {
|
|
// exercise the logging code
|
|
logger.setLevel(Level.FINEST);
|
|
ConsoleHandler h = new ConsoleHandler();
|
|
h.setLevel(Level.FINEST);
|
|
logger.addHandler(h);
|
|
|
|
expectClose = args[0].equals("short");
|
|
InetAddress loopback = InetAddress.getLoopbackAddress();
|
|
ServerSocket ss = new ServerSocket();
|
|
ss.bind(new InetSocketAddress(loopback, 0));
|
|
Server s = new Server(ss);
|
|
s.start();
|
|
|
|
URL url = URIBuilder.newBuilder()
|
|
.scheme("http")
|
|
.loopback()
|
|
.port(ss.getLocalPort())
|
|
.toURL();
|
|
System.out.println("URL: " + url);
|
|
|
|
if (!fetch(url).equals("Hello world"))
|
|
throw new RuntimeException("Failed on first request");
|
|
|
|
// Wait a while to see if connection is closed
|
|
Thread.sleep(3 * 1000);
|
|
|
|
try {
|
|
if (!fetch(url).equals("Goodbye world"))
|
|
throw new RuntimeException("Failed on second request");
|
|
} catch (Exception e) {
|
|
if (!expectClose)
|
|
throw e;
|
|
}
|
|
s.join();
|
|
|
|
if (!pass)
|
|
throw new RuntimeException("Failed in server");
|
|
}
|
|
}
|