use strict;
use warnings;
-our $VERSION = '0.07';
+our $VERSION = '0.08_01';
use URI;
use URI::Escape ();
use overload '""' => \&as_string;
+my $unsafe = q(^A-Za-z0-9\-_.~!\$\&'()*+,;=:/?\[\]#@);
+
=head1 NAME
URI::Template - Object for handling URI templates
=head1 DESCRIPTION
This is an initial attempt to provide a wrapper around URI templates
-as described at http://www.ietf.org/internet-drafts/draft-gregorio-uritemplate-00.txt
+as described at http://www.ietf.org/internet-drafts/draft-gregorio-uritemplate-01.txt
=head1 INSTALLATION
# fix undef vals
for my $var ( @vars ) {
$params{ $var } = defined $params{ $var }
- ? URI::Escape::uri_escape( $params{ $var } )
+ ? URI::Escape::uri_escape( $params{ $var }, $unsafe )
: '';
}
$uri =~ s/{(.+?)}/@params
? defined $params[ 0 ]
- ? URI::Escape::uri_escape( shift @params )
+ ? URI::Escape::uri_escape( shift @params, $unsafe )
: ''
: ''/eg;
use strict;
use warnings;
-use Test::More tests => 15;
+use Test::More tests => 25;
use_ok( 'URI::Template' );
}
}
+# test from spec
+{
+ my %vals = (
+ a => 'fred',
+ b => 'barney',
+ c => 'cheeseburger',
+ d => 'one two three',
+ e => '20% tricky',
+ f => '',
+ 20 => 'this-is-spinal-tap',
+ scheme => 'https',
+ p => 'quote=to+be+or+not+to+be',
+ q => 'hullo#world',
+ );
+
+ my @urls = (
+ [ (
+ 'http://example.org/page1#{a}',
+ 'http://example.org/page1#fred',
+ ) ],
+ [ (
+ 'http://example.org/{a}/{b}/',
+ 'http://example.org/fred/barney/',
+ ) ],
+ [ (
+ 'http://example.org/{a}{b}/',
+ 'http://example.org/fredbarney/',
+ ) ],
+ [ (
+ 'http://example.com/order/{c}/{c}/{c}/',
+ 'http://example.com/order/cheeseburger/cheeseburger/cheeseburger/',
+ ) ],
+ [ (
+ 'http://example.org/{d}',
+ 'http://example.org/one%20two%20three',
+ ) ],
+ [ (
+ 'http://example.org/{e}',
+ 'http://example.org/20%25%20tricky',
+ ) ],
+ [ (
+ 'http://example.com/{f}/',
+ 'http://example.com//',
+ ) ],
+ [ (
+ '{scheme}://{20}.example.org?date={wilma}&option={a}',
+ 'https://this-is-spinal-tap.example.org?date=&option=fred',
+ ) ],
+ [ (
+ 'http://example.org?{p}',
+ 'http://example.org?quote=to+be+or+not+to+be',
+ ) ],
+ [ (
+ 'http://example.com/{q}',
+ 'http://example.com/hullo#world',
+ ) ],
+ );
+
+ for my $list ( @urls ) {
+ my $template = URI::Template->new( $list->[ 0 ] );
+ my $result = $template->process( %vals );
+ is( $result, $list->[ 1 ], 'escaped properly' );
+ }
+}
+
{
my $template = URI::Template->new( 'http://foo.com/{z}/{z}/' );
is_deeply( [ $template->variables ], [ 'z' ], 'unique vars' );