#!perl -w # Copyright (C) 2014-2021 all contributors # License: AGPL-3.0+ use strict; use v5.10.1; use PublicInbox::TestCommon; use IO::Uncompress::Gunzip qw(gunzip); use PublicInbox::Eml; use IO::Handle; my ($tmpdir, $for_destroy) = tmpdir(); require_mods(qw(Plack::Handler::CGI Plack::Util)); my $slashy_mid = 'slashy/asdf@example.com'; my $ibx = create_inbox 'test', tmpdir => "$tmpdir/test", sub { my ($im, $ibx) = @_; mkdir "$ibx->{inboxdir}/home", 0755 or BAIL_OUT; mkdir "$ibx->{inboxdir}/home/.public-inbox", 0755 or BAIL_OUT; my $eml = PublicInbox::Eml->new(< To: You Cc: $ibx->{-primary_address} Message-Id: Subject: hihi Date: Thu, 01 Jan 1970 00:00:00 +0000 zzzzzz EOF $im->add($eml) or BAIL_OUT; $eml->header_set('Message-ID', ''); $eml->body_set("z\n" x 1024); $im->add($eml) or BAIL_OUT; $eml = PublicInbox::Eml->new(< To: Me Cc: $ibx->{-primary_address} In-Reply-To: Message-Id: Subject: Re: hihi Date: Thu, 01 Jan 1970 00:00:01 +0000 Me wrote: > zzzzzz what? EOF $im->add($eml) or BAIL_OUT; $eml = PublicInbox::Eml->new(< To: Me Cc: $ibx->{-primary_address} Message-Id: <$slashy_mid> Subject: Re: hihi Date: Thu, 01 Jan 1970 00:00:01 +0000 slashy EOF $im->add($eml) or BAIL_OUT; }; # create_inbox my $home = "$ibx->{inboxdir}/home"; open my $cfgfh, '>>', "$home/.public-inbox/config" or BAIL_OUT $!; print $cfgfh <{-primary_address} inboxdir = $ibx->{inboxdir} EOF $cfgfh->flush or BAIL_OUT $!; { local $ENV{HOME} = $home; my $res = cgi_run("/test/slashy/asdf\@example.com/raw"); like($res->{body}, qr/Message-Id: <\Q$slashy_mid\E>/, "slashy mid raw hit"); } # retrieve thread as an mbox SKIP: { local $ENV{HOME} = $home; my $path = "/test/blahblah\@example.com/t.mbox.gz"; my $res = cgi_run($path); like($res->{head}, qr/^Status: 501 /, "search not-yet-enabled"); my $cmd = ['-index', $ibx->{inboxdir}, '--max-size=2k']; print $cfgfh "\tindexlevel = basic\n" or BAIL_OUT $!; $cfgfh->flush or BAIL_OUT $!; my $opt = { 2 => \(my $err) }; my $indexed = run_script($cmd, undef, $opt); if ($indexed) { $res = cgi_run($path); like($res->{head}, qr/^Status: 200 /, "search returned mbox"); my $in = $res->{body}; my $out; gunzip(\$in => \$out); like($out, qr/^From /m, "From lines in mbox"); $res = cgi_run('/test/toobig@example.com/'); like($res->{head}, qr/^Status: 300 /, 'did not index or return >max-size message'); like($err, qr/skipping [a-f0-9]{40,}/, 'warned about skipping large OID'); } else { like($res->{head}, qr/^Status: 501 /, "search not available"); skip('DBD::SQLite not available', 7); # (4 - 1) above, 4 below } require_mods('XML::TreePP', 4); $path = "/test/blahblah\@example.com/t.atom"; $res = cgi_run($path); like($res->{head}, qr/^Status: 200 /, "atom returned 200"); like($res->{head}, qr!^Content-Type: application/atom\+xml!m, "search returned atom"); my $t = XML::TreePP->new->parse($res->{body}); is(scalar @{$t->{feed}->{entry}}, 3, "parsed three entries"); like($t->{feed}->{-xmlns}, qr/\bAtom\b/, 'looks like an an Atom feed'); } done_testing(); sub cgi_run { my $env = { PATH_INFO => $_[0], QUERY_STRING => $_[1] || "", SCRIPT_NAME => '', REQUEST_URI => $_[0] . ($_[1] ? "?$_[1]" : ''), REQUEST_METHOD => $_[2] || "GET", GATEWAY_INTERFACE => 'CGI/1.1', HTTP_ACCEPT => '*/*', HTTP_HOST => 'test.example.com', }; my ($in, $out, $err) = ("", "", ""); my $rdr = { 0 => \$in, 1 => \$out, 2 => \$err }; run_script(['.cgi'], $env, $rdr); fail "unexpected error: \$?=$? ($err)" if $?; my ($head, $body) = split(/\r\n\r\n/, $out, 2); { head => $head, body => $body, err => $err } }