From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: meta@public-inbox.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id B9E0863380A; Thu, 27 Aug 2015 04:34:05 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: Eric Wong Subject: [PATCH 2/5] wire up shorter, less ambiguous URLs Date: Thu, 27 Aug 2015 04:33:59 +0000 Message-Id: <1440650042-26176-3-git-send-email-e@80x24.org> In-Reply-To: <1440650042-26176-1-git-send-email-e@80x24.org> References: <1440650042-26176-1-git-send-email-e@80x24.org> List-Id: We will prefer URLs without suffixes for now to avoid ambiguity in case a Message-ID ends with ".html", ".txt", ".mbox.gz" or any other suffix we may use. Static file compatibility is preserved by using a trailing slash as most servers can/will fall back to an index.html file in this case. For raw text files, we will follow gmane's lead with "/raw" --- lib/PublicInbox/WWW.pm | 13 ++++++++++--- t/cgi.t | 2 +- t/plack.t | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 527d213..ca338fb 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -40,12 +40,18 @@ sub run { invalid_list(\%ctx, $1) || get_atom(\%ctx); # single-message pages + } elsif ($path_info =~ m!$LISTNAME_RE/m/(\S+)/\z!o) { + invalid_list_mid(\%ctx, $1, $2) || get_mid_html(\%ctx); + } elsif ($path_info =~ m!$LISTNAME_RE/m/(\S+)/raw\z!o) { + invalid_list_mid(\%ctx, $1, $2) || get_mid_txt(\%ctx); } elsif ($path_info =~ m!$LISTNAME_RE/m/(\S+)\.txt\z!o) { invalid_list_mid(\%ctx, $1, $2) || get_mid_txt(\%ctx); } elsif ($path_info =~ m!$LISTNAME_RE/m/(\S+)\.html\z!o) { invalid_list_mid(\%ctx, $1, $2) || get_mid_html(\%ctx); # full-message page + } elsif ($path_info =~ m!$LISTNAME_RE/f/(\S+)/\z!o) { + invalid_list_mid(\%ctx, $1, $2) || get_full_html(\%ctx); } elsif ($path_info =~ m!$LISTNAME_RE/f/(\S+)\.html\z!o) { invalid_list_mid(\%ctx, $1, $2) || get_full_html(\%ctx); @@ -53,7 +59,8 @@ sub run { } elsif ($path_info =~ m!$LISTNAME_RE/t/(\S+)\.html\z!o) { invalid_list_mid(\%ctx, $1, $2) || get_thread(\%ctx); - } elsif ($path_info =~ m!$LISTNAME_RE/t/(\S+)\.mbox(\.gz)?\z!o) { + } elsif ($path_info =~ m!$LISTNAME_RE/t/(\S+)/mbox(\.gz)?\z!ox || + $path_info =~ m!$LISTNAME_RE/t/(\S+)\.mbox(\.gz)?\z!o) { my $sfx = $3; invalid_list_mid(\%ctx, $1, $2) || get_thread_mbox(\%ctx, $sfx); @@ -325,8 +332,8 @@ sub msg_pfx { "../f/$href.html"; } -# /$LISTNAME/t/$MESSAGE_ID.mbox -> thread as mbox -# /$LISTNAME/t/$MESSAGE_ID.mbox.gz -> thread as gzipped mbox +# /$LISTNAME/t/$MESSAGE_ID/mbox -> thread as mbox +# /$LISTNAME/t/$MESSAGE_ID/mbox.gz -> thread as gzipped mbox # note: I'm not a big fan of other compression formats since they're # significantly more expensive on CPU than gzip and less-widely available, # especially on older systems. Stick to zlib since that's what git uses. diff --git a/t/cgi.t b/t/cgi.t index e87f7dc..020dfe7 100644 --- a/t/cgi.t +++ b/t/cgi.t @@ -183,7 +183,7 @@ EOF { local $ENV{HOME} = $home; local $ENV{PATH} = $main_path; - my $path = "/test/t/blahblah%40example.com.mbox.gz"; + my $path = "/test/t/blahblah%40example.com/mbox.gz"; my $res = cgi_run($path); like($res->{head}, qr/^Status: 501 /, "search not-yet-enabled"); my $indexed = system($index, $maindir) == 0; diff --git a/t/plack.t b/t/plack.t index 85dd337..ed41ab1 100644 --- a/t/plack.t +++ b/t/plack.t @@ -101,6 +101,25 @@ EOF qr!link\s+href="\Q$pfx\E/m/blah%40example\.com\.html"!s, 'atom feed generated correct URL'); }); + + foreach my $t (qw(f m)) { + test_psgi($app, sub { + my ($cb) = @_; + my $pfx = 'http://example.com/test'; + my $path = "/$t/blah%40example.com/"; + my $res = $cb->(GET($pfx . $path)); + is(200, $res->code, "success for $path"); + like($res->content, qr!hihi - Me!, + "HTML returned"); + }); + } + test_psgi($app, sub { + my ($cb) = @_; + my $pfx = 'http://example.com/test'; + my $res = $cb->(GET($pfx . '/m/blah%40example.com/raw')); + is(200, $res->code, 'success response received for /m/*/raw'); + like($res->content, qr!\AFrom !, "mbox returned"); + }); } done_testing(); -- EW