- [ "200 OK", {'Content-Type' => 'text/html'},
- PublicInbox::View->as_html(Email::MIME->new($$x))];
-}
-
-# only used for CGI and static file generation modes
-sub set_binmode {
- my ($headers) = @_;
- if ($headers->{'Content-Type'} eq 'text/plain') {
- # no way to validate raw messages, mixed encoding is possible.
- binmode STDOUT;
- } else { # strict encoding for HTML and XML
- binmode STDOUT, ':encoding(UTF-8)';
+ [ 200, [ 'Content-Type' => 'text/html' ],
+ [ PublicInbox::View->as_html(Email::MIME->new($$x))] ];
+}
+
+sub self_url {
+ my ($cgi) = @_;
+ ref($cgi) eq 'CGI' ? $cgi->self_url : $cgi->uri->as_string;
+}
+
+sub redirect_list_index {
+ my ($ctx, $cgi) = @_;
+ do_redirect(self_url($cgi) . "/");
+}
+
+sub redirect_mid {
+ my ($ctx, $cgi) = @_;
+ my $url = self_url($cgi);
+ $url =~ s!/f/!/m/!;
+ do_redirect($url . '.html');
+}
+
+sub do_redirect {
+ my ($url) = @_;
+ [ 301,
+ [ Location => $url, 'Content-Type' => 'text/plain' ],
+ [ "Redirecting to $url\n" ]
+ ]
+}
+
+sub psgi_app {
+ # preload so we are CoW friendly
+ require PublicInbox::Feed;
+ require PublicInbox::View;
+ require Mail::Thread;
+ require Digest::SHA;
+ require POSIX;
+ require XML::Atom::SimpleFeed;
+ require Plack::Request;
+ sub {
+ my $req = Plack::Request->new(@_);
+ main($req, $req->method);
+ };
+}
+
+sub cgi_print {
+ my ($ret) = @_;
+ my ($status, $headers, $body) = @$ret;
+ my %codes = (
+ 200 => 'OK',
+ 301 => 'Moved Permanently',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ );
+
+ print "Status: $status $codes{$status}\r\n";
+ my @tmp = @$headers;
+ while (my ($k, $v) = splice(@tmp, 0, 2)) {
+ print "$k: $v\r\n";