/* * Copyright (c) 2002, 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 4635698 * @summary Check that HttpURLConnection.getResponseCode returns -1 for * malformed status-lines in the http response. */ import java.net.*; import java.io.*; public class Responses { /* * Test cases :- * "Response from server" expected getResponse() and * getResponseMessage() results */ static Object[][] getTests() { return new Object[][] { { "HTTP/1.1 200 OK", "200", "OK" }, { "HTTP/1.1 404 ", "404", null }, { "HTTP/1.1 200", "200", null }, { "HTTP/1.1", "-1", null }, { "Invalid", "-1", null }, { null, "-1" , null }, }; } /* * Simple http server used by test * * GET /<n> HTTP/1.x results in http response with the status line * set to geTests()[<n>][0] -- eg: GET /2 results in a response of * "HTTP/1.1 404 " */ static class HttpServer implements Runnable { ServerSocket ss; public HttpServer() { try { ss = new ServerSocket(0); } catch (IOException ioe) { throw new Error("Unable to create ServerSocket: " + ioe); } } public int port() { return ss.getLocalPort(); } public void shutdown() throws IOException { ss.close(); } public void run() { Object[][] tests = getTests(); try { for (;;) { Socket s = ss.accept(); BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream())); String req = in.readLine(); int pos1 = req.indexOf(' '); int pos2 = req.indexOf(' ', pos1+1); int i = Integer.parseInt(req.substring(pos1+2, pos2)); PrintStream out = new PrintStream( new BufferedOutputStream( s.getOutputStream() )); out.print( tests[i][0] ); out.print("\r\n"); out.print("Content-Length: 0\r\n"); out.print("Connection: close\r\n"); out.print("\r\n"); out.flush(); s.shutdownOutput(); s.close(); } } catch (Exception e) { } } } public static void main(String args[]) throws Exception { /* start the http server */ HttpServer svr = new HttpServer(); (new Thread(svr)).start(); int port = svr.port(); /* * Iterate through each test case and check that getResponseCode * returns the expected result. */ int failures = 0; Object tests[][] = getTests(); for (int i=0; i<tests.length; i++) { System.out.println("******************"); System.out.println("Test with response: >" + tests[i][0] + "<"); URL url = new URL("http://localhost:" + port + "/" + i); HttpURLConnection http = (HttpURLConnection)url.openConnection(); try { // test getResponseCode // int expectedCode = Integer.parseInt((String)tests[i][1]); int actualCode = http.getResponseCode(); if (actualCode != expectedCode) { System.out.println("getResponseCode returned: " + actualCode + ", expected: " + expectedCode); failures++; continue; } // test getResponseMessage // String expectedPhrase = (String)tests[i][2]; String actualPhrase = http.getResponseMessage(); if (actualPhrase == null && expectedPhrase == null) { continue; } if (!actualPhrase.equals(expectedPhrase)) { System.out.println("getResponseMessage returned: " + actualPhrase + ", expected: " + expectedPhrase); } } catch (IOException e) { e.printStackTrace(); failures++; } } /* shutdown http server */ svr.shutdown(); if (failures > 0) { throw new Exception(failures + " sub-test(s) failed."); } } }