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@59f95c5d

Windows:
jshell> new java.net.URL("file://localhost/C:/Windows/System32/drivers/etc/hosts").openStream()
$13 ==> java.io.BufferedInputStream@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@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.

Reply via email to