jdk/test/java/net/URLConnection/ResendPostBody.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/URLConnection/ResendPostBody.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2001-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 4361492
+ * @summary HTTPUrlConnection does not receive binary data correctly
+ * @run main/timeout=20 ResendPostBody
+ */
+
+import java.io.*;
+import java.net.*;
+
+/*
+ * This test does the following:
+ * 1. client opens HTTP connection to server
+ * 2. client sends POST with a body containing "ZZZ"
+ * 3. server waits for POST and closes connection without replying
+ * 4. client should re-open the connection and re-send the POST
+ * 5. <bug>The client forgets to re-send the body with the POST
+ *    The server hangs waiting for the body</bug>
+ *
+ *    <bugfixed>The client sends the body. The server reads it and the
+ *     test terminates normally </bugfixed>
+ */
+
+public class ResendPostBody {
+
+    static class Server extends Thread {
+
+        InputStream     in;
+        OutputStream out;
+        Socket  sock;
+        StringBuffer response;
+        ServerSocket server;
+
+        Server (ServerSocket s) throws IOException
+        {
+            server = s;
+        }
+
+        void waitFor (String s) throws IOException
+        {
+            byte[] w = s.getBytes ();
+            for(int c=0; c<w.length; c++ ) {
+                byte expected = w[c];
+                int b = in.read();
+                if (b == -1) {
+                    acceptConn ();
+                }
+                if ((byte)b != expected) {
+                    c = 0;
+                }
+            }
+        }
+
+        boolean done = false;
+
+        public synchronized boolean finished () {
+            return done;
+        }
+
+        public synchronized void setFinished (boolean b) {
+            done = b;
+        }
+
+        void acceptConn () throws IOException
+        {
+            sock = server.accept ();
+            in = sock.getInputStream ();
+            out = sock.getOutputStream ();
+        }
+
+        public void run () {
+            try {
+                response = new StringBuffer (1024);
+                acceptConn ();
+                waitFor ("POST");
+                waitFor ("ZZZ");
+                Thread.sleep (500);
+                sock.close ();
+                acceptConn ();
+                waitFor ("POST");
+                waitFor ("ZZZ");
+                response.append ("HTTP/1.1 200 OK\r\n");
+                response.append ("Server: Microsoft-IIS/5.0");
+                response.append ("Date: Wed, 26 Jul 2000 14:17:04 GMT\r\n\r\n");
+                out.write (response.toString().getBytes());
+                while (!finished()) {
+                    Thread.sleep (1000);
+                }
+            } catch (Exception e) {
+                System.err.println ("Server Exception: " + e);
+            }
+        }
+    }
+
+    ServerSocket ss;
+    Server server;
+
+    public static void main(String[] args) throws Exception {
+        try {
+            if (args.length == 1 && args[0].equals ("-i")) {
+                System.out.println ("Press return when ready");
+                System.in.read ();
+                System.out.println ("Done");
+            }
+            ResendPostBody t = new ResendPostBody ();
+            t. execute ();
+        } catch (IOException  e) {
+            System.out.println ("IOException");
+        }
+    }
+
+    public void execute () throws Exception {
+
+     byte b[] = "X=ABCDEFGHZZZ".getBytes();
+
+        ss = new ServerSocket (0);
+        server = new Server (ss);
+        server.start ();
+        /* Get the URL */
+
+        String s = "http://localhost:"+ss.getLocalPort()+"/test";
+        URL url = new URL(s);
+        HttpURLConnection conURL =  (HttpURLConnection)url.openConnection();
+
+        conURL.setDoOutput(true);
+        conURL.setDoInput(true);
+        conURL.setAllowUserInteraction(false);
+        conURL.setUseCaches(false);
+        conURL.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        conURL.setRequestProperty("Content-Length", ""+b.length);
+        conURL.setRequestProperty("Connection", "Close");
+
+        /* POST some data */
+
+        DataOutputStream OutStream = new DataOutputStream(conURL.getOutputStream());
+                          OutStream.write(b, 0, b.length);
+        OutStream.flush();
+        OutStream.close();
+
+        /* Read the response */
+
+        int resp = conURL.getResponseCode ();
+        if (resp != 200)
+            throw new RuntimeException ("Response code was not 200: " + resp);
+      server.setFinished (true);
+  }
+}