summaryrefslogtreecommitdiffstats
path: root/LayoutTests/http/tests/resources/post-and-verify-hybrid.cgi
blob: 2cc826a6ed99478f59dd334e7afaa24be6b1f27c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/perl -w

use Config;

print "Content-type: text/plain\n\n";

if ($ENV{'REQUEST_METHOD'} eq "POST") {
    if ($ENV{'CONTENT_LENGTH'}) {
        read(STDIN, $postData, $ENV{'CONTENT_LENGTH'}) || die "Could not get post data\n";
    } else {
        $postData = "";
    }

    @list = split(/&/, $ENV{'QUERY_STRING'});
    @values;
    $values{'start'} = 0;
    $values{'length'} = -1;
    $values{'convert_newlines'} = 0;
    foreach $element (@list) {
        ($key, $value) = split(/=/, $element);
        $values{$key} = $value;
    }

    # 'items' parameter would look like:
    #   <items> := <item>(','<item>)*
    #    <item> := <file> | <data>
    #    <file> := "file":<file-path>
    #    <data> := "data":<data-string>
    @items = split(/,/, $values{'items'});
    $expectedData = "";
    $readPos = $values{'start'};
    $remainingLength = $values{'length'};
    foreach $item (@items) {
        my ($type, $data) = split(/:/, $item);
        my $size;
        if ($type eq "data") {
            $data =~ s/%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg;
            $size = length($data);
            if ($readPos > 0) {
                if ($readPos > $size) {
                    $readPos -= $size;
                    next;
                }
                $data = substr($data, $readPos);
            }
            $data = substr($data, 0, $remainingLength) if ($remainingLength > 0);
        } else {
            $path = $data;
            open(FILE, $path) || next;
            $size = -s $path;
            if ($readPos > 0) {
                if ($readPos > $size) {
                    $readPos -= $size;
                    next;
                }
                seek(FILE, $readPos, 0);
            }
            if ($remainingLength > 0) {
                read(FILE, $data, $remainingLength);
            } else {
                local $/ = undef;
                $data = <FILE>;
            }
            close(FILE);
        }
        $readPos -= $size;
        $expectedData .= $data;
        if ($remainingLength > 0) {
            $remainingLength -= length($data);
            last if $remainingLength <= 0;
        }
    }

    if ($values{'convert_newlines'}) {
        $nativeEnding = ($Config{osname} =~ /(MSWin|cygwin)/) ? "\r\n" : "\n";
        $postData =~ s/$nativeEnding/[NL]/g;
    }

    if ($postData eq $expectedData) {
        print "OK";
    } else {
        print "FAILED";
    }
} else {
    print "Wrong method: " . $ENV{'REQUEST_METHOD'} . "\n";
}