]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
update copyrights for 2018
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 13b3921dc808783ba85d77a3af0bcf57b872858f..4ddc187b7b46e9e6b928a200d1fb1c7109a1d2ce 100644 (file)
@@ -1,5 +1,5 @@
-# Copyright (C) 2014-2015 all contributors <meta@public-inbox.org>
-# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
+# Copyright (C) 2014-2018 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Main web interface for mailing list archives
 #
@@ -42,6 +42,7 @@ sub call {
 
        # we don't care about multi-value
        my %qp = map {
+               utf8::decode($_);
                my ($k, $v) = split('=', uri_unescape($_), 2);
                $v = '' unless defined $v;
                $v =~ tr/+/ /;
@@ -52,10 +53,14 @@ sub call {
        my $path_info = $env->{PATH_INFO};
        my $method = $env->{REQUEST_METHOD};
 
-       if ($method eq 'POST' &&
-                $path_info =~ m!$INBOX_RE/(git-upload-pack)\z!) {
-               my $path = $2;
-               return invalid_inbox($ctx, $1) || serve_git($ctx, $path);
+       if ($method eq 'POST') {
+               if ($path_info =~ m!$INBOX_RE/(git-upload-pack)\z!) {
+                       my $path = $2;
+                       return invalid_inbox($ctx, $1) ||
+                               serve_git($ctx, $path);
+               } elsif ($path_info =~ m!$INBOX_RE/!o) {
+                       return invalid_inbox($ctx, $1) || mbox_results($ctx);
+               }
        }
        elsif ($method !~ /\AGET|HEAD\z/) {
                return r(405, 'Method Not Allowed');
@@ -399,6 +404,16 @@ sub serve_git {
        PublicInbox::GitHTTPBackend::serve($ctx->{env}, $ctx->{git}, $path);
 }
 
+sub mbox_results {
+       my ($ctx) = @_;
+       if ($ctx->{env}->{QUERY_STRING} =~ /(?:\A|[&;])q=/) {
+               searcher($ctx) or return need_search($ctx);
+               require PublicInbox::SearchView;
+               return PublicInbox::SearchView::mbox_results($ctx);
+       }
+       r404();
+}
+
 sub serve_mbox_range {
        my ($ctx, $inbox, $range) = @_;
        invalid_inbox($ctx, $inbox) || eval {