|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-12-14 15:51 UTC] hanskrentel at yahoo dot de
Description:
------------
Using a file-URI containing characters that are percent-encoded (one byte/octet
is encoded as a character triplet, e.g. Space -> %20) do not work. The URI is
not properly decoded.
Consider the following file on disk:
c:\temp\catalog 2.xml
PHP is able to find it existing via:
is_file('file:///C:/temp/catalog 2.xml');
However, commonly that file is written as:
file:///C:/temp/catalog%202.xml
And using that filename in PHP via:
is_file('file:///C:/temp/catalog%202.xml');
gives FALSE.
(Example is a libxml catalog file, properly specified for libxml)
When you're looking into this, it might be worth to also look for + as encoding
for space - just not that this case gets overlooked.
Test script:
---------------
<?php
touch($name = 'catalog 2.xml');
$uri = sprintf('file:///%s/%s', strtr(__DIR__, ['\\' => '/', ' ' => '%20']), rawurlencode($name));
printf('%s - %s (%d)', is_file($uri) ? 'OK' : 'FAIL', $uri, unlink($name));
Expected result:
----------------
OK - file:///C:/temp/catalog%202.xml (1)
Actual result:
--------------
FAIL - file:///C:/temp/catalog%202.xml (1)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Dec 03 10:00:01 2025 UTC |
If you would create a file named catalog%202.xml. You would have wanted to access it via: 'file:///C:/temp/catalog%%25202.xml' which as well does not work. I'm not doing a bug report here to be treated like an idiot. I better suggest you piss completely off instead of leaving such an idiotic comment. My 2 cents.@hanskrentel That's my test: - create file 'catalog%202.xml' with content "percent filename" - create file 'catalog 2.xml' with content "space filename" - then run php -r "echo file_get_contents('file://C:/my/path/catalog%202.xml');" percent filename - then run php -r "echo file_get_contents('file://C:/my/path/catalog 2.xml');" space filename That's pretty straight forward. That's what I mean - no decoding, both are valid filenames. The decoding should be done in your app depending on what it needs. In your example - you create 'catalog 2.xml' and are trying to stat 'catalog%202.xml', literally. But 'catalog%202.xml' doesn't exist.@ab: Consider you have a file containing a space in the filename, and you *need to* specify the filename in form of a file:// URI for which space is a special character that needs proper URL-encoding. That file://-URI btw is set in an environemnt variable that requires it (XML_CATALOG_FILES). Domdocument in PHP internally is then using that file://-URI and can't process it properly because the wrapper is not able to properly decode the path information. You actually pretty well demonstrate the problem in your example: php -r "echo file_get_contents('file://C:/my/path/catalog%202.xml');" percent filename Is obviously wrong. %20 in a file://-URI is an ecoded space, so the content space filename needs to be output instead. The filename you meant is properly written as: php -r "echo file_get_contents('file://C:/my/path/catalog%25202.xml');" percent filename compare: http://tools.ietf.org/html/rfc3986#section-2.1 Please add that example to yours because only if you have the two opposite cases (encoded *and* decoded) you can actually work out concrete results. You are just having two times the same example, of which I think both shows the same form of wrong: Missing encoding in those URIs. Which brings me to the point: Is there actually any interest to fix this? I mean there is not much standing in the way if you ask me. Normally users are not using the file:// URIs at all. Those who did most likely used the space (or would have complained earlier here, but I could find no bug-report). The only edge-case I can see is with files containing percent-signs, however how likely is that at all? Let me know if I would sponsor some well written patch how the chances would be to get this fixed.