=== normalize() variants === INPUT: http://example.com/public/%2e%2e/admin OUTPUT: http://example.com/admin --- INPUT: http://example.com/public/%2E%2E/admin OUTPUT: http://example.com/admin --- INPUT: http://example.com/public/%252e%252e/admin OUTPUT: http://example.com/public/%25252e%25252e/admin --- INPUT: http://example.com/public/..%2fadmin OUTPUT: http://example.com/admin --- INPUT: http://example.com/public/%2e.%2fadmin OUTPUT: http://example.com/admin --- INPUT: http://example.com/public/%2e%2e%2fadmin OUTPUT: http://example.com/admin --- INPUT: http://example.com/public/%c0%ae%c0%ae%c0%afadmin OUTPUT: http://example.com/public/%25C0%25AE%25C0%25AE%25C0%25AFadmin --- INPUT: http://example.com/public/%2e%2e%5cadmin OUTPUT: http://example.com/public/..%255Cadmin --- INPUT: http://example.com/a%2Fb OUTPUT: http://example.com/a/b --- INPUT: http://example.com/a/b/%2e%2e/%2e%2e/c OUTPUT: http://example.com/c --- INPUT: http://example.com/foo/%2e%2e%2fbar OUTPUT: http://example.com/bar --- INPUT: http://example.com/public/%2e%2e%2f%2e%2e%2fadmin OUTPUT: http://example.com/admin --- INPUT: http://example.com/public/%2e%2e%2f%2e%2e%2fetc%2fpasswd OUTPUT: http://example.com/etc/passwd --- === equal() variants === equal('http://example.com/public/%2e%2e/admin', 'http://example.com/admin') => true equal('http://example.com/public/%2E%2E/admin', 'http://example.com/admin') => true equal('http://example.com/public/%252e%252e/admin', 'http://example.com/admin') => true equal('http://example.com/public/..%2fadmin', 'http://example.com/admin') => true equal('http://example.com/a%2Fb', 'http://example.com/a/b') => true === resolve() variants === resolve('http://example.com/public/', '%2e%2e%2fadmin') => http://example.com/admin resolve('http://example.com/public/', '..%2fadmin') => http://example.com/admin resolve('http://example.com/public/', '%2e%2e/admin') => http://example.com/admin