7157360: HttpURLConnection: HTTP method DELETE doesn't support output
Reviewed-by: chegar
This commit is contained in:
parent
a294d4b6a4
commit
14ddb9177d
@ -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
|
||||
|
@ -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");
|
||||
}
|
||||
|
||||
|
118
jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java
Normal file
118
jdk/test/sun/net/www/http/HttpURLConnection/PostOnDelete.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user