diff --git a/jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java b/jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java index eedd77ec193..df2dc8efc87 100644 --- a/jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java +++ b/jdk/src/share/classes/sun/net/www/http/PosterOutputStream.java @@ -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 @@ import java.net.*; /** * 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 diff --git a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java index 76745e0c022..201e236210c 100644 --- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java +++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java @@ -1167,7 +1167,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection { /* * 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 @@ public class HttpURLConnection extends java.net.HttpURLConnection { 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"); } diff --git a/jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java b/jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java new file mode 100644 index 00000000000..07d353cba85 --- /dev/null +++ b/jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java @@ -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(); + } + } + } +}