]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
www: do not unescape PATH_INFO twice
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 26cd571cf571d52d9a3e97f0bf5a300cc3d715e0..62e4ca43511fc4962cbba6b59b0cdab18444fd99 100644 (file)
@@ -15,7 +15,8 @@ use strict;
 use warnings;
 use PublicInbox::Config;
 use PublicInbox::Hval;
-use URI::Escape qw(uri_escape_utf8 uri_unescape);
+use URI::Escape qw(uri_unescape);
+use PublicInbox::MID qw(mid_escape);
 require PublicInbox::Git;
 use PublicInbox::GitHTTPBackend;
 our $INBOX_RE = qr!\A/([\w\.\-]+)!;
@@ -41,11 +42,11 @@ sub call {
 
        # we don't care about multi-value
        my %qp = map {
-               my ($k, $v) = split('=', $_, 2);
+               my ($k, $v) = split('=', uri_unescape($_), 2);
                $v = '' unless defined $v;
                $v =~ tr/+/ /;
                ($k, $v)
-       } split(/[&;]/, uri_unescape($env->{QUERY_STRING}));
+       } split(/[&;]/, $env->{QUERY_STRING});
        $ctx->{qp} = \%qp;
 
        my $path_info = $env->{PATH_INFO};
@@ -95,6 +96,8 @@ sub call {
 
        } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/f/?\z!o) {
                r301($ctx, $1, $2);
+       } elsif ($path_info =~ m!$INBOX_RE/_/text(?:/(.*))?\z!o) {
+               get_text($ctx, $1, $2);
 
        # convenience redirects order matters
        } elsif ($path_info =~ m!$INBOX_RE/([^/]{2,})\z!o) {
@@ -109,8 +112,8 @@ sub call {
 sub preload {
        require PublicInbox::Feed;
        require PublicInbox::View;
-       require PublicInbox::Thread;
-       require Email::MIME;
+       require PublicInbox::SearchThread;
+       require PublicInbox::MIME;
        require Digest::SHA;
        require POSIX;
 
@@ -162,7 +165,7 @@ sub invalid_inbox_mid {
        my $ret = invalid_inbox($ctx, $inbox);
        return $ret if $ret;
 
-       $ctx->{mid} = $mid = uri_unescape($mid);
+       $ctx->{mid} = $mid;
        if ($mid =~ /\A[a-f0-9]{40}\z/) {
                # this is horiffically wasteful for legacy URLs:
                if ($mid = mid2blob($ctx)) {
@@ -222,8 +225,8 @@ sub get_mid_html {
        my $x = mid2blob($ctx) or return r404($ctx);
 
        require PublicInbox::View;
-       require Email::MIME;
-       my $mime = Email::MIME->new($x);
+       require PublicInbox::MIME;
+       my $mime = PublicInbox::MIME->new($x);
        searcher($ctx);
        PublicInbox::View::msg_html($ctx, $mime);
 }
@@ -237,6 +240,18 @@ sub get_thread {
        PublicInbox::View::thread_html($ctx);
 }
 
+# /$INBOX/_/text/$KEY/
+# /$INBOX/_/text/$KEY/raw
+# KEY may contain slashes
+sub get_text {
+       my ($ctx, $inbox, $key) = @_;
+       my $r404 = invalid_inbox($ctx, $inbox);
+       return $r404 if $r404;
+
+       require PublicInbox::WwwText;
+       PublicInbox::WwwText::get_text($ctx, $key);
+}
+
 sub ctx_get {
        my ($ctx, $key) = @_;
        my $val = $ctx->{$key};
@@ -353,7 +368,7 @@ sub r301 {
        }
        my $url = $obj->base_url($ctx->{env});
        my $qs = $ctx->{env}->{QUERY_STRING};
-       $url .= (uri_escape_utf8($mid) . '/') if (defined $mid);
+       $url .= (mid_escape($mid) . '/') if (defined $mid);
        $url .= $suffix if (defined $suffix);
        $url .= "?$qs" if $qs ne '';