+ bless { pi_config => $pi_config }, $class;
+}
+
+# backwards compatibility, do not use
+sub run {
+ my ($req, $method) = @_;
+ PublicInbox::WWW->new->call($req->env);
+}
+
+sub call {
+ my ($self, $env) = @_;
+ my $cgi = Plack::Request->new($env);
+ my $ctx = { cgi => $cgi, env => $env, www => $self,
+ pi_config => $self->{pi_config} };
+
+ # we don't care about multi-value
+ my %qp = map {
+ my ($k, $v) = split('=', $_, 2);
+ $v = '' unless defined $v;
+ $v =~ tr/+/ /;
+ ($k, $v)
+ } split(/[&;]/, uri_unescape($env->{QUERY_STRING}));
+ $ctx->{qp} = \%qp;
+
+ 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($self, $ctx, $1) ||
+ serve_git($env, $ctx->{git}, $path));
+ }
+ elsif ($method !~ /\AGET|HEAD\z/) {