The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Build.PL 01
Changes 04
META.json 36
META.yml 33
README.md 07
cpanfile 01
lib/Cookie/Baker.pm 527
t/02_crush.t 014
8 files changed (This is a version diff) 1163
@@ -33,6 +33,7 @@ my %args = (
 
     test_files           => ((-d '.git' || $ENV{RELEASE_TESTING}) && -d 'xt') ? 't/ xt/' : 't/',
     recursive_test_files => 1,
+
     
 );
 if (-d 'share') {
@@ -1,5 +1,9 @@
 Revision history for Perl extension Cookie-Baker
 
+0.03 2014-02-26T14:04:28Z
+
+    - use Cookie::Baker::XS if available
+
 0.02 2013-10-25T00:08:34Z
 
     - fix a document bug
@@ -4,7 +4,7 @@
       "Masahiro Nagano <kazeburo@gmail.com>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Minilla/v0.8.0",
+   "generated_by" : "Minilla/v0.11.0",
    "license" : [
       "perl_5"
    ],
@@ -46,6 +46,9 @@
             "Exporter" : "0",
             "URI::Escape" : "0",
             "perl" : "5.008005"
+         },
+         "suggests" : {
+            "Cookie::Baker::XS" : "0"
          }
       },
       "test" : {
@@ -58,7 +61,7 @@
    "provides" : {
       "Cookie::Baker" : {
          "file" : "lib/Cookie/Baker.pm",
-         "version" : "0.02"
+         "version" : "0.03"
       }
    },
    "release_status" : "stable",
@@ -72,5 +75,5 @@
          "web" : "https://github.com/kazeburo/Cookie-Baker"
       }
    },
-   "version" : "0.02"
+   "version" : "0.03"
 }
@@ -10,7 +10,7 @@ configure_requires:
   CPAN::Meta::Prereqs: 0
   Module::Build: 0.38
 dynamic_config: 0
-generated_by: 'Minilla/v0.8.0, CPAN::Meta::Converter version 2.130880'
+generated_by: 'Minilla/v0.11.0, CPAN::Meta::Converter version 2.132830'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -29,7 +29,7 @@ no_index:
 provides:
   Cookie::Baker:
     file: lib/Cookie/Baker.pm
-    version: 0.02
+    version: 0.03
 requires:
   Exporter: 0
   URI::Escape: 0
@@ -38,4 +38,4 @@ resources:
   bugtracker: https://github.com/kazeburo/Cookie-Baker/issues
   homepage: https://github.com/kazeburo/Cookie-Baker
   repository: git://github.com/kazeburo/Cookie-Baker.git
-version: 0.02
+version: 0.03
@@ -14,6 +14,13 @@ Cookie::Baker - Cookie string generator / parser
 
 Cookie::Baker provides simple cookie string generator and parser.
 
+# XS IMPLEMENTATION
+
+This module try to use [Cookie::Baker::XS](http://search.cpan.org/perldoc?Cookie::Baker::XS)'s crush\_cookie by default
+and fail to it, use Cookie::Baker's pure-perl crush\_cookie.
+
+There is no XS implementation of bake\_cookie yet.
+
 # FUNCTION
 
 - bake\_cookie
@@ -1,6 +1,7 @@
 requires 'perl', '5.008001';
 requires 'URI::Escape';
 requires 'Exporter';
+suggests 'Cookie::Baker::XS';
 
 on 'test' => sub {
     requires 'Test::More', '0.98';
@@ -6,16 +6,31 @@ use warnings;
 use base qw/Exporter/;
 use URI::Escape;
 
-our $VERSION = "0.02";
-our @EXPORT = qw/bake_cookie crush_cookie/;
+BEGIN {
+    our $VERSION = "0.03";
+    our @EXPORT = qw/bake_cookie crush_cookie/;
+    my $use_pp = $ENV{COOKIE_BAKER_PP};
+    if (!$use_pp) {
+        eval {
+            require Cookie::Baker::XS;
+        };
+        $use_pp = !!$@;
+    }
+    if ($use_pp) {
+        *crush_cookie = \&pp_crush_cookie;
+    }
+    else {
+        *crush_cookie = \&Cookie::Baker::XS::crush_cookie;
+    }
+}
 
 sub bake_cookie {
     my ($name,$val) = @_;
 
     return '' unless defined $val;
     my %args = ref $val ? %{$val} : (value => $val);
-    
-    my $cookie = URI::Escape::uri_escape($name) . "=" . URI::Escape::uri_escape($args{value}) . '; ';
+    $name = URI::Escape::uri_escape($name) if $name =~ m![^a-zA-Z\-\._~]!;
+    my $cookie = "$name=" . URI::Escape::uri_escape($args{value}) . '; ';
     $cookie .= 'domain=' . $args{domain} . '; '  if $args{domain};
     $cookie .= 'path='. $args{path} . '; '       if $args{path};
     $cookie .= 'expires=' . _date($args{expires}) . '; ' if $args{expires};
@@ -64,7 +79,7 @@ sub _date {
                    $WDAY[$wday], $mday, $MON[$mon], $year, $hour, $min, $sec);
 }
 
-sub crush_cookie {
+sub pp_crush_cookie {
     my $cookie_string = shift;
     return {} unless $cookie_string;
     my %results;
@@ -102,6 +117,13 @@ Cookie::Baker - Cookie string generator / parser
 
 Cookie::Baker provides simple cookie string generator and parser.
 
+=head1 XS IMPLEMENTATION
+
+This module try to use L<Cookie::Baker::XS>'s crush_cookie by default
+and fail to it, use Cookie::Baker's pure-perl crush_cookie.
+
+There is no XS implementation of bake_cookie yet.
+
 =head1 FUNCTION
 
 =over 4
@@ -2,14 +2,28 @@ use strict;
 use Test::More;
 use Cookie::Baker;
 
+my $longkey = 'x'x1024;
+
 my @tests = (
     [ 'Foo=Bar; Bar=Baz; XXX=Foo%20Bar; YYY=0; YYY=3', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar', YYY => 0 }],
+    [ 'Foo=Bar; Bar=Baz; XXX=Foo%20Bar; YYY=0; YYY=3;', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar', YYY => 0 }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY=0; YYY=3;', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar', YYY => 0 }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY=0; YYY=3;   ', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar', YYY => 0 }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar' }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY;', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar' }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY; ', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar' }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY=', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar', YYY=>"" }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY=;', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar', YYY=>"" }],
+    [ 'Foo=Bar; Bar=Baz;  XXX=Foo%20Bar   ; YYY=; ', { Foo => 'Bar', Bar => 'Baz', XXX => 'Foo Bar',YYY=>"" }],
+    [ "Foo=Bar; $longkey=Bar", { Foo => 'Bar', $longkey => 'Bar'}],
+    [ "Foo=Bar; $longkey=Bar; Bar=Baz", { Foo => 'Bar', $longkey => 'Bar', 'Bar'=>'Baz'}], 
     [ '', {} ],
     [ undef, {} ],
 );
 
 for my $test (@tests) {
     is_deeply( crush_cookie($test->[0]), $test->[1] );
+    is_deeply( Cookie::Baker::pp_crush_cookie($test->[0]), $test->[1] );
 }
 
 done_testing;