[PEAR-BUG] Bug #20425 [Opn]: Incomplete percent-encoding of userinfo, path and query

[email protected] Thu, 9 Oct 2014 11:46:09 +0100 (BST)
Newsgroups php.pear.bugs
Message-ID <[email protected]>
Edit report at https://pear.php.net/bugs/bug.php?id=20425&edit=1

 ID:               20425
 Updated by:       [email protected]
 Reported By:      jan dot prachar at gmail dot com
 Summary:          Incomplete percent-encoding of userinfo, path and
                    query
 Status:           Open
 Type:             Bug
 Package:          Net_URL2
 Package Version:  2.0.9
 PHP Version:      Irrelevant
 Roadmap Versions: 
 New Comment:

IIRC that special handling has been done to align wrong input handling
with that how browsers do it 
with their URI treatment. Strictly, Net_URL2 expects those parts to be
correctly encoded already. 
However this should make it more robust so that Net_URL2 can accept URIs
that are acceptable by 
browsers as well without running into double-encode problems:

The example URI you give:

    http://user[1]@example.com/p\s/|" ?{}#^

for example is turned when entered into Chromium into the following
effective request URI (fragment 
is kept in client):

    http://user%5B1%[email protected]/p/s/%7C%22%20?{}

This is similar to how Net_URL2 already does it:

    http://user[1]@example.com/p\s/|%22%20?{}#^

The differences I see is with the square brackets, the slash-correction
and pipe symbol. 

Angle-brackets do not need to be converted and question mark would
result in data-loss (separator) if 
it would have.

There is a documentation problem however because the comment does not
cover the userinfo part in 
the docblock of Net_URL2::_encodeData :

     * Encode characters that might have been forgotten to encode when
passing
     * in an URL. Applied onto Path and Query.

As with any fuzzy logic, this method is a best guess. When I introduced
it, I did check that with 
browser behavior. Now re-checking it and seeing the differences to
Chromium, I can't say why or why 
not I didn't cover square brackets for example.

It's perhaps best to research browser behaviors again and list those
incl. the results and the test-URIs.

I might still have some notes about that on the one or other computer. I
might be able to gather that 
later on.


Previous Comments:
------------------------------------------------------------------------

[2014-10-09 02:23:40] pracj3am

Description:
------------
When parsing URI, characters that are invalid are percent-encoded in the
userinfo, path 
and query part (method _encodeData). But there are more characters that
should be 
percent-encoded according to rfc3986 like [ ] | ` { }. Concretely this
is the whole set:
[\x-\x20\x22\x3C\x3E\5B-\5E\x60\7B-\7D\7F-\FF]

Also the same charcters should be pecent-encoded in a fragment part.

Test script:
---------------
echo (new Net_URL2('http://user[1]@example.com/p\s/|"
?{}#^'))->getUrl();

Expected result:
----------------
http://user%5B1%[email protected]/p%5Cs/%7C%22%20?%7B%7D#%5E

Actual result:
--------------
http://user[1]@example.com/p\s/|%22%20?{}#^

------------------------------------------------------------------------


-- 
Edit this bug report at https://pear.php.net/bugs/bug.php?id=20425&edit=1