WebDyne
view release on metacpan or search on metacpan
lib/WebDyne/Request/PSGI.pm view on Meta::CPAN
$VERSION='2.075';
# Debug load
#
debug("Loading %s version $VERSION", __PACKAGE__);
# Save local copy of environment for ref by Dir_config handler. ENV is reset for each request,
# so must use a snapshot for simulating r->dir_config
#
my %Dir_config_env=%{$WEBDYNE_PSGI_ENV_SET}, (map { $_=>$ENV{$_} } (
qw(DOCUMENT_DEFAULT DOCUMENT_ROOT),
@{$WEBDYNE_PSGI_ENV_KEEP},
grep {/WebDyne/i} keys %ENV
));
# All done. Positive return
#
1;
#==================================================================================================
sub new {
# New PSGI request
#
my ($class, %r)=@_;
debug("$class, r: %s, calller:%s", Dumper(\%r, [caller(0)]));
# Try to figure out filename user wants
#
unless ($r{'filename'}) {
# Not supplied - need to work out
#
debug('filename not supplied, determining from request');
# Iterate through options. If *not* supplied by SCRIPT_FILENAME keep going.
#
my $fn;
unless (($fn=$ENV{'SCRIPT_FILENAME'}) && !$r{'uri'}) {
# Need to calc from document root in PSGI environment
#
debug('not supplied in SCRIPT_FILENAME or r{uri}. calculating');
if (my $dn=($r{'document_root'} || $ENV{'DOCUMENT_ROOT'} || $Dir_config_env{'DOCUMENT_ROOT'} || $DOCUMENT_ROOT)) {
# Get from URI and location
#
my $uri=$r{'uri'} || $ENV{'PATH_INFO'} || $ENV{'SCRIPT_NAME'};
debug("uri: $uri");
$fn=File::Spec->catfile($dn, split m{/+}, $uri); #/
debug("fn: $fn from dn: $dn, uri: $uri");
}
# IIS/FastCGI, not tested recently unsure if works
#
elsif ($fn=$ENV{'PATH_TRANSLATED'}) {
# Feel free to let me know a better way under IIS/FastCGI ..
my $script_fn=(File::Spec::Unix->splitpath($ENV{'SCRIPT_NAME'}))[2];
$fn=~s/\Q$script_fn\E.*/$script_fn/;
debug("fn: $fn derived from PATH_TRANSLATED script_fn: $script_fn");
}
# Need to add default psp file ?
#
#unless ($fn=~/\.psp$/) { # fastest
unless ($fn=~WEBDYNE_PSP_EXT_RE) { # fastest
# Is it a directory that exists ? Only append default document if that is the case, else let the api code
# handle it
#
if ((-d $fn) || !$fn) {
# Append default doc to path, which appears at moment to be a directory ?
#
my $document_default=$r{'document_default'} || $Dir_config_env{'DOCUMENT_DEFAULT'} || $DOCUMENT_DEFAULT;
debug("appending document default $document_default to fn:$fn");
# If absolute path just use it
#
if (File::Spec->file_name_is_absolute($document_default)) {
# Yep - absolute path
#
$fn=$document_default
}
else {
# Otherwise append to existing path
#
$fn=File::Spec->catfile($fn, split m{/+}, $document_default); #/
}
}
else {
# Not .psp file, do not want
#
$fn=undef;
}
}
}
# Final sanity check
#
debug("final fn: $fn");
$r{'filename'}=$fn;
}
# Finished, pass back
#
return bless \%r, $class;
}
sub new_from_filename {
# Test method, not used
#
my ($class, $fn, $select_fh)=@_;
my %r=(filename=>$fn, select=>$select_fh, env=>\%ENV);
return bless(\%r, $class);
}
sub content_type {
my $r=shift();
my $hr=$r->headers_out();
#@_ ? $r->headers_out()->{'Content-Type'}=shift() : $r->SUPER::content_type();
return @_ ? $r->headers_out()->{'Content-Type'}=shift() : ($r->headers_out()->{'Content-Type'} || $ENV{'CONTENT_TYPE'});
}
sub custom_response {
my ($r, $status)=(shift(), shift());
while ($r->prev) {$r=$r->prev}
debug("in custom response, status $status");
@_ ? $r->{'custom_response'}{$status}=shift() : $r->{'custom_response'}{$status};
}
sub filename {
( run in 2.015 seconds using v1.01-cache-2.11-cpan-71847e10f99 )