changeset 7383:42f9ad39bf42

7169142: CookieHandler does not work with localhost Summary: Add .local to derived effective hostnames without dot Reviewed-by: chegar
author khazra
date Thu, 13 Jun 2013 17:48:11 -0700
parents ff83bd43e36a
children f695f447f6b7
files src/share/classes/java/net/CookieManager.java test/java/net/CookieHandler/LocalHostCookie.java
diffstat 2 files changed, 128 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/net/CookieManager.java	Thu Jun 13 11:23:00 2013 -0700
+++ b/src/share/classes/java/net/CookieManager.java	Thu Jun 13 17:48:11 2013 -0700
@@ -309,7 +309,10 @@
                         // there is no dot at the beginning of effective request-host,
                         // the default Domain can only domain-match itself.)
                         if (cookie.getDomain() == null) {
-                            cookie.setDomain(uri.getHost());
+                            String host = uri.getHost();
+                            if (host != null && !host.contains("."))
+                                host += ".local";
+                            cookie.setDomain(host);
                         }
                         String ports = cookie.getPortlist();
                         if (ports != null) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/net/CookieHandler/LocalHostCookie.java	Thu Jun 13 17:48:11 2013 -0700
@@ -0,0 +1,124 @@
+/*
+ * 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.OutputStream;
+import java.net.*;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executors;
+
+/*
+ * @test
+ * @bug 7169142
+ * @summary CookieHandler does not work with localhost
+ * @run main/othervm LocalHostCookie
+ */
+public class LocalHostCookie {
+
+    public static void main(String[] args) throws Exception {
+        new LocalHostCookie().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("GET");
+            urlConnection.setDoOutput(true);
+            urlConnection.connect();
+            urlConnection.getInputStream();
+
+            CookieHandler cookieHandler = CookieHandler.getDefault();
+            if (cookieHandler == null) {
+                cookieHandler = new java.net.CookieManager();
+                CookieHandler.setDefault(cookieHandler);
+            }
+            cookieHandler.put(urlConnection.getURL().toURI(),
+                    urlConnection.getHeaderFields());
+            Map<String, List<String>> map =
+                    cookieHandler.get(urlConnection.getURL().toURI(),
+                    urlConnection.getHeaderFields());
+            if (map.containsKey("Cookie")) {
+                List<String> list = map.get("Cookie");
+                // name-value list will be empty if ".local" is not appended
+                if (list == null || list.size() ==  0) {
+                    throw new RuntimeException("Test 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 MyCookieHandler());
+            server.start();
+        }
+
+        public int getPort() {
+            return server.getAddress().getPort();
+        }
+
+        public void stopServer() {
+            server.stop(0);
+        }
+    }
+
+    class MyCookieHandler implements HttpHandler {
+
+        @Override
+        public void handle(HttpExchange exchange) throws IOException {
+            String requestMethod = exchange.getRequestMethod();
+            if (requestMethod.equalsIgnoreCase("GET")){
+                Headers responseHeaders = exchange.getResponseHeaders();
+                responseHeaders.set("Content-Type", "text/plain");
+                responseHeaders.set("Date", "June 13th 2012");
+                // No domain value set
+                responseHeaders.set("Set-Cookie2", "name=value");
+                exchange.sendResponseHeaders(200, 0);
+                OutputStream os = exchange.getResponseBody();
+                String str = "This is what the server sent!";
+                os.write(str.getBytes());
+                os.flush();
+                os.close();
+            }
+        }
+    }
+}
+