From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 671581F463; Thu, 26 Sep 2019 03:03:57 +0000 (UTC) Date: Thu, 26 Sep 2019 03:03:57 +0000 From: Eric Wong To: edef Cc: meta@public-inbox.org, hi@alyssa.is Subject: Re: [PATCH 0/1] Fix broken clone URLs due to SCRIPT_NAME getting reset Message-ID: <20190926030357.GA21009@dcvr> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: List-Id: edef wrote: > We're trying to get public-inbox working with a PSGI file that mounts > it to a subdirectory. This seems like it's intended to be a supported > use case, with stuff paying attention to SCRIPT_NAME and all when > generating URLs. > > However, Plack::App::URLMap seems determined to reset SCRIPT_NAME > before getline gets called: > > my $orig_path_info = $env->{PATH_INFO}; > my $orig_script_name = $env->{SCRIPT_NAME}; > > $env->{PATH_INFO} = $path; > $env->{SCRIPT_NAME} = $script_name . $location; > return $self->response_cb($app->($env), sub { > $env->{PATH_INFO} = $orig_path_info; > $env->{SCRIPT_NAME} = $orig_script_name; > }); Sounds like a familiar problem to me :x > I'm not sure whether public-inbox or Plack is in the wrong here, but > the timing works out poorly. By the time > PublicInbox::WwwStream::_html_end gets invoked SCRIPT_NAME is blank, > and the wrong URLs get generated. > > Copying env seems to fix it, and that's what the attached patch does. > I'm pretty sure this is the wrong approach, but it seems to work. Yeah, it's a big hash and not needed to copy the whole thing. I gotta run, now, but I think the patch below will work for you by precalculating base_url up front. Can you confirm? Thanks. Also, I suspect the mbox Archived-At headers could be wrong and need a similar change... Maybe Atom feeds, too. diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm index e0823c8d..b240c071 100644 --- a/lib/PublicInbox/WwwStream.pm +++ b/lib/PublicInbox/WwwStream.pm @@ -19,7 +19,17 @@ sub close {} sub new { my ($class, $ctx, $cb) = @_; - bless { nr => 0, cb => $cb || *close, ctx => $ctx }, $class; + + my $env = $ctx->{env}; + my $ibx = $ctx->{-inbox}; + my $base_url = $ibx->base_url($env); + chop $base_url; # no trailing slash for clone + bless { + nr => 0, + cb => $cb || *close, + ctx => $ctx, + base_url => $base_url, + }, $class; } sub response { @@ -83,8 +93,7 @@ sub _html_end { my $desc = ascii_html($ibx->description); my (%seen, @urls); - my $http = $ibx->base_url($ctx->{env}); - chop $http; # no trailing slash for clone + my $http = $self->{base_url}; my $max = $ibx->max_git_epoch; my $dir = (split(m!/!, $http))[-1]; if (defined($max)) { # v2