serve: return capability "value" from get_capability()
When the client sends v2 capabilities, they may be simple, like: foo or have a value like: foo=bar (all of the current capabilities actually expect a value, but the protocol allows for boolean ones). We use get_capability() to make sure the client's pktline matches a capability. In doing so, we parse enough to see the "=" and the value (if any), but we immediately forget it. Nobody cares for now, because they end up parsing the values out later using has_capability(). But in preparation for changing that, let's pass back a pointer so the callers know what we found. Note that unlike has_capability(), we'll return NULL for a "simple" capability. Distinguishing these will be useful for some future patches. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
76804526f9
commit
5ef260d2d1
18
serve.c
18
serve.c
|
@ -139,7 +139,7 @@ void protocol_v2_advertise_capabilities(void)
|
||||||
strbuf_release(&value);
|
strbuf_release(&value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct protocol_capability *get_capability(const char *key)
|
static struct protocol_capability *get_capability(const char *key, const char **value)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -149,8 +149,16 @@ static struct protocol_capability *get_capability(const char *key)
|
||||||
for (i = 0; i < ARRAY_SIZE(capabilities); i++) {
|
for (i = 0; i < ARRAY_SIZE(capabilities); i++) {
|
||||||
struct protocol_capability *c = &capabilities[i];
|
struct protocol_capability *c = &capabilities[i];
|
||||||
const char *out;
|
const char *out;
|
||||||
if (skip_prefix(key, c->name, &out) && (!*out || *out == '='))
|
if (!skip_prefix(key, c->name, &out))
|
||||||
|
continue;
|
||||||
|
if (!*out) {
|
||||||
|
*value = NULL;
|
||||||
return c;
|
return c;
|
||||||
|
}
|
||||||
|
if (*out++ == '=') {
|
||||||
|
*value = out;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -158,7 +166,8 @@ static struct protocol_capability *get_capability(const char *key)
|
||||||
|
|
||||||
static int is_valid_capability(const char *key)
|
static int is_valid_capability(const char *key)
|
||||||
{
|
{
|
||||||
const struct protocol_capability *c = get_capability(key);
|
const char *value;
|
||||||
|
const struct protocol_capability *c = get_capability(key, &value);
|
||||||
|
|
||||||
return c && c->advertise(the_repository, NULL);
|
return c && c->advertise(the_repository, NULL);
|
||||||
}
|
}
|
||||||
|
@ -168,7 +177,8 @@ static int parse_command(const char *key, struct protocol_capability **command)
|
||||||
const char *out;
|
const char *out;
|
||||||
|
|
||||||
if (skip_prefix(key, "command=", &out)) {
|
if (skip_prefix(key, "command=", &out)) {
|
||||||
struct protocol_capability *cmd = get_capability(out);
|
const char *value;
|
||||||
|
struct protocol_capability *cmd = get_capability(out, &value);
|
||||||
|
|
||||||
if (*command)
|
if (*command)
|
||||||
die("command '%s' requested after already requesting command '%s'",
|
die("command '%s' requested after already requesting command '%s'",
|
||||||
|
|
Loading…
Reference in New Issue