test/jdk/java/net/URLConnection/SetIfModifiedSince.java
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 47216 71c04702a3d5
child 58679 9c3209ff7550
--- a/test/jdk/java/net/URLConnection/SetIfModifiedSince.java	Thu Oct 17 20:27:44 2019 +0100
+++ b/test/jdk/java/net/URLConnection/SetIfModifiedSince.java	Thu Oct 17 20:53:35 2019 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, 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
@@ -23,6 +23,7 @@
 
 /* @test
  * @bug 4397096
+ * @library /test/lib
  * @run main/othervm SetIfModifiedSince
  * @summary setIfModifiedSince() of HttpURLConnection sets invalid date of default locale
  */
@@ -31,7 +32,11 @@
 import java.io.*;
 import java.util.*;
 
+import jdk.test.lib.net.URIBuilder;
+
 public class SetIfModifiedSince {
+    static volatile boolean successfulHeaderCheck = false;
+    static final String MARKER = "A-test-name";
 
     static class XServer extends Thread {
         ServerSocket srv;
@@ -48,46 +53,82 @@
         }
 
         public void run() {
-            try {
+            boolean foundMarker = false;
+            while (!foundMarker) {
                 String x;
-                s = srv.accept ();
-                is = s.getInputStream ();
-                BufferedReader r = new BufferedReader(new InputStreamReader(is));
-                os = s.getOutputStream ();
-                while ((x=r.readLine()) != null) {
-                    String header = "If-Modified-Since: ";
-                    if (x.startsWith(header)) {
-                        if (x.charAt(header.length()) == '?') {
-                            s.close ();
-                            srv.close (); // or else the HTTPURLConnection will retry
-                            throw new RuntimeException
-                                    ("Invalid HTTP date specification");
+                try {
+                    s = srv.accept();
+                    System.out.println("Server: accepting connection from: " + s);
+                    is = s.getInputStream ();
+                } catch (IOException io) {
+                    System.err.println("Server: Failed to accept connection: " + io);
+                    io.printStackTrace();
+                    try { srv.close(); } catch (IOException ioc) { }
+                    break;
+                }
+                try {
+                    BufferedReader r = new BufferedReader(new InputStreamReader(is));
+                    os = s.getOutputStream ();
+                    boolean foundHeader;
+                    while ((x=r.readLine()) != null) {
+                        String testname = MARKER + ": ";
+                        String header = "If-Modified-Since: ";
+                        if (x.startsWith(header)) {
+                            foundHeader = true;
+                            System.out.println("Server: found header: " + x);
+                            if (x.charAt(header.length()) == '?') {
+                                s.close ();
+                                srv.close (); // or else the HTTPURLConnection will retry
+                                throw new RuntimeException
+                                        ("Invalid HTTP date specification");
+                            }
+                            if (foundMarker) break;
+                        } else if (x.startsWith(testname)) {
+                           foundMarker = true;
+                           System.out.println("Server: found marker: " + x);
                         }
-                        break;
                     }
-                }
-                s.close ();
-                srv.close (); // or else the HTTPURLConnection will retry
-            } catch (IOException e) {}
+                    successfulHeaderCheck = true;
+                    s.close ();
+                    // only close server if connected from this test.
+                    if (foundMarker) {
+                        srv.close (); // or else the HTTPURLConnection will retry
+                    }
+                } catch (IOException e) {}
+            }
         }
     }
 
-    public static void main (String[] args) {
+    public static void main(String[] args) throws Exception {
         Locale reservedLocale = Locale.getDefault();
         try {
             Locale.setDefault(Locale.JAPAN);
-            ServerSocket serversocket = new ServerSocket (0);
+            ServerSocket serversocket = new ServerSocket();
+            serversocket.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
             int port = serversocket.getLocalPort ();
             XServer server = new XServer (serversocket);
             server.start ();
             Thread.sleep (2000);
-            URL url = new URL ("http://localhost:"+port+"/index.html");
-            URLConnection urlc = url.openConnection ();
+            URL url = URIBuilder.newBuilder()
+                    .scheme("http")
+                    .loopback()
+                    .port(port)
+                    .path("/index.html")
+                    .toURLUnchecked();
+            URLConnection urlc = url.openConnection(Proxy.NO_PROXY);
+            urlc.setRequestProperty(MARKER, "SetIfModifiedSince");
             urlc.setIfModifiedSince (10000000);
             InputStream is = urlc.getInputStream ();
-            int i=0, c;
-            Thread.sleep (5000);
-        } catch (Exception e) {
+            int i = 0, c;
+            Thread.sleep(5000);
+            if (!successfulHeaderCheck) {
+                throw new RuntimeException("Header check was unsuccessful");
+            }
+        } catch (SocketException ce) {
+            if (!successfulHeaderCheck) {
+                throw ce;
+            }
+            System.out.println("ConnectionException expected on successful check of If-modified-since header");
         } finally {
             // restore the reserved locale
             Locale.setDefault(reservedLocale);