CGI-Info

 view release on metacpan or  search on metacpan

t/edge_cases.t  view on Meta::CPAN

    $ENV{REQUEST_METHOD}    = 'GET';
    $ENV{CONTENT_TYPE}      = 'multipart/form-data; boundary=--b';
    $ENV{QUERY_STRING}      = 'x=1';
    $ENV{REMOTE_ADDR}       = '1.2.3.4';

    my $info = CGI::Info->new();
    my $p    = eval { $info->params() };
    ok(!$@, 'does not die on multipart GET');
    # Source says: multipart/form-data not supported for GET
    is($info->status(), 501, 'multipart GET returns 501 Not Implemented');
};

subtest 'POST: unsupported content-type handled without dying' => sub {
    reset_env();
    $ENV{GATEWAY_INTERFACE}    = 'CGI/1.1';
    $ENV{REQUEST_METHOD}       = 'POST';
    $ENV{CONTENT_TYPE}         = 'application/octet-stream';
    my $body                   = "\x00\x01\x02\x03binary";
    $ENV{CONTENT_LENGTH}       = length($body);
    $CGI::Info::stdin_data     = $body;

    my $info = CGI::Info->new();
    my $p    = eval { $info->params() };
    ok(!$@, 'does not die on unsupported content-type POST');
};

# ============================================================
# 8. Script path edge cases
# ============================================================

subtest 'script_path: SCRIPT_FILENAME with spaces in path' => sub {
    reset_env();
    $ENV{SCRIPT_FILENAME} = '/var/www/my scripts/app.cgi';

    my $info = CGI::Info->new();
    my $path = eval { $info->script_path() };
    ok(!$@, 'does not die on SCRIPT_FILENAME with spaces');
};

subtest 'script_name: called multiple times returns same value' => sub {
    reset_env();
    $ENV{SCRIPT_NAME} = '/cgi-bin/myapp.cgi';

    my $info = CGI::Info->new();
    my $n1   = $info->script_name();
    my $n2   = $info->script_name();
    is($n1, $n2, 'script_name() idempotent across multiple calls');
};

subtest 'script_dir: called multiple times returns same value' => sub {
    reset_env();
    $ENV{SCRIPT_FILENAME} = '/var/www/cgi-bin/app.cgi';

    my $info = CGI::Info->new();
    my $d1   = $info->script_dir();
    my $d2   = $info->script_dir();
    is($d1, $d2, 'script_dir() idempotent across multiple calls');
};

# ============================================================
# 9. Cookie edge cases
# ============================================================

subtest 'cookie: name with all valid RFC6265 token chars' => sub {
    reset_env();
    # RFC6265 token chars: visible ASCII except separators
    $ENV{HTTP_COOKIE} = 'valid-name.ok=value123';

    my $info = CGI::Info->new();
    my $val  = eval { $info->cookie('valid-name.ok') };
    ok(!$@, 'does not die on RFC6265-valid cookie name with dots and hyphens');
};

subtest 'cookie: value with equals sign inside' => sub {
    reset_env();
    $ENV{HTTP_COOKIE} = 'token=base64==pad==';

    my $info = CGI::Info->new();
    my $val  = eval { $info->cookie('token') };
    ok(!$@, 'does not die on cookie value with embedded equals signs');
    # The split is on first = so value should contain the rest
    ok(defined $val, 'cookie with embedded = returns a value');
};

subtest 'cookie: requesting absent cookie from populated jar' => sub {
    reset_env();
    $ENV{HTTP_COOKIE} = 'a=1; b=2; c=3';

    my $info = CGI::Info->new();
    $info->cookie('a');    # populate jar
    my $val = eval { $info->cookie('z') };
    ok(!$@,        'does not die looking up absent key after jar populated');
    ok(!defined $val, 'absent cookie returns undef');
};

subtest 'cookie: empty cookie jar string' => sub {
    reset_env();
    $ENV{HTTP_COOKIE} = '';

    my $info = CGI::Info->new();
    my $val  = eval { $info->cookie('anything') };
    ok(!$@,       'does not die on empty HTTP_COOKIE');
    ok(!defined $val, 'empty cookie jar returns undef');
};

# ============================================================
# 10. as_string edge cases
# ============================================================

subtest 'as_string: value containing semicolons and equals escaped' => sub {
    reset_env();
    $ENV{GATEWAY_INTERFACE} = 'CGI/1.1';
    $ENV{REQUEST_METHOD}    = 'GET';
    $ENV{QUERY_STRING}      = 'expr=a%3Db%3Bc%3Dd';  # a=b;c=d

    my $info = CGI::Info->new();
    my $p    = eval { $info->params() };
    if(defined $p) {
        my $str = $info->as_string();
        # Escaped mode must escape ; and = in values
        unlike($str, qr/expr=.*[^\\][;=]/,



( run in 1.397 second using v1.01-cache-2.11-cpan-39bf76dae61 )