1 package HTTP::Request::AsCGI;
5 use base 'Class::Accessor::Fast';
11 __PACKAGE__->mk_accessors( qw[ enviroment request stdin stdout stderr ] );
22 stdin => File::Temp->new,
23 stdout => File::Temp->new,
24 stderr => File::Temp->new
27 $self->{enviroment} = {
28 GATEWAY_INTERFACE => 'CGI/1.1',
29 HTTP_HOST => $request->uri->host_port,
30 QUERY_STRING => $request->uri->query || '',
31 SCRIPT_NAME => $request->uri->path || '/',
32 SERVER_NAME => $request->uri->host,
33 SERVER_PORT => $request->uri->port,
34 SERVER_PROTOCOL => $request->protocol || 'HTTP/1.1',
35 SERVER_SOFTWARE => __PACKAGE__ . "/" . $VERSION,
36 REMOTE_ADDR => '127.0.0.1',
37 REMOTE_HOST => 'localhost',
38 REMOTE_PORT => int( rand(64000) + 1000 ), # not in RFC 3875
39 REQUEST_URI => $request->uri->path || '/', # not in RFC 3875
40 REQUEST_METHOD => $request->method,
44 foreach my $field ( $request->headers->header_field_names ) {
48 $key = 'HTTP_' . $key unless $field =~ /^Content-(Length|Type)$/;
50 unless ( exists $self->{enviroment}->{$key} ) {
51 $self->{enviroment}->{$key} = $request->headers->header($field);
55 return $class->SUPER::new($self);
61 open( my $stdin, '>&', STDIN->fileno )
62 or croak("Can't dup stdin: $!");
64 open( my $stdout, '>&', STDOUT->fileno )
65 or croak("Can't dup stdout: $!");
67 open( my $stderr, '>&', STDERR->fileno )
68 or croak("Can't dup stderr: $!");
77 if ( $self->request->content_length ) {
79 $self->stdin->write( $self->request->content )
80 or croak("Can't write content: $!");
82 seek( $self->stdin, 0, 0 )
83 or croak("Can't seek stdin: $!");
86 %ENV = %{ $self->enviroment };
88 open( STDIN, '<&=', $self->stdin->fileno )
89 or croak("Can't open stdin: $!");
91 open( STDOUT, '>&=', $self->stdout->fileno )
92 or croak("Can't open stdout: $!");
94 open( STDERR, '>&=', $self->stderr->fileno )
95 or croak("Can't open stderr: $!");
103 %ENV = %{ $self->{restore}->{enviroment} };
105 open( STDIN, '>&', $self->{restore}->{stdin} )
106 or croak("Can't restore stdin: $!");
108 open( STDOUT, '>&', $self->{restore}->{stdout} )
109 or croak("Can't restore stdout: $!");
111 open( STDERR, '>&', $self->{restore}->{stderr} )
112 or croak("Can't restore stderr: $!");
119 $self->restore unless $self->{restored};
128 HTTP::Request::AsCGI - Create a CGI enviroment from a HTTP::Request
158 Christian Hansen, C<ch@ngmedia.com>
162 This library is free software. You can redistribute it and/or modify
163 it under the same terms as perl itself.