8012625: Incorrect handling of HTTP/1.1 " Expect: 100-continue " in HttpURLConnection
Reviewed-by: alanb, chegar
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu May 16 04:30:45 2013 -0700
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu May 16 17:28:47 2013 +0100
@@ -1225,7 +1225,7 @@
boolean expectContinue = false;
String expects = requests.findValue("Expect");
- if ("100-Continue".equalsIgnoreCase(expects)) {
+ if ("100-Continue".equalsIgnoreCase(expects) && streaming()) {
http.setIgnoreContinue(false);
expectContinue = true;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/www/protocol/http/B8012625.java Thu May 16 17:28:47 2013 +0100
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2013, 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 8012625
+ * @run main B8012625
+ */
+
+import java.net.*;
+import java.io.*;
+
+import java.net.*;
+import java.io.*;
+import java.util.concurrent.*;
+import com.sun.net.httpserver.*;
+
+public class B8012625 implements HttpHandler {
+
+ public static void main (String[] args) throws Exception {
+ B8012625 test = new B8012625();
+ test.run();
+ }
+
+ public void run() throws Exception {
+ String u = "http://127.0.0.1:" + port + "/foo";
+ URL url = new URL(u);
+ HttpURLConnection uc = (HttpURLConnection)url.openConnection();
+ uc.setDoOutput(true);
+ uc.setRequestMethod("POST");
+ uc.addRequestProperty("Expect", "100-Continue");
+ //uc.setFixedLengthStreamingMode(256);
+ System.out.println ("Client: getting outputstream");
+ long before = System.currentTimeMillis();
+ OutputStream os = uc.getOutputStream();
+ long after = System.currentTimeMillis();
+ System.out.println ("Client: writing to outputstream");
+ byte[] buf = new byte[256];
+ os.write(buf);
+ System.out.println ("Client: done writing ");
+ int r = uc.getResponseCode();
+ System.out.println ("Client: received response code " + r);
+ server.stop(1);
+ ex.shutdownNow();
+ if (after - before >= 5000) {
+ throw new RuntimeException("Error: 5 second delay seen");
+ }
+ }
+
+ int port;
+ HttpServer server;
+ ExecutorService ex;
+
+ public B8012625 () throws Exception {
+ server = HttpServer.create(new InetSocketAddress(0), 10);
+ HttpContext ctx = server.createContext("/", this);
+ ex = Executors.newFixedThreadPool(5);
+ server.setExecutor(ex);
+ server.start();
+ port = server.getAddress().getPort();
+ }
+
+ public void handle(HttpExchange ex) throws IOException {
+ String s = ex.getRequestMethod();
+ if (!s.equals("POST")) {
+ ex.getResponseHeaders().set("Allow", "POST");
+ ex.sendResponseHeaders(500, -1);
+ ex.close();
+ return;
+ }
+ System.out.println ("Server: reading request body");
+ InputStream is = ex.getRequestBody();
+ // read request
+ byte[] buf = new byte [1024];
+ while (is.read(buf) != -1) ;
+ is.close();
+ ex.sendResponseHeaders(200, -1);
+ ex.close();
+ }
+}