On 2018.11.13 09:26, Jeff King wrote: > On Mon, Nov 12, 2018 at 02:44:56PM -0800, steadmon@xxxxxxxxxx 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. > 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