7157360: HttpURLConnection: HTTP method DELETE doesn't support output
authorarieber
Sat, 22 Jun 2013 08:20:11 +0100
changeset 18541 a974731db859
parent 18540 1f637992378a
child 18542 7b1fa08a804e
7157360: HttpURLConnection: HTTP method DELETE doesn't support output Reviewed-by: chegar
jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java
jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java
--- a/jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java	Sat Jun 22 08:14:54 2013 +0100
+++ b/jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java	Sat Jun 22 08:20:11 2013 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -30,7 +30,7 @@
 
 /**
  * Instances of this class are returned to applications for the purpose of
- * sending user data for a HTTP POST or PUT request. This class is used
+ * sending user data for a HTTP request (excluding TRACE). This class is used
  * when the content-length will be specified in the header of the request.
  * The semantics of ByteArrayOutputStream are extended so that
  * when close() is called, it is no longer possible to write
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Sat Jun 22 08:14:54 2013 +0100
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Sat Jun 22 08:20:11 2013 +0100
@@ -1167,7 +1167,7 @@
 
     /*
      * Allowable input/output sequences:
-     * [interpreted as POST/PUT]
+     * [interpreted as request entity]
      * - get output, [write output,] get input, [read input]
      * - get output, [write output]
      * [interpreted as GET]
@@ -1209,9 +1209,8 @@
             if (method.equals("GET")) {
                 method = "POST"; // Backward compatibility
             }
-            if (!"POST".equals(method) && !"PUT".equals(method) &&
-                "http".equals(url.getProtocol())) {
-                throw new ProtocolException("HTTP method " + method +
+            if ("TRACE".equals(method) && "http".equals(url.getProtocol())) {
+                throw new ProtocolException("HTTP method TRACE" +
                                             " doesn't support output");
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java	Sat Jun 22 08:20:11 2013 +0100
@@ -0,0 +1,118 @@
+/*
+ * 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.
+ */
+
+import com.sun.net.httpserver.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.*;
+
+/*
+ * @test
+ * @bug 7157360
+ * @summary HttpURLConnection: HTTP method DELETE doesn't support output
+ */
+public class PostOnDelete {
+
+    /* string to send */
+    private static String msg = "Hello Server";
+    /* length of the string to verify */
+    private int len = msg.length();
+
+    public static void main(String[] args) throws Exception {
+        new PostOnDelete().runTest();
+    }
+
+    public void runTest() throws Exception {
+        Server s = null;
+        try {
+            s = new Server();
+            s.startServer();
+            URL url = new URL("http://localhost:" + s.getPort());
+            HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
+            urlConnection.setRequestMethod("DELETE");
+            urlConnection.setDoOutput(true);
+            OutputStream os = urlConnection.getOutputStream();
+            os.write(msg.getBytes());
+            os.close();
+            int code = urlConnection.getResponseCode();
+
+            if (code != 200) {
+                throw new RuntimeException("Request entity for DELETE failed!");
+            }
+        } finally {
+            s.stopServer();
+        }
+    }
+
+    class Server {
+        HttpServer server;
+
+        public void startServer() {
+            InetSocketAddress addr = new InetSocketAddress(0);
+            try {
+                server = HttpServer.create(addr, 0);
+            } catch (IOException ioe) {
+                throw new RuntimeException("Server could not be created");
+            }
+
+            server.createContext("/", new EmptyPathHandler());
+            server.start();
+        }
+
+        public int getPort() {
+            return server.getAddress().getPort();
+        }
+
+        public void stopServer() {
+            server.stop(0);
+        }
+    }
+
+    class EmptyPathHandler implements HttpHandler {
+
+        @Override
+        public void handle(HttpExchange exchange) throws IOException {
+            String requestMethod = exchange.getRequestMethod();
+
+            if (requestMethod.equalsIgnoreCase("DELETE")) {
+                InputStream is = exchange.getRequestBody();
+
+                int count = 0;
+                while (is.read() != -1) {
+                    count++;
+                }
+                is.close();
+
+                Headers responseHeaders = exchange.getResponseHeaders();
+                responseHeaders.set("Content-Type", "text/plain");
+                exchange.sendResponseHeaders((count == len) ? 200 : 400, 0);
+                OutputStream os = exchange.getResponseBody();
+                String str = "Hello from server!";
+                os.write(str.getBytes());
+                os.flush();
+                os.close();
+            }
+        }
+    }
+}