Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
improved cookie generation slightly
  • Loading branch information
kraih committed Sep 1, 2011
1 parent 62b486e commit 6072e96
Show file tree
Hide file tree
Showing 5 changed files with 205 additions and 12 deletions.
3 changes: 2 additions & 1 deletion Changes
@@ -1,6 +1,7 @@
This file documents the revision history for Perl extension Mojolicious.

1.95 2011-08-27 00:00:00
1.95 2011-09-01 00:00:00
- Improved cookie generation slightly.
- Improved documentation.
- Fixed typos.

Expand Down
11 changes: 6 additions & 5 deletions lib/Mojo/Cookie/Request.pm
@@ -1,7 +1,7 @@
package Mojo::Cookie::Request;
use Mojo::Base 'Mojo::Cookie';

use Mojo::Util 'unquote';
use Mojo::Util qw/quote unquote/;

# "Lisa, would you like a donut?
# No thanks. Do you have any fruit?
Expand All @@ -15,8 +15,6 @@ sub parse {
for my $knot ($self->_tokenize($string)) {
for my $token (@{$knot}) {
my ($name, $value) = @{$token};

# Value might be quoted
unquote $value if $value;

# Path
Expand All @@ -29,7 +27,6 @@ sub parse {
else {
push @cookies, Mojo::Cookie::Request->new;
$cookies[-1]->name($name);
unquote $value if $value;
$value = '' unless defined $value;
$cookies[-1]->value($value);
$cookies[-1]->version($version);
Expand All @@ -53,7 +50,11 @@ sub to_string {
return '' unless $self->name;
my $cookie = $self->name;
my $value = $self->value;
$cookie .= defined $value ? "=$value" : '=';
if (defined $value) {
quote $value if $value =~ /[,;"]/;
$cookie .= "=$value";
}
else { $cookie .= '=' }
if (my $path = $self->path) { $cookie .= "; \$Path=$path" }

return $cookie;
Expand Down
10 changes: 6 additions & 4 deletions lib/Mojo/Cookie/Response.pm
Expand Up @@ -2,7 +2,7 @@ package Mojo::Cookie::Response;
use Mojo::Base 'Mojo::Cookie';

use Mojo::Date;
use Mojo::Util 'unquote';
use Mojo::Util qw/quote unquote/;

has [qw/comment domain httponly max_age port secure/];

Expand Down Expand Up @@ -51,8 +51,6 @@ sub parse {
for my $knot ($self->_tokenize($string)) {
for my $i (0 .. $#{$knot}) {
my ($name, $value) = @{$knot->[$i]};

# Value might be quoted
unquote $value if $value;

# This will only run once
Expand Down Expand Up @@ -86,7 +84,11 @@ sub to_string {
return '' unless $self->name;
my $cookie = $self->name;
my $value = $self->value;
$cookie .= defined $value ? "=$value" : '=';
if (defined $value) {
quote $value if $value =~ /[,;"]/;
$cookie .= "=$value";
}
else { $cookie .= '=' }
$cookie .= sprintf "; Version=%d", ($self->version || 1);

# Domain
Expand Down
6 changes: 5 additions & 1 deletion t/mojo/bytestream.t
Expand Up @@ -10,7 +10,7 @@ use Test::More;

plan skip_all => 'Perl 5.10 or Digest::SHA required for this test!'
unless eval { require Digest::SHA; 1 };
plan tests => 139;
plan tests => 141;

use_ok 'Mojo::Util', 'md5_bytes';
use_ok 'Mojo::ByteStream', 'b';
Expand Down Expand Up @@ -105,10 +105,14 @@ is $stream->qp_decode, "foo\x{99}bar$%^&3217", 'right qp decoded result';
# quote
$stream = b('foo; 23 "bar');
is $stream->quote, '"foo; 23 \"bar"', 'right quoted result';
$stream = b('"foo; 23 "bar"');
is $stream->quote, '"\"foo; 23 \"bar\""', 'right quoted result';

# unquote
$stream = b('"foo 23 \"bar"');
is $stream->unquote, 'foo 23 "bar', 'right unquoted result';
$stream = b('"\"foo 23 \"bar\""');
is $stream->unquote, '"foo 23 "bar"', 'right unquoted result';

# md5_bytes
$original = 'foo bar baz ♥';
Expand Down
187 changes: 186 additions & 1 deletion t/mojo/cookie.t
@@ -1,7 +1,7 @@
#!/usr/bin/env perl
use Mojo::Base -strict;

use Test::More tests => 139;
use Test::More tests => 267;

# "What good is money if it can't inspire terror in your fellow man?"
use_ok 'Mojo::Cookie::Request';
Expand Down Expand Up @@ -122,6 +122,67 @@ is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted request cookie roundtrip
$cookie = Mojo::Cookie::Request->new;
$cookies =
$cookie->parse('$Version=1; foo="b ,a\";= r\"\\\\"; $Path="/test"');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a";= r"\\', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = $cookie->parse($cookies->[0]->to_string_with_prefix);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a";= r"\\', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted request cookie roundtrip (alternative)
$cookie = Mojo::Cookie::Request->new;
$cookies = $cookie->parse('$Version=1; foo="b ,a\" r\"\\\\"; $Path="/test"');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a" r"\\', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = $cookie->parse($cookies->[0]->to_string_with_prefix);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a" r"\\', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted request cookie roundtrip (another alternative)
$cookie = Mojo::Cookie::Request->new;
$cookies = $cookie->parse('$Version=1; foo="b ;a\" r\"\\\\"; $Path="/test"');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ;a" r"\\', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = $cookie->parse($cookies->[0]->to_string_with_prefix);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ;a" r"\\', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted request cookie roundtrip (yet another alternative)
$cookie = Mojo::Cookie::Request->new;
$cookies = $cookie->parse('$Version=1; foo="\"b a\" r\""; $Path="/test"');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, '"b a" r"', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = $cookie->parse($cookies->[0]->to_string_with_prefix);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, '"b a" r"', 'right value';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Parse multiple cookie request
$cookies = Mojo::Cookie::Request->parse(
'$Version=1; foo=bar; $Path=/test; baz=la la; $Path=/tset');
Expand Down Expand Up @@ -228,6 +289,130 @@ is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted response cookie roundtrip
$cookies = Mojo::Cookie::Response->parse(
'foo="b ,a\";= r\"\\\\"; Version=1; Domain=kraih.com; Path=/test; Max-Age=60;'
. ' expires=Thu, 07 Aug 2008 07:07:59 GMT; Port="80 8080"; Secure;'
. ' Comment=lalalala');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a";= r"\\', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = Mojo::Cookie::Response->parse($cookies->[0]);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a";= r"\\', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted response cookie roundtrip (alternative)
$cookies = Mojo::Cookie::Response->parse(
'foo="b ,a\" r\"\\\\"; Version=1; Domain=kraih.com; Path=/test; Max-Age=60;'
. ' expires=Thu, 07 Aug 2008 07:07:59 GMT; Port="80 8080"; Secure;'
. ' Comment=lalalala');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a" r"\\', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = Mojo::Cookie::Response->parse($cookies->[0]);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ,a" r"\\', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted response cookie roundtrip (another alternative)
$cookies = Mojo::Cookie::Response->parse(
'foo="b ;a\" r\"\\\\"; Version=1; Domain=kraih.com; Path=/test; Max-Age=60;'
. ' expires=Thu, 07 Aug 2008 07:07:59 GMT; Port="80 8080"; Secure;'
. ' Comment=lalalala');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ;a" r"\\', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = Mojo::Cookie::Response->parse($cookies->[0]);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, 'b ;a" r"\\', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Quoted response cookie roundtrip (yet another alternative)
$cookies = Mojo::Cookie::Response->parse(
'foo="\"b a\" r\""; Version=1; Domain=kraih.com; Path=/test; Max-Age=60;'
. ' expires=Thu, 07 Aug 2008 07:07:59 GMT; Port="80 8080"; Secure;'
. ' Comment=lalalala');
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, '"b a" r"', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';
$cookies = Mojo::Cookie::Response->parse($cookies->[0]);
is $cookies->[0]->name, 'foo', 'right name';
is $cookies->[0]->value, '"b a" r"', 'right value';
is $cookies->[0]->domain, 'kraih.com', 'right domain';
is $cookies->[0]->path, '/test', 'right path';
is $cookies->[0]->max_age, 60, 'right max age value';
is $cookies->[0]->expires, 'Thu, 07 Aug 2008 07:07:59 GMT',
'right expires value';
is $cookies->[0]->port, '80 8080', 'right port';
is $cookies->[0]->secure, '1', 'right secure flag';
is $cookies->[0]->comment, 'lalalala', 'right comment';
is $cookies->[0]->version, '1', 'right version';
is $cookies->[1], undef, 'no more cookies';

# Parse response cookie without value
$cookies = Mojo::Cookie::Response->parse(
'foo=""; Version=1; Domain=kraih.com; Path=/test; Max-Age=60;'
Expand Down

0 comments on commit 6072e96

Please sign in to comment.