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