Re: getCanonicalHostName on Windows
I am not familiar with the Windows DNS service, but I cannot image how the FQDN can be retrieved without a reverse entry in the DNS server. I suspect that you will need to populate "Reverse Lookup Zones" with the names of any machines you wish to be able to get the FQDN for. -Chris. Max (Weijun) Wang wrote: On Mar 4, 2008, at 10:35 PM, Christopher Hegarty wrote: Hi Max, The Java methods that you are using are correct. As it is specified "best effort" is used to determine the FQDN. getByName will try to do forward lookup of k1.n3.local to retrieve its address, which I assumes will succeed. Then this address is used to do a reverse lookup to determine the FQDN of the host. What name service are you using? Can you verify the response from the server to the reverse lookup? It's the Windows DNS service automatically installed when I add the "AD domain controller" role to the AD server. The "Reverse Lookup Zones" is empty in the DNS Management Administrative Tools. BTW, I have 2 domains in the Network, one is this n3.local, another is a "sub-domain" n8.n3.local managed by another AD server. The client/AD server/k1 all belongs to n3.local. This shouldn't confuse the client, right? Here's the output of on my client machine xp. The other machines are: kdc, the AD server, and k1, the other server. D prints out InetAddress.getByName(args[0]).getCanonicalHostName(). You can see that getCanonicalName() costs quite some time accessing k1 and kdc. Ping is fast anyway. C:\tmp>"\Program Files\MKS Toolkit\mksnt\time.exe" java D xp xp.n3.local real0m 0.34s user0m 0.06s sys 0m 0.22s C:\tmp>"\Program Files\MKS Toolkit\mksnt\time.exe" java D k1 K1 real0m15.51s user0m 0.03s sys 0m 0.29s C:\tmp>"\Program Files\MKS Toolkit\mksnt\time.exe" java D kdc KDC real0m15.35s user0m 0.02s sys 0m 0.26s C:\tmp>ping k1 Pinging k1.n3.local [192.168.0.11] with 32 bytes of data: Reply from 192.168.0.11: bytes=32 time<1ms TTL=128 Reply from 192.168.0.11: bytes=32 time<1ms TTL=128 Reply from 192.168.0.11: bytes=32 time<1ms TTL=128 Reply from 192.168.0.11: bytes=32 time<1ms TTL=128 Ping statistics for 192.168.0.11: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms C:\tmp>ping kdc Pinging kdc.n3.local [192.168.0.1] with 32 bytes of data: Reply from 192.168.0.1: bytes=32 time<1ms TTL=128 Reply from 192.168.0.1: bytes=32 time<1ms TTL=128 Reply from 192.168.0.1: bytes=32 time<1ms TTL=128 Reply from 192.168.0.1: bytes=32 time<1ms TTL=128 Ping statistics for 192.168.0.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms Thanks Max -Chris. Max (Weijun) Wang wrote: Hi All I have a Windows domain called n3.local, and a server called k1 in the domain, and a client. When I call the line -- InetAddress.getByName("k1.n3.local").getCanonicalHostName() from the client, the returned string is "k1". How can I get "k1.n3.local"? Is there anything wrong with my Windows configuration? Or, I should use another Java method? Thanks Max
Proposed fix for 6660405.
Here is my proposed fix for CR 6660405. The issue is that after a redirect, and if there is a cache hit (i.e. the URL is found in the cache) HttpURLConnection will return the wrong InputStream. Details are in the evaluation section of the CR. My proposed fix is to set inputStream back to null in sun.net.www.protocol.http.HttpURLConnection.disconnectInternal(). I've also included a regression test that reproduces the bug. See patch attached. --- old/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java 2008-03-05 16:05:35.0 +0100 +++ new/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java 2008-03-05 16:05:35.0 +0100 @@ -2048,6 +2048,7 @@ */ private void disconnectInternal() { responseCode = -1; +inputStream = null; if (pi != null) { pi.finishTracking(); pi = null; --- /dev/null 2008-02-29 10:40:07.0 +0100 +++ new/test/sun/net/www/protocol/http/B6660405.java 2008-03-05 16:05:36.0 +0100 @@ -0,0 +1,165 @@ +/* + * Copyright 2008 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 6660405 + * @summary HttpURLConnection returns the wrong InputStream + */ + +import java.net.*; +import java.util.*; +import java.io.*; +import com.sun.net.httpserver.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ExecutorService; + +public class B6660405 +{ +com.sun.net.httpserver.HttpServer httpServer; +ExecutorService executorService; + +static class MyCacheResponse extends CacheResponse { +private byte[] buf = new byte[1024]; + +public MyCacheResponse() { + +} + +@Override +public Map> getHeaders() throws IOException +{ +Map> h = new HashMap>(); +ArrayList l = new ArrayList(); +l.add("HTTP/1.1 200 OK"); +h.put(null, l); +l = new ArrayList(); +l.add("1024"); +h.put("Content-Length", l); +return h; +} + +@Override +public InputStream getBody() throws IOException +{ +return new ByteArrayInputStream(buf); +} + +} +static class MyResponseCache extends ResponseCache { + +public MyResponseCache() { + +} + +@Override +public CacheResponse get(URI uri, String rqstMethod, Map> rqstHeaders) throws IOException +{ +if (uri.getPath().equals("/redirect/index.html")) { +return new MyCacheResponse(); +} +return null; +} + +@Override +public CacheRequest put(URI uri, URLConnection conn) throws IOException +{ +return null; +} + +} + +public static void main(String[] args) +{ +new B6660405(); +} + +public B6660405() +{ +try { +startHttpServer(); +doClient(); +} catch (IOException ioe) { +System.err.println(ioe); +} +} + +void doClient() { +ResponseCache.setDefault(new MyResponseCache()); +try { +InetSocketAddress address = httpServer.getAddress(); + +// GET Request +URL url = new URL("http://localhost:"; + address.getPort() + "/test/index.html"); +HttpURLConnection uc = (HttpURLConnection)url.openConnection(); +int code = uc.getResponseCode(); +System.err.println("response code = " + code); +int l = uc.getContentLength(); +System.err.println("content-length = " + l); +InputStream in = uc.getInputStream(); +int i = 0; +// Read till end of stream +do { +i = in.read(); +} while (i != -1); +in.close(); +} catch (IOException e) { +throw new RuntimeException("Got the wrong
Re: Proposed fix for 6660405.
The change looks good. I approve this change. -Chris Jean-Christophe Collet wrote: Here is my proposed fix for CR 6660405. The issue is that after a redirect, and if there is a cache hit (i.e. the URL is found in the cache) HttpURLConnection will return the wrong InputStream. Details are in the evaluation section of the CR. My proposed fix is to set inputStream back to null in sun.net.www.protocol.http.HttpURLConnection.disconnectInternal(). I've also included a regression test that reproduces the bug. See patch attached.
Proposed fix for 6651717
This is a straightforward fix in mailtoURLConnection to remove a left over debug statement in the connect() method. Also took the opportunity to remove unneeded imports and add appropriate @Override tags. No regression test as this is a trivial change. Patch attached. --- old/src/share/classes/sun/net/www/protocol/mailto/MailToURLConnection.java 2008-03-05 17:37:36.0 +0100 +++ new/src/share/classes/sun/net/www/protocol/mailto/MailToURLConnection.java 2008-03-05 17:37:35.0 +0100 @@ -29,9 +29,6 @@ import java.net.InetAddress; import java.net.SocketPermission; import java.io.*; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.StringTokenizer; import java.security.Permission; import sun.net.www.*; import sun.net.smtp.SmtpClient; @@ -86,11 +83,11 @@ } public void connect() throws IOException { -System.err.println("connect. Timeout = " + connectTimeout); client = new SmtpClient(connectTimeout); client.setReadTimeout(readTimeout); } +@Override public synchronized OutputStream getOutputStream() throws IOException { if (os != null) { return os; @@ -107,6 +104,7 @@ return os; } +@Override public Permission getPermission() throws IOException { if (permission == null) { connect(); @@ -116,22 +114,26 @@ return permission; } +@Override public void setConnectTimeout(int timeout) { if (timeout < 0) throw new IllegalArgumentException("timeouts can't be negative"); connectTimeout = timeout; } +@Override public int getConnectTimeout() { return (connectTimeout < 0 ? 0 : connectTimeout); } +@Override public void setReadTimeout(int timeout) { if (timeout < 0) throw new IllegalArgumentException("timeouts can't be negative"); readTimeout = timeout; } +@Override public int getReadTimeout() { return readTimeout < 0 ? 0 : readTimeout; }
Re: Proposed fix for 6651717
Yes, this change is fine. -Chris. Jean-Christophe Collet wrote: This is a straightforward fix in mailtoURLConnection to remove a left over debug statement in the connect() method. Also took the opportunity to remove unneeded imports and add appropriate @Override tags. No regression test as this is a trivial change. Patch attached.