Blame lib/HTTP/Headers/Auth.pm

Packit a09cf7
package HTTP::Headers::Auth;
Packit a09cf7
Packit a09cf7
use strict;
Packit a09cf7
use warnings;
Packit a09cf7
Packit a09cf7
our $VERSION = '6.18';
Packit a09cf7
Packit a09cf7
use HTTP::Headers;
Packit a09cf7
Packit a09cf7
package
Packit a09cf7
    HTTP::Headers;
Packit a09cf7
Packit a09cf7
BEGIN {
Packit a09cf7
    # we provide a new (and better) implementations below
Packit a09cf7
    undef(&www_authenticate);
Packit a09cf7
    undef(&proxy_authenticate);
Packit a09cf7
}
Packit a09cf7
Packit a09cf7
require HTTP::Headers::Util;
Packit a09cf7
Packit a09cf7
sub _parse_authenticate
Packit a09cf7
{
Packit a09cf7
    my @ret;
Packit a09cf7
    for (HTTP::Headers::Util::split_header_words(@_)) {
Packit a09cf7
	if (!defined($_->[1])) {
Packit a09cf7
	    # this is a new auth scheme
Packit a09cf7
	    push(@ret, shift(@$_) => {});
Packit a09cf7
	    shift @$_;
Packit a09cf7
	}
Packit a09cf7
	if (@ret) {
Packit a09cf7
	    # this a new parameter pair for the last auth scheme
Packit a09cf7
	    while (@$_) {
Packit a09cf7
		my $k = shift @$_;
Packit a09cf7
		my $v = shift @$_;
Packit a09cf7
	        $ret[-1]{$k} = $v;
Packit a09cf7
	    }
Packit a09cf7
	}
Packit a09cf7
	else {
Packit a09cf7
	    # something wrong, parameter pair without any scheme seen
Packit a09cf7
	    # IGNORE
Packit a09cf7
	}
Packit a09cf7
    }
Packit a09cf7
    @ret;
Packit a09cf7
}
Packit a09cf7
Packit a09cf7
sub _authenticate
Packit a09cf7
{
Packit a09cf7
    my $self = shift;
Packit a09cf7
    my $header = shift;
Packit a09cf7
    my @old = $self->_header($header);
Packit a09cf7
    if (@_) {
Packit a09cf7
	$self->remove_header($header);
Packit a09cf7
	my @new = @_;
Packit a09cf7
	while (@new) {
Packit a09cf7
	    my $a_scheme = shift(@new);
Packit a09cf7
	    if ($a_scheme =~ /\s/) {
Packit a09cf7
		# assume complete valid value, pass it through
Packit a09cf7
		$self->push_header($header, $a_scheme);
Packit a09cf7
	    }
Packit a09cf7
	    else {
Packit a09cf7
		my @param;
Packit a09cf7
		if (@new) {
Packit a09cf7
		    my $p = $new[0];
Packit a09cf7
		    if (ref($p) eq "ARRAY") {
Packit a09cf7
			@param = @$p;
Packit a09cf7
			shift(@new);
Packit a09cf7
		    }
Packit a09cf7
		    elsif (ref($p) eq "HASH") {
Packit a09cf7
			@param = %$p;
Packit a09cf7
			shift(@new);
Packit a09cf7
		    }
Packit a09cf7
		}
Packit a09cf7
		my $val = ucfirst(lc($a_scheme));
Packit a09cf7
		if (@param) {
Packit a09cf7
		    my $sep = " ";
Packit a09cf7
		    while (@param) {
Packit a09cf7
			my $k = shift @param;
Packit a09cf7
			my $v = shift @param;
Packit a09cf7
			if ($v =~ /[^0-9a-zA-Z]/ || lc($k) eq "realm") {
Packit a09cf7
			    # must quote the value
Packit a09cf7
			    $v =~ s,([\\\"]),\\$1,g;
Packit a09cf7
			    $v = qq("$v");
Packit a09cf7
			}
Packit a09cf7
			$val .= "$sep$k=$v";
Packit a09cf7
			$sep = ", ";
Packit a09cf7
		    }
Packit a09cf7
		}
Packit a09cf7
		$self->push_header($header, $val);
Packit a09cf7
	    }
Packit a09cf7
	}
Packit a09cf7
    }
Packit a09cf7
    return unless defined wantarray;
Packit a09cf7
    wantarray ? _parse_authenticate(@old) : join(", ", @old);
Packit a09cf7
}
Packit a09cf7
Packit a09cf7
Packit a09cf7
sub www_authenticate    { shift->_authenticate("WWW-Authenticate", @_)   }
Packit a09cf7
sub proxy_authenticate  { shift->_authenticate("Proxy-Authenticate", @_) }
Packit a09cf7
Packit a09cf7
1;
Packit a09cf7
Packit a09cf7
__END__
Packit a09cf7
Packit a09cf7
=pod
Packit a09cf7
Packit a09cf7
=encoding UTF-8
Packit a09cf7
Packit a09cf7
=head1 NAME
Packit a09cf7
Packit a09cf7
HTTP::Headers::Auth
Packit a09cf7
Packit a09cf7
=head1 VERSION
Packit a09cf7
Packit a09cf7
version 6.18
Packit a09cf7
Packit a09cf7
=head1 AUTHOR
Packit a09cf7
Packit a09cf7
Gisle Aas <gisle@activestate.com>
Packit a09cf7
Packit a09cf7
=head1 COPYRIGHT AND LICENSE
Packit a09cf7
Packit a09cf7
This software is copyright (c) 1994-2017 by Gisle Aas.
Packit a09cf7
Packit a09cf7
This is free software; you can redistribute it and/or modify it under
Packit a09cf7
the same terms as the Perl 5 programming language system itself.
Packit a09cf7
Packit a09cf7
=cut