jdk/test/java/net/URLConnection/Responses.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/Responses.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2002 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.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.");
+        }
+    }
+}