#!/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;
}
