RFD: Query param discrepancy in unix/windows file Handler:openConnection

Daniel Fuchs daniel.fuchs at oracle.com
Wed Apr 2 10:12:25 UTC 2025


Hi Eirik,

This is an old API and I suspect the current behavior has
been here from the start. I would prefer not to change
it, unless we really have to.

best regards,

-- daniel

On 01/04/2025 20:09, Eirik Bjørsnøs wrote:
> Hi,
> 
> *Observation:*
> 
> On Unix and Windows respectively, the following code runs fine:
> 
> Unix:
> jshell> new URL("file://localhost/etc/hosts").openStream();
> $8 ==> java.io.BufferedInputStream at 59f95c5d
> 
> Windows:
> jshell> new 
> java.net.URL("file://localhost/C:/Windows/System32/drivers/etc/hosts").openStream()
> $13 ==> java.io.BufferedInputStream at 33e5ccce
> 
> However, when we add a query parameter to the URL, the picture changes:
> 
> Unix:
> jshell> new URL("file://localhost/etc/hosts?name=value").openStream();
> $9 ==> java.io.BufferedInputStream at 4aa8f0b4
> 
> Windows:
> jshell> new 
> java.net.URL("file://localhost/C:/Windows/System32/drivers/etc/hosts?name=value").openStream()
> |  Exception java.io.FileNotFoundException: 
> C:\Windows\System32\drivers\etc\hosts?name=value (The filename, 
> directory name, or volume label syntax is incorrect)
> |        at FileInputStream.open0 (Native Method)
> |        at FileInputStream.open (FileInputStream.java:185)
> |        at FileInputStream.<init> (FileInputStream.java:139)
> |        at FileInputStream.<init> (FileInputStream.java:109)
> |        at FileURLConnection.connect (FileURLConnection.java:83)
> |        at FileURLConnection.getInputStream (FileURLConnection.java:185)
> |        at URL.openStream (URL.java:1260)
> |        at (#14:1)
> 
> 
> *Analysis:*
> 
> Looking at the Windows implementation of 
> sun.net.protocol.www.file.Handler, it indeed uses URL::getFile when 
> constructing the file path, while the unix implementation uses URL::getPath.
> 
> Unlike the generic URI syntax described in RFC 3986, the file URI RFC 
> 8082 does not include a query component in its syntax description.
> 
> This leaves the implementor the choice of ignoring query components 
> (like we do for Unix) or rejecting the URL (which we effectively, while 
> not explicitly, do for Windows).
> 
> *Action:*
> 
> I think it would make sense to align our implementations here. If we 
> choose to do so, I think it would make most sense to adjust the Windows 
> implementation to also ignore the query component by using URL::getPath 
> instead of URL::getFile, like we currently do for Unix.
> 
> Thoughts?
> 
> Eirik.



More information about the net-dev mailing list