http: fix charset detection of extract_content_type()

extract_content_type() could not extract a charset parameter if the
parameter is not the first one and there is a whitespace and a following
semicolon just before the parameter. For example:

    text/plain; format=fixed ;charset=utf-8

And it also could not handle correctly some other cases, such as:

    text/plain; charset=utf-8; format=fixed
    text/plain; some-param="a long value with ;semicolons;"; charset=utf-8

Thanks-to: Jeff King <peff@peff.net>
Signed-off-by: Yi EungJun <eungjun.yi@navercorp.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Yi EungJun 2014-06-18 07:11:53 +09:00 committed by Junio C Hamano
parent c553fd1c1e
commit f34a655d4d
3 changed files with 11 additions and 2 deletions

4
http.c
View File

@ -927,7 +927,7 @@ static int extract_param(const char *raw, const char *name,
return -1;
raw++;
while (*raw && !isspace(*raw))
while (*raw && !isspace(*raw) && *raw != ';')
strbuf_addch(out, *raw++);
return 0;
}
@ -971,7 +971,7 @@ static void extract_content_type(struct strbuf *raw, struct strbuf *type,
strbuf_reset(charset);
while (*p) {
while (isspace(*p))
while (isspace(*p) || *p == ';')
p++;
if (!extract_param(p, "charset", charset))
return;

View File

@ -19,6 +19,10 @@ case "$PATH_INFO" in
printf "text/plain; charset=utf-16"
charset=utf-16
;;
*odd-spacing*)
printf "text/plain; foo=bar ;charset=utf-16; other=nonsense"
charset=utf-16
;;
esac
printf "\n"

View File

@ -191,5 +191,10 @@ test_expect_success 'http error messages are reencoded' '
grep "this is the error message" stderr
'
test_expect_success 'reencoding is robust to whitespace oddities' '
test_must_fail git clone "$HTTPD_URL/error/odd-spacing" 2>stderr &&
grep "this is the error message" stderr
'
stop_httpd
test_done