The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# 
# Strict is on
# 
#
# Examples from draft-fielding-uri-syntax-03
#
# Normal examples (C.1)
#
# Expect ftp:h
#
#
# ftp:h          	http://a/b/c/d;p?q
#
uri: ftp:h
furi: ftp:h
uri base: http://a/b/c/d;p?q
uri absolute: ftp:h
#
# Expect http://a/b/c/g
#
#
# g            	http://a/b/c/d;p?q
#
uri: g
furi: g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g
#
# Expect http://a/b/c/g
#
#
# ./g          	http://a/b/c/d;p?q
#
uri: ./g
furi: ./g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g
#
# Expect http://a/b/c/g/
#
#
# g/           	http://a/b/c/d;p?q
#
uri: g/
furi: g/
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g/
#
# Expect http://a/g
#
#
# /g           	http://a/b/c/d;p?q
#
uri: /g
furi: /g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/g
#
# Expect http://g
#
#
# //g          	http://a/b/c/d;p?q
#
uri: //g/
furi: /g/
uri base: http://a/b/c/d;p?q
uri absolute: http://g/
#
# Expect http://a/b/c/?y (our implementation chose to replace the query
# instead of overriding the whole path)
#
#
# ?y           	http://a/b/c/d;p?q
#
uri: ?y
furi: ?y
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/?y
#
# Expect http://a/b/c/g?y
#
#
# g?y          	http://a/b/c/d;p?q
#
uri: g?y
furi: g?y
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g?y
#
# Expect (current document)#s
#
#
# #s           	http://a/b/c/d;p?q
#
uri: #s
furi: 
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/d;p?q#s
#
# Expect http://a/b/c/g#s
#
#
# g#s          	http://a/b/c/d;p?q
#
uri: g#s
furi: g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g#s
#
# Expect http://a/b/c/g?y#s
#
#
# g?y#s        	http://a/b/c/d;p?q
#
uri: g?y#s
furi: g?y
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g?y#s
#
# Expect http://a/b/c/;x (our implementation chose to replace the param
# instead of overriding the whole path)
#
#
# ;x           	http://a/b/c/d;p?q
#
uri: ;x
furi: ;x
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/;x
#
# Expect http://a/b/c/g;x
#
#
# g;x          	http://a/b/c/d;p?q
#
uri: g;x
furi: g;x
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g;x
#
# Expect http://a/b/c/g;x?y#s
#
#
# g;x?y#s      	http://a/b/c/d;p?q
#
uri: g;x?y#s
furi: g;x?y
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g;x?y#s
#
# Expect http://a/b/c/
#
#
# .            	http://a/b/c/d;p?q
#
uri: .
furi: .
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/
#
# Expect http://a/b/c/
#
#
# ./           	http://a/b/c/d;p?q
#
uri: ./
furi: ./
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/
#
# Expect http://a/b/
#
#
# ..           	http://a/b/c/d;p?q
#
uri: ..
furi: ..
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/
#
# Expect http://a/b/
#
#
# ../          	http://a/b/c/d;p?q
#
uri: ../
furi: ../
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/
#
# Expect http://a/b/g
#
#
# ../g         	http://a/b/c/d;p?q
#
uri: ../g
furi: ../g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/g
#
# Expect http://a/
#
#
# ../..        	http://a/b/c/d;p?q
#
uri: ../..
furi: ../..
uri base: http://a/b/c/d;p?q
uri absolute: http://a/
#
# Expect http://a/
#
#
# ../../       	http://a/b/c/d;p?q
#
uri: ../../
furi: ../../
uri base: http://a/b/c/d;p?q
uri absolute: http://a/
#
# Expect http://a/g
#
#
# ../../g      	http://a/b/c/d;p?q
#
uri: ../../g
furi: ../../g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/g
#
# Expect http://a/b/c/d;p?q
#
#
# 	http://a/b/c/d;p?q
#
uri: http://a/b/c/d;p?q
furi: http:/a/b/c/d;p?q
#
# Abnormal examples (C.2)
#
#
# Expect http://a/../g or http://a/g (both acceptable)
#
#
# ../../../g   	http://a/b/c/d;p?q
#
uri: ../../../g
furi: ../../../g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/g
#
# Expect http://a/../../g or http://a/g (both acceptable)
#
#
# ../../../../g 	http://a/b/c/d;p?q
#
uri: ../../../../g
furi: ../../../../g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/g
#
# Expect http://a/./g (our implementation chose to reduce this path too
# because all unices and windows based server behave this way)
#
#
# /./g         	http://a/b/c/d;p?q
#
uri: /./g
furi: /./g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/g
#
# Expect http://a/../g (our implementation chose to reduce this path too
# because all unices and windows based server behave this way)
#
#
# /../g        	http://a/b/c/d;p?q
#
uri: /../g
furi: /../g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/g
#
# Expect http://a/b/c/g.
#
#
# g.           	http://a/b/c/d;p?q
#
uri: g.
furi: g.
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g.
#
# Expect http://a/b/c/.g
#
#
# .g           	http://a/b/c/d;p?q
#
uri: .g
furi: .g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/.g
#
# Expect http://a/b/c/g..
#
#
# g..          	http://a/b/c/d;p?q
#
uri: g..
furi: g..
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g..
#
# Expect http://a/b/c/..g
#
#
# ..g          	http://a/b/c/d;p?q
#
uri: ..g
furi: ..g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/..g
#
# Expect http://a/b/g
#
#
# ./../g       	http://a/b/c/d;p?q
#
uri: ./../g
furi: ./../g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/g
#
# Expect http://a/b/c/g/
#
#
# ./g/.        	http://a/b/c/d;p?q
#
uri: ./g/.
furi: ./g/.
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g/
#
# Expect http://a/b/c/g/h
#
#
# g/./h        	http://a/b/c/d;p?q
#
uri: g/./h
furi: g/./h
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g/h
#
# Expect http://a/b/c/h
#
#
# g/../h       	http://a/b/c/d;p?q
#
uri: g/../h
furi: g/../h
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/h
#
# Expect http://a/b/c/g;x=1/y (i don't understand that, whatever is in
# params or query must not be interpreted. /./ or ../ may be meaningfull
# for the server handling the request. This is not a 'path' component, is
# it ?)
#
#
# g;x=1/./y    	http://a/b/c/d;p?q
#
uri: g;x%3D1%2F.%2Fy
furi: g;x%3D1%2F.%2Fy
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g;x%3D1%2F.%2Fy
#
# Expect http://a/b/c/y (same as above)
#
#
# g;x=1/../y   	http://a/b/c/d;p?q
#
uri: g;x%3D1%2F..%2Fy
furi: g;x%3D1%2F..%2Fy
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g;x%3D1%2F..%2Fy
#
# Expect http://a/b/c/g?y/./x
#
#
# g?y/./x      	http://a/b/c/d;p?q
#
uri: g?y%2F.%2Fx
furi: g?y%2F.%2Fx
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g?y%2F.%2Fx
#
# Expect http://a/b/c/g?y/../x
#
#
# g?y/../x     	http://a/b/c/d;p?q
#
uri: g?y%2F..%2Fx
furi: g?y%2F..%2Fx
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g?y%2F..%2Fx
#
# Expect http://a/b/c/g#s/./x
#
#
# g#s/./x      	http://a/b/c/d;p?q
#
uri: g#s%2F.%2Fx
furi: g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g#s%2F.%2Fx
#
# Expect http://a/b/c/g#s/../x
#
#
# g#s/../x     	http://a/b/c/d;p?q
#
uri: g#s%2F..%2Fx
furi: g
uri base: http://a/b/c/d;p?q
uri absolute: http://a/b/c/g#s%2F..%2Fx