/usr/local/CPAN/PAB3/PAB3/Output/CGI.pm


package PAB3::Output::CGI;
# =============================================================================
# Perl Application Builder
# Module: PAB3::Output::CGI
# TIEHANDLE for CGI output
# =============================================================================
use strict;
no strict 'refs';
use warnings;
no warnings 'untie', 'uninitialized';

use vars qw($VERSION);

BEGIN {
	if( ! $PAB3::CGI::VERSION ) {
		die '>> Please do not use PAB3::Output::CGI directly, use PAB3::CGI instead <<';
	}
	$VERSION = $PAB3::CGI::VERSION;
}

1;

sub TIEHANDLE {
    my $class = shift;
    bless [ @_ ], $class;
}

sub HEADER_MODPERL {
	my( $key, $val ) = @_;
	if( $key eq 'content-type' ) {
		$GLOBAL::MPREQ->content_type( $val );
		return 0;
	}
	elsif( $key eq 'content-length' ) {
		goto hm_plain if $GLOBAL::MODPERL == 1;
		$GLOBAL::MPREQ->set_content_length( $val );
	}
	elsif( $key eq 'status' ) {
		if( $val =~ m!\s*(\d+)\s+(.+)! ) {
			$GLOBAL::MPREQ->status( $1 );
			$GLOBAL::MPREQ->status_line( $1 . ' ' . $2 );
			return $1 >= 300 ? 0 : 1;
		}
		else {
			$GLOBAL::MPREQ->status( $val );
			return int( $val ) >= 300 ? 0 : 1;
		}
	}
	elsif( $key eq 'intredir' ) {
		$GLOBAL::MPREQ->internal_redirect( $val );
		return 0;
	}
	elsif( $key eq 'location' ) {
		$GLOBAL::MPREQ->status( 302 );
		$GLOBAL::MPREQ->headers_out->set( 'location', $val );
		$GLOBAL::MPREQ->print( "" );
		return 0;
	}
	else {
hm_plain:
		$GLOBAL::MPREQ->headers_out->set( $key, $val );
	}
	return 1;
}

sub SENDHEADER {
	my( $needct, $key, $val, $ret );
	untie *STDOUT;
	binmode STDOUT;
	if( $GLOBAL::MODPERL == 2 ) {
		if( $GLOBAL::MPREQ->handler() eq 'modperl' ) {
			tie *STDOUT, $GLOBAL::MPREQ;
		}
	}
	elsif( $GLOBAL::MODPERL == 1 ) {
		tie *STDOUT, $GLOBAL::MPREQ;
	}
	$needct = 1;
	if( $GLOBAL::MODPERL ) {
		foreach $key( keys %PAB3::CGI::HEAD ) {
			$needct = 0 if $needct && ($key eq 'content-type' || $key eq 'location');
			if( ref( $PAB3::CGI::HEAD{$key} ) ) {
				foreach $val( @{$PAB3::CGI::HEAD{$key}} ) {
					$ret = &HEADER_MODPERL( $key, $val );
					$needct = $ret if $needct;
				}
			}
			else {
				$ret = &HEADER_MODPERL( $key, $PAB3::CGI::HEAD{$key} );
				$needct = $ret if $needct;
			}
		}
	}
	else {
		if( ( $val = $PAB3::CGI::HEAD{'status'} ) ) {
			print "Status: $val\015\012";
			$val = $val->[-1] if ref( $val );
			if( $val =~ m!\s*(\d+)\s+! ) {
				$needct = 0 if $needct && $1 >= 300;
			}
			else {
				$needct = 0 if $needct && int( $val ) >= 300;
			}
			delete $PAB3::CGI::HEAD{'status'};
		}
		foreach $key( keys %PAB3::CGI::HEAD ) {
			$needct = 0 if $needct && ($key eq 'content-type' || $key eq 'location');
			if( ref( $PAB3::CGI::HEAD{$key} ) ) {
				foreach( @{$PAB3::CGI::HEAD{$key}} ) {
		    		print $key . ': ' . $_ . "\015\012";
				}
			}
			else {
	    		print $key . ': ' . $PAB3::CGI::HEAD{$key} . "\015\012";
			}
		}
	}
	if( $needct ) {
		$val =
			'text/html; charset: '
			. ( $ENV{'CHARSET'} || 'iso-8859-1' )
		;
		if( $GLOBAL::MODPERL ) {
			$GLOBAL::MPREQ->content_type( $val );
		}
		else {
			print 'content-type: ', $val, "\015\012";
		}
	}
	if( ! $GLOBAL::MODPERL ) {
		print "\015\012\015\012";
	}
	$PAB3::CGI::HeaderDone = [ caller(2) ];
}

sub PRINT {
    my $self = shift;
	&SENDHEADER();
	print @_;
}

sub PRINTF {
    my $self  = shift;
	&SENDHEADER();
	printf @_;
}

sub BINMODE {
}

sub CLOSE {
}

sub FILENO {
}

sub GETC {
}

sub OPEN {
}

sub READ {
}


sub WRITE {
	my $self = shift;
	&SENDHEADER();
	write @_;
}

__END__