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>
Yi EungJun committed
Jun 18, 2014 at 07:11 UTC
f34a655d4d1e25f314cd5760e2a39bec28950aa1
3 files changed
+11
-2
http.c
+2
-2
@@ -927,7 +927,7 @@ static int extract_param(const char *raw, const char *name,
927
return -1;
928
raw++;
929
930
- while (*raw && !isspace(*raw))
930
+ while (*raw && !isspace(*raw) && *raw != ';')
931
strbuf_addch(out, *raw++);
932
return 0;
933
}
@@ -971,7 +971,7 @@ static void extract_content_type(struct strbuf *raw, struct strbuf *type,
971
972
strbuf_reset(charset);
973
while (*p) {
974
- while (isspace(*p))
974
+ while (isspace(*p) || *p == ';')
975
p++;
976
if (!extract_param(p, "charset", charset))
977
return;
t/lib-httpd/error.sh
+4
@@ -19,6 +19,10 @@ case "$PATH_INFO" in
19
printf "text/plain; charset=utf-16"
20
charset=utf-16
21
;;
22
+*odd-spacing*)
23
+ printf "text/plain; foo=bar ;charset=utf-16; other=nonsense"
24
+ charset=utf-16
25
+ ;;
26
esac
27
printf "\n"
28
t/t5550-http-fetch-dumb.sh
+5
@@ -191,5 +191,10 @@ test_expect_success 'http error messages are reencoded' '
191
grep "this is the error message" stderr
192
'
193
194
+test_expect_success 'reencoding is robust to whitespace oddities' '
195
+ test_must_fail git clone "$HTTPD_URL/error/odd-spacing" 2>stderr &&
196
+ grep "this is the error message" stderr
197
+'
198
+
199
stop_httpd
200
test_done