Bug 226027: Use the Perl CGI module to send cookies.

r=bbaetz, a=justdave
parent 83cdee1c
...@@ -24,6 +24,7 @@ use strict; ...@@ -24,6 +24,7 @@ use strict;
package Bugzilla::CGI; package Bugzilla::CGI;
use CGI qw(-no_xhtml -oldstyle_urls :private_tempfiles :unique_headers); use CGI qw(-no_xhtml -oldstyle_urls :private_tempfiles :unique_headers);
use CGI::Util qw(rearrange);
use base qw(CGI); use base qw(CGI);
...@@ -45,6 +46,9 @@ sub new { ...@@ -45,6 +46,9 @@ sub new {
my $self = $class->SUPER::new(@args); my $self = $class->SUPER::new(@args);
# Make sure our outgoing cookie list is empty on each invocation
$self->{Bugzilla_cookie_list} = [];
# Make sure that we don't send any charset headers # Make sure that we don't send any charset headers
$self->charset(''); $self->charset('');
...@@ -116,13 +120,48 @@ sub multipart_init { ...@@ -116,13 +120,48 @@ sub multipart_init {
return $self->SUPER::multipart_init(@_); return $self->SUPER::multipart_init(@_);
} }
# Override header so we can add the cookies in
sub header {
my $self = shift;
# Add the cookies in if we have any
if (scalar(@{$self->{Bugzilla_cookie_list}})) {
if (scalar(@_) == 1) {
# if there's only one parameter, then it's a Content-Type.
# Since we're adding parameters we have to name it.
unshift(@_, '-type' => shift(@_));
}
unshift(@_, '-cookie' => $self->{Bugzilla_cookie_list});
}
return $self->SUPER::header(@_);
}
# We override the entirety of multipart_start instead of falling through to
# SUPER because the built-in one can't deal with cookies in any kind of sane
# way. This sub is gratuitously swiped from the real CGI.pm, but fixed so
# it actually works (but only as much as we need it to).
sub multipart_start {
my(@header);
my($self,@p) = @_;
my($type,@other) = rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE']],@p);
$type = $type || 'text/html';
push(@header,"Content-Type: $type");
# Add the cookies in if we have any
if (scalar(@{$self->{Bugzilla_cookie_list}})) {
foreach my $cookie (@{$self->{Bugzilla_cookie_list}}) {
push @header, "Set-Cookie: $cookie";
}
}
my $header = join($CGI::CRLF,@header)."${CGI::CRLF}${CGI::CRLF}";
return $header;
}
# The various parts of Bugzilla which create cookies don't want to have to # The various parts of Bugzilla which create cookies don't want to have to
# pass them arround to all of the callers. Instead, store them locally here, # pass them arround to all of the callers. Instead, store them locally here,
# and then output as required from |headers|. # and then output as required from |header|.
# This is done instead of just printing the result from the script, because
# we need to use |$r->header_out| under mod_perl (which is what CGI.pm
# does, and we need to match, plus if we don't |print| anything, we can turn
# off mod_perl/Apache's header parsing for a small perf gain)
sub send_cookie { sub send_cookie {
my $self = shift; my $self = shift;
...@@ -134,9 +173,7 @@ sub send_cookie { ...@@ -134,9 +173,7 @@ sub send_cookie {
# we're expiring an entry. # we're expiring an entry.
require CGI::Cookie; require CGI::Cookie;
my $cookie = CGI::Cookie->new(@_); my $cookie = CGI::Cookie->new(@_);
push @{$self->{Bugzilla_cookie_list}}, $cookie;
# XXX - mod_perl
print "Set-Cookie: $cookie\r\n";
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment