320 lines
7.1 KiB
Perl
320 lines
7.1 KiB
Perl
|
|
#!/usr/bin/perl
|
||
|
|
#
|
||
|
|
# DW::Request::Apache2
|
||
|
|
#
|
||
|
|
# Abstraction layer for Apache 2/mod_perl 2.
|
||
|
|
#
|
||
|
|
# Authors:
|
||
|
|
# Mark Smith <mark@dreamwidth.org>
|
||
|
|
# Andrea Nall <anall@andreanall.com>
|
||
|
|
#
|
||
|
|
# Copyright (c) 2008-2013 by Dreamwidth Studios, LLC.
|
||
|
|
#
|
||
|
|
# This program is free software; you may redistribute it and/or modify it under
|
||
|
|
# the same terms as Perl itself. For a copy of the license, please reference
|
||
|
|
# 'perldoc perlartistic' or 'perldoc perlgpl'.
|
||
|
|
#
|
||
|
|
|
||
|
|
package DW::Request::Apache2;
|
||
|
|
use strict;
|
||
|
|
use DW::Request::Base;
|
||
|
|
use base 'DW::Request::Base';
|
||
|
|
|
||
|
|
use Apache2::Const -compile => qw/ :common :http /;
|
||
|
|
use Apache2::Log ();
|
||
|
|
use Apache2::Request;
|
||
|
|
use Apache2::Response ();
|
||
|
|
use Apache2::RequestRec ();
|
||
|
|
use Apache2::RequestUtil ();
|
||
|
|
use Apache2::RequestIO ();
|
||
|
|
use Apache2::SubProcess ();
|
||
|
|
use Hash::MultiValue;
|
||
|
|
|
||
|
|
use fields (
|
||
|
|
'r', # The Apache2::Request object
|
||
|
|
);
|
||
|
|
|
||
|
|
# inform that we're available
|
||
|
|
$DW::Request::APACHE2_AVAILABLE = 1;
|
||
|
|
|
||
|
|
# creates a new DW::Request object, based on what type of server environment we
|
||
|
|
# are running under
|
||
|
|
sub new {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
$self = fields::new($self) unless ref $self;
|
||
|
|
$self->SUPER::new;
|
||
|
|
|
||
|
|
# setup object
|
||
|
|
$self->{r} = $_[1];
|
||
|
|
|
||
|
|
# done
|
||
|
|
return $self;
|
||
|
|
}
|
||
|
|
|
||
|
|
# current document root
|
||
|
|
sub document_root {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->document_root;
|
||
|
|
}
|
||
|
|
|
||
|
|
# method string GET, POST, etc
|
||
|
|
sub method {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->method;
|
||
|
|
}
|
||
|
|
|
||
|
|
# the URI requested (does not include host:port info)
|
||
|
|
sub uri {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->uri;
|
||
|
|
}
|
||
|
|
|
||
|
|
# This sets the content-type on the response. This is NOT a request method. For
|
||
|
|
# that, use the header_in method and check Content-Type.
|
||
|
|
sub content_type {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->content_type( $_[1] );
|
||
|
|
}
|
||
|
|
|
||
|
|
# returns the query string
|
||
|
|
sub query_string {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->args;
|
||
|
|
}
|
||
|
|
|
||
|
|
# returns the raw content of the body; note that this can be particularly
|
||
|
|
# slow, so you should only call this if you really need it...
|
||
|
|
sub content {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{content} if defined $self->{content};
|
||
|
|
|
||
|
|
my $buff = '';
|
||
|
|
while ( my $ct = $self->{r}->read( my $buf, 65536 ) ) {
|
||
|
|
$buff .= $buf;
|
||
|
|
last if $ct < 65536;
|
||
|
|
}
|
||
|
|
return $self->{content} = $buff;
|
||
|
|
}
|
||
|
|
|
||
|
|
# searches for a given note and returns the value, or sets it
|
||
|
|
sub note {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
return $self->{r}->notes->{ $_[1] };
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->notes->{ $_[1] } = $_[2];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# searches for a given pnote and returns the value, or sets it
|
||
|
|
sub pnote {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
return $self->{r}->pnotes->{ $_[1] };
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->pnotes->{ $_[1] } = $_[2];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# searches for a given header and returns the value, or sets it
|
||
|
|
sub header_in {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
return $self->{r}->headers_in->{ $_[1] };
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->headers_in->{ $_[1] } = $_[2];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Do not want to return an APR::Table here
|
||
|
|
sub headers_in {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return %{ $self->{r}->headers_in };
|
||
|
|
}
|
||
|
|
|
||
|
|
# searches for a given header and returns the value, or sets it
|
||
|
|
sub header_out {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
return $self->{r}->headers_out->{ $_[1] };
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->headers_out->{ $_[1] } = $_[2];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Do not want to return an APR::Table here
|
||
|
|
sub headers_out {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return %{ $self->{r}->headers_out };
|
||
|
|
}
|
||
|
|
|
||
|
|
# appends a value to a header
|
||
|
|
sub header_out_add {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->headers_out->add( $_[1], $_[2] );
|
||
|
|
}
|
||
|
|
|
||
|
|
# searches for a given header and returns the value, or sets it
|
||
|
|
sub err_header_out {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
return $self->{r}->err_headers_out->{ $_[1] };
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->err_headers_out->{ $_[1] } = $_[2];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# appends a value to a header
|
||
|
|
sub err_header_out_add {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->err_headers_out->add( $_[1], $_[2] );
|
||
|
|
}
|
||
|
|
|
||
|
|
# returns the ip address of the connected person
|
||
|
|
sub get_remote_ip {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->connection->client_ip;
|
||
|
|
}
|
||
|
|
|
||
|
|
# sets last modified
|
||
|
|
sub set_last_modified {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->set_last_modified( $_[1] );
|
||
|
|
}
|
||
|
|
|
||
|
|
sub status {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
$self->{r}->status( $_[1] + 0 );
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->status();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
sub status_line {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
if ( scalar(@_) == 2 ) {
|
||
|
|
|
||
|
|
# If we set status_line, we must also set status.
|
||
|
|
my ($status) = $_[1] =~ m/^(\d+)/;
|
||
|
|
$self->{r}->status($status);
|
||
|
|
return $self->{r}->status_line( $_[1] );
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $self->{r}->status_line();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# meets conditions
|
||
|
|
sub meets_conditions {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r}->meets_conditions;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub print {
|
||
|
|
my DW::Request::Apache2 $self = shift;
|
||
|
|
return $self->{r}->print(@_);
|
||
|
|
}
|
||
|
|
|
||
|
|
sub read {
|
||
|
|
my DW::Request::Apache2 $self = shift;
|
||
|
|
my $ret = $self->{r}->read(@_);
|
||
|
|
return $ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
# return the internal Apache2 request object
|
||
|
|
sub r {
|
||
|
|
my DW::Request::Apache2 $self = $_[0];
|
||
|
|
return $self->{r};
|
||
|
|
}
|
||
|
|
|
||
|
|
# calls the method as a handler.
|
||
|
|
sub call_response_handler {
|
||
|
|
my DW::Request::Apache2 $self = shift;
|
||
|
|
|
||
|
|
$self->{r}->handler('perl-script');
|
||
|
|
$self->{r}->push_handlers( PerlResponseHandler => $_[0] );
|
||
|
|
|
||
|
|
return Apache2::Const::OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
# constants
|
||
|
|
sub OK {
|
||
|
|
return Apache2::Const::OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_OK {
|
||
|
|
return Apache2::Const::HTTP_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_CREATED {
|
||
|
|
return Apache2::Const::HTTP_CREATED;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub MOVED_PERMANENTLY {
|
||
|
|
return Apache2::Const::HTTP_MOVED_PERMANENTLY;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub REDIRECT {
|
||
|
|
return Apache2::Const::REDIRECT;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub NOT_FOUND {
|
||
|
|
return Apache2::Const::NOT_FOUND;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_GONE {
|
||
|
|
return Apache2::Const::HTTP_GONE;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub SERVER_ERROR {
|
||
|
|
return Apache2::Const::SERVER_ERROR;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_UNAUTHORIZED {
|
||
|
|
return Apache2::Const::HTTP_UNAUTHORIZED;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_BAD_REQUEST {
|
||
|
|
return Apache2::Const::HTTP_BAD_REQUEST;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_UNSUPPORTED_MEDIA_TYPE {
|
||
|
|
return Apache2::Const::HTTP_UNSUPPORTED_MEDIA_TYPE;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_SERVER_ERROR {
|
||
|
|
return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_SERVICE_UNAVAILABLE {
|
||
|
|
return Apache2::Const::HTTP_SERVICE_UNAVAILABLE;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub HTTP_METHOD_NOT_ALLOWED {
|
||
|
|
return Apache2::Const::HTTP_METHOD_NOT_ALLOWED;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub FORBIDDEN {
|
||
|
|
return Apache2::Const::FORBIDDEN;
|
||
|
|
}
|
||
|
|
|
||
|
|
# spawn a process for an external program
|
||
|
|
sub spawn {
|
||
|
|
my DW::Request::Apache2 $self = shift;
|
||
|
|
return $self->{r}->spawn_proc_prog(@_);
|
||
|
|
}
|
||
|
|
|
||
|
|
sub no_cache {
|
||
|
|
my DW::Request::Apache2 $self = shift;
|
||
|
|
return $self->{r}->no_cache(1);
|
||
|
|
}
|
||
|
|
|
||
|
|
1;
|