The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Apache::Voodoo::MP::V1;

$VERSION = "3.0200";

use strict;
use warnings;

use Apache;
use Apache::Constants qw(OK REDIRECT DECLINED FORBIDDEN SERVER_ERROR M_GET);

use Apache::Request;
use Apache::Cookie;

use base("Apache::Voodoo::MP::Common");

sub declined     { return Apache::Constants::DECLINED;     }
sub forbidden    { return Apache::Constants::FORBIDDEN;    }
sub ok           { return Apache::Constants::OK;           }
sub server_error { return Apache::Constants::SERVER_ERROR; }
sub not_found    { return Apache::Constants::NOT_FOUND;    }

sub content_type   { shift()->{'r'}->send_http_header(@_); }
sub err_header_out { shift()->{'r'}->err_header_out(@_); }
sub header_in      { shift()->{'r'}->header_in(@_); }
sub header_out     { shift()->{'r'}->header_out(@_); }

sub redirect {
	my $self = shift;
	my $loc  = shift;

	if ($loc) {
		my $r = $self->{'r'};
		if ($r->method eq "POST") {
			$r->method_number(Apache::Constants::M_GET);
			$r->method('GET');
			$r->headers_in->unset('Content-length');

			$r->header_out("Location" => $loc);
			$r->status(Apache::Constants::REDIRECT);
			$r->send_http_header;
		}
		else {
			$r->header_out("Location" => $loc);
		}
	}
	return Apache::Constants::REDIRECT;
}

sub parse_params {
	my $self       = shift;
	my $upload_max = shift;

	my %params;

	my $apr  = Apache::Request->new($self->{r}, POST_MAX => $upload_max);

	foreach ($apr->param) {
		my @value = $apr->param($_);
		$params{$_} = @value > 1 ? [@value] : $value[0];
	}

	# make sure our internal special params don't show up in the parameter list.
	delete $params{'__voodoo_file_upload__'};
	delete $params{'__voodoo_upload_error__'};

	if ($apr->parse()) {
		$params{'__voodoo_upload_error__'} = $apr->notes('error-notes');
	}
	else {
		my @uploads = $apr->upload;
		if (@uploads) {
			$params{'__voodoo_file_upload__'} = @uploads > 1 ? [@uploads] : $uploads[0];
		}
	}

	return \%params;
}

sub set_cookie {
	my $self = shift;

	my $name    = shift;
	my $value   = shift;
	my $expires = shift;

	my $c = Apache::Cookie->new($self->{r},
		-name     => $name,
		-value    => $value,
		-path     => '/',
		-domain   => $self->{'r'}->get_server_name()
	);

	if ($expires) {
		$c->expires($expires);
	}

	# I don't use Apache2::Cookie's bake since it doesn't support setting the HttpOnly flag.
	# The argument goes something like "Not every browser supports it, so what's the point?"
	# Isn't that a bit like saying "What's the point in wearing this bullet proof vest if it
	# doesn't stop a round from a tank?"
	$self->err_header_out('Set-Cookie' => $c->as_string()."; HttpOnly");
}

sub get_cookie {
	my $self = shift;

	unless (defined($self->{cookiejar})) {
		# cookies haven't be parsed yet.
		$self->{cookiejar} = Apache::Cookie::Jar->new($self->{r});
	}

	my $c = $self->{cookiejar}->cookies(shift);
	if (defined($c)) {
		return $c->value;
	}
	else {
		return undef;
	}
}

sub register_cleanup {
	my $self = shift;
	my $obj  = shift;
	my $sub  = shift;

	$self->{'r'}->register_cleanup(sub { $obj->$sub });
}

1;

################################################################################
# Copyright (c) 2005-2010 Steven Edwards (maverick@smurfbane.org).
# All rights reserved.
#
# You may use and distribute Apache::Voodoo under the terms described in the
# LICENSE file include in this package. The summary is it's a legalese version
# of the Artistic License :)
#
################################################################################