/* * Copyright (c) 2001, 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 * 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 * @bug 4333920 * @bug 4394548 * @library /test/lib * @summary Check that chunked encoding response doesn't cause * getInputStream to block until last chunk arrives. * Also regression against NPE in ChunkedInputStream.
*/ import java.net.*; import java.io.*; import java.util.Random; import jdk.test.lib.net.URIBuilder;
publicclass ChunkedEncoding implements Runnable {
ServerSocket ss;
/* * Our "http" server to return a chunked response
*/ publicvoid run() { try {
Socket s = ss.accept();
PrintStream out = new PrintStream( new BufferedOutputStream(
s.getOutputStream() ));
/* * Sleep added to avoid connection reset * on the client side
*/ Thread.sleep(1000);
s.close();
ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
ChunkedEncoding() throws Exception {
/* start the server */
ss = new ServerSocket();
ss.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
(newThread(this)).start(); /* establish http connection to server */
URL url = URIBuilder.newBuilder()
.scheme("http")
.loopback()
.port(ss.getLocalPort())
.path("/foo")
.toURL();
HttpURLConnection http = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
/* * Server should only send headers if TE:trailers * specified - see updated HTTP 1.1 spec.
*/
http.setRequestProperty("TE", "trailers");
/* Time how long the getInputStream takes */ long ts = System.currentTimeMillis();
InputStream in = http.getInputStream(); long te = System.currentTimeMillis();
/* * If getInputStream takes >2 seconds it probably means * that the implementation is waiting for the chunks to * arrive.
*/ if ( (te-ts) > 2000) { thrownew Exception("getInputStream didn't return immediately");
}
/* * Read the stream and checksum it as it arrives
*/ int nread; int cs = 0; byte b[] = newbyte[1024]; do {
nread = in.read(b); if (nread > 0) { for (int i=0; i<nread; i++) {
cs = (cs + b[i]) % 65536;
}
}
} while (nread > 0);
/* * Verify that the checksums match
*/
String trailer = http.getHeaderField("Checksum"); if (trailer == null) { thrownew Exception("Checksum trailer missing from response");
} int rcvd_cs = Integer.parseInt(trailer); if (rcvd_cs != cs) { thrownew Exception("Trailer checksum doesn't equal calculated checksum");
}
http.disconnect();
}
publicstaticvoid main(String args[]) throws Exception { new ChunkedEncoding();
}
}
¤ Dauer der Verarbeitung: 0.26 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.