Re: [PATCH] remote-curl: die on server-side errors
- From
Josh Steadmon <steadmon@google.com>
- Date
- Nov 13, 2018, 22:25 UTC
- Message-ID
- <20181113222540.GE126896@google.com>
- In-Reply-To
- <20181113142624.GA17128@sigill.intra.peff.net>
On 2018.11.13 09:26, Jeff King wrote:
Show 41 quoted lines
> On Mon, Nov 12, 2018 at 02:44:56PM -0800, steadmon@google.com wrote:
>
> > When a smart HTTP server sends an error message via pkt-line,
> > remote-curl will fail to detect the error (which usually results in
> > incorrectly falling back to dumb-HTTP mode).
> >
> > This patch adds a check in discover_refs() for server-side error
> > messages, as well as a test case for this issue.
>
> Aside from the reformatting of the conditional that Junio mentioned,
> this seems pretty good to me. But while looking at that, I found a few
> things, some old and some new. :)
>
> > diff --git a/remote-curl.c b/remote-curl.c
> > index 762a55a75f..bb3a86505e 100644
> > --- a/remote-curl.c
> > +++ b/remote-curl.c
> > @@ -436,7 +436,9 @@ static struct discovery *discover_refs(const char *service, int for_push)
> > } else if (maybe_smart &&
> > last->len > 5 && starts_with(last->buf + 4, "version 2")) {
> > last->proto_git = 1;
> > - }
> > + } else if (maybe_smart && last->len > 5 &&
> > + starts_with(last->buf + 4, "ERR "))
> > + die(_("remote error: %s"), last->buf + 8);
>
> The magic "4" here and in the existing "version 2" check is because we
> are expecting pkt-lines. The original conditional always calls
> packed_read_line_buf() and will complain if we didn't actually get a
> pkt-line.
>
> Should we confirm that we got a real packet-line? Or at least that those
> first four are even plausible hex chars?
>
> I admit that it's pretty unlikely that the server is going to fool us
> here. It would need something like "foo ERRORS ARE FUN!". And even then
> we'd report an error (whereas the correct behavior is falling back to
> dumb http, but we know that won't work anyway because that's not a valid
> ref advertisement). So I doubt this is really a bug per se, but it might
> make it easier to understand what's going on if we actually parsed the
> packet.Unfortunately we can't just directly parse the data in last->buf, because other parts of the code are expecting to see the raw pkt-line data there. I tried adding a duplicate pointer and length variable for this data and parsing that through packet_read_line_buf(), but even without using the results this apparently has side-effects that break all of t5550 (and probably other tests as well). It also fails if I completely duplicate last->buf into a new char* and call packet_readline_buf() on that, so there's clearly some interaction in the pkt-line guts that I'm not properly accounting for.
Show 7 quoted lines
> Similarly, we seem eager to accept "version 2" even if we are only > expecting v0. I know you have another series working in that direction, > but I don't think it touches this "proto_git". I guess accepting > "version 2" as "we're speaking git protocol" and then barfing later with > "wait, I didn't mean to speak v2" is probably OK. > > -Peff