| #!/usr/bin/perl |
| # Copyright 2011 The Go Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| # |
| # Test script run as a child process under cgi_test.go |
| |
| use strict; |
| use Cwd; |
| |
| binmode STDOUT; |
| |
| my $q = MiniCGI->new; |
| my $params = $q->Vars; |
| |
| if ($params->{"loc"}) { |
| print "Location: $params->{loc}\r\n\r\n"; |
| exit(0); |
| } |
| |
| print "Content-Type: text/html\r\n"; |
| print "X-CGI-Pid: $$\r\n"; |
| print "X-Test-Header: X-Test-Value\r\n"; |
| print "\r\n"; |
| |
| if ($params->{"writestderr"}) { |
| print STDERR "Hello, stderr!\n"; |
| } |
| |
| if ($params->{"bigresponse"}) { |
| # 17 MB, for OS X: golang.org/issue/4958 |
| for (1..(17 * 1024)) { |
| print "A" x 1024, "\r\n"; |
| } |
| exit 0; |
| } |
| |
| print "test=Hello CGI\r\n"; |
| |
| foreach my $k (sort keys %$params) { |
| print "param-$k=$params->{$k}\r\n"; |
| } |
| |
| foreach my $k (sort keys %ENV) { |
| my $clean_env = $ENV{$k}; |
| $clean_env =~ s/[\n\r]//g; |
| print "env-$k=$clean_env\r\n"; |
| } |
| |
| # NOTE: msys perl returns /c/go/src/... not C:\go\.... |
| my $dir = getcwd(); |
| if ($^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin') { |
| if ($dir =~ /^.:/) { |
| $dir =~ s!/!\\!g; |
| } else { |
| my $cmd = $ENV{'COMSPEC'} || 'c:\\windows\\system32\\cmd.exe'; |
| $cmd =~ s!\\!/!g; |
| $dir = `$cmd /c cd`; |
| chomp $dir; |
| } |
| } |
| print "cwd=$dir\r\n"; |
| |
| # A minimal version of CGI.pm, for people without the perl-modules |
| # package installed. (CGI.pm used to be part of the Perl core, but |
| # some distros now bundle perl-base and perl-modules separately...) |
| package MiniCGI; |
| |
| sub new { |
| my $class = shift; |
| return bless {}, $class; |
| } |
| |
| sub Vars { |
| my $self = shift; |
| my $pairs; |
| if ($ENV{CONTENT_LENGTH}) { |
| $pairs = do { local $/; <STDIN> }; |
| } else { |
| $pairs = $ENV{QUERY_STRING}; |
| } |
| my $vars = {}; |
| foreach my $kv (split(/&/, $pairs)) { |
| my ($k, $v) = split(/=/, $kv, 2); |
| $vars->{_urldecode($k)} = _urldecode($v); |
| } |
| return $vars; |
| } |
| |
| sub _urldecode { |
| my $v = shift; |
| $v =~ tr/+/ /; |
| $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; |
| return $v; |
| } |