8012625: Incorrect handling of HTTP/1.1 " Expect: 100-continue " in HttpURLConnection
authormichaelm
Thu, 16 May 2013 17:28:47 +0100
changeset 17485 feb8cd6a4c7d
parent 17483 ed57f2f26fb6
child 17486 8708a3d0279d
child 17499 b4cd40a78a26
8012625: Incorrect handling of HTTP/1.1 " Expect: 100-continue " in HttpURLConnection Reviewed-by: alanb, chegar
jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
jdk/test/sun/net/www/protocol/http/B8012625.java
--- 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();
+   }
+}