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>maint
parent
c553fd1c1e
commit
f34a655d4d
4
http.c
4
http.c
|
@ -927,7 +927,7 @@ static int extract_param(const char *raw, const char *name,
|
||||||
return -1;
|
return -1;
|
||||||
raw++;
|
raw++;
|
||||||
|
|
||||||
while (*raw && !isspace(*raw))
|
while (*raw && !isspace(*raw) && *raw != ';')
|
||||||
strbuf_addch(out, *raw++);
|
strbuf_addch(out, *raw++);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -971,7 +971,7 @@ static void extract_content_type(struct strbuf *raw, struct strbuf *type,
|
||||||
|
|
||||||
strbuf_reset(charset);
|
strbuf_reset(charset);
|
||||||
while (*p) {
|
while (*p) {
|
||||||
while (isspace(*p))
|
while (isspace(*p) || *p == ';')
|
||||||
p++;
|
p++;
|
||||||
if (!extract_param(p, "charset", charset))
|
if (!extract_param(p, "charset", charset))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -19,6 +19,10 @@ case "$PATH_INFO" in
|
||||||
printf "text/plain; charset=utf-16"
|
printf "text/plain; charset=utf-16"
|
||||||
charset=utf-16
|
charset=utf-16
|
||||||
;;
|
;;
|
||||||
|
*odd-spacing*)
|
||||||
|
printf "text/plain; foo=bar ;charset=utf-16; other=nonsense"
|
||||||
|
charset=utf-16
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
printf "\n"
|
printf "\n"
|
||||||
|
|
||||||
|
|
|
@ -191,5 +191,10 @@ test_expect_success 'http error messages are reencoded' '
|
||||||
grep "this is the error message" stderr
|
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
|
stop_httpd
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in New Issue