mirror of
https://github.com/moparisthebest/curl
synced 2024-12-23 08:38:49 -05:00
altsvc: fix parser for lines ending with CRLF
Fixed the alt-svc parser to treat a newline as end of line. The unit tests in test 1654 were done without CRLF and thus didn't quite match the real world. Now they use CRLF as well. Reported-by: Peter Wu Assisted-by: Peter Wu Assisted-by: Jay Satiro Fixes #5445 Closes #5446
This commit is contained in:
parent
308c243db5
commit
d844f2b9ff
@ -431,6 +431,8 @@ static time_t debugtime(void *unused)
|
|||||||
#define time(x) debugtime(x)
|
#define time(x) debugtime(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ISNEWLINE(x) (((x) == '\n') || (x) == '\r')
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Curl_altsvc_parse() takes an incoming alt-svc response header and stores
|
* Curl_altsvc_parse() takes an incoming alt-svc response header and stores
|
||||||
* the data correctly in the cache.
|
* the data correctly in the cache.
|
||||||
@ -520,12 +522,12 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
|
|||||||
/* Handle the optional 'ma' and 'persist' flags. Unknown flags
|
/* Handle the optional 'ma' and 'persist' flags. Unknown flags
|
||||||
are skipped. */
|
are skipped. */
|
||||||
for(;;) {
|
for(;;) {
|
||||||
while(*p && ISBLANK(*p) && *p != ';' && *p != ',')
|
while(ISBLANK(*p))
|
||||||
p++;
|
p++;
|
||||||
if(!*p || *p == ',')
|
if(*p != ';')
|
||||||
break;
|
break;
|
||||||
p++; /* pass the semicolon */
|
p++; /* pass the semicolon */
|
||||||
if(!*p)
|
if(!*p || ISNEWLINE(*p))
|
||||||
break;
|
break;
|
||||||
result = getalnum(&p, option, sizeof(option));
|
result = getalnum(&p, option, sizeof(option));
|
||||||
if(result) {
|
if(result) {
|
||||||
|
@ -63,7 +63,7 @@ UNITTEST_START
|
|||||||
fail_unless(asi->num == 4, "wrong number of entries");
|
fail_unless(asi->num == 4, "wrong number of entries");
|
||||||
msnprintf(outname, sizeof(outname), "%s-out", arg);
|
msnprintf(outname, sizeof(outname), "%s-out", arg);
|
||||||
|
|
||||||
result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"",
|
result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"\r\n",
|
||||||
ALPN_h1, "example.org", 8080);
|
ALPN_h1, "example.org", 8080);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse() failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse() failed!\n");
|
||||||
@ -71,7 +71,7 @@ UNITTEST_START
|
|||||||
}
|
}
|
||||||
fail_unless(asi->num == 5, "wrong number of entries");
|
fail_unless(asi->num == 5, "wrong number of entries");
|
||||||
|
|
||||||
result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"",
|
result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"\r\n",
|
||||||
ALPN_h1, "2.example.org", 8080);
|
ALPN_h1, "2.example.org", 8080);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse(2) failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse(2) failed!\n");
|
||||||
@ -80,7 +80,7 @@ UNITTEST_START
|
|||||||
fail_unless(asi->num == 6, "wrong number of entries");
|
fail_unless(asi->num == 6, "wrong number of entries");
|
||||||
|
|
||||||
result = Curl_altsvc_parse(curl, asi,
|
result = Curl_altsvc_parse(curl, asi,
|
||||||
"h2=\"example.com:8080\", h3=\"yesyes.com\"",
|
"h2=\"example.com:8080\", h3=\"yesyes.com\"\r\n",
|
||||||
ALPN_h1, "3.example.org", 8080);
|
ALPN_h1, "3.example.org", 8080);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
|
||||||
@ -89,7 +89,8 @@ UNITTEST_START
|
|||||||
/* that one should make two entries */
|
/* that one should make two entries */
|
||||||
fail_unless(asi->num == 8, "wrong number of entries");
|
fail_unless(asi->num == 8, "wrong number of entries");
|
||||||
|
|
||||||
result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
|
result = Curl_altsvc_parse(curl, asi,
|
||||||
|
"h2=\"example.com:443\"; ma = 120;\r\n",
|
||||||
ALPN_h2, "example.org", 80);
|
ALPN_h2, "example.org", 80);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
|
||||||
@ -98,7 +99,8 @@ UNITTEST_START
|
|||||||
fail_unless(asi->num == 9, "wrong number of entries");
|
fail_unless(asi->num == 9, "wrong number of entries");
|
||||||
|
|
||||||
/* quoted 'ma' value */
|
/* quoted 'ma' value */
|
||||||
result = Curl_altsvc_parse(curl, asi, "h2=\"example.net:443\"; ma=\"180\";",
|
result = Curl_altsvc_parse(curl, asi,
|
||||||
|
"h2=\"example.net:443\"; ma=\"180\";\r\n",
|
||||||
ALPN_h2, "example.net", 80);
|
ALPN_h2, "example.net", 80);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
|
||||||
@ -106,9 +108,10 @@ UNITTEST_START
|
|||||||
}
|
}
|
||||||
fail_unless(asi->num == 10, "wrong number of entries");
|
fail_unless(asi->num == 10, "wrong number of entries");
|
||||||
|
|
||||||
result = Curl_altsvc_parse(curl, asi,
|
result =
|
||||||
"h2=\":443\", h3=\":443\"; ma = 120; persist = 1",
|
Curl_altsvc_parse(curl, asi,
|
||||||
ALPN_h1, "curl.haxx.se", 80);
|
"h2=\":443\", h3=\":443\"; ma = 120; persist = 1\r\n",
|
||||||
|
ALPN_h1, "curl.haxx.se", 80);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse(5) failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse(5) failed!\n");
|
||||||
unitfail++;
|
unitfail++;
|
||||||
@ -116,7 +119,7 @@ UNITTEST_START
|
|||||||
fail_unless(asi->num == 12, "wrong number of entries");
|
fail_unless(asi->num == 12, "wrong number of entries");
|
||||||
|
|
||||||
/* clear that one again and decrease the counter */
|
/* clear that one again and decrease the counter */
|
||||||
result = Curl_altsvc_parse(curl, asi, "clear;",
|
result = Curl_altsvc_parse(curl, asi, "clear;\r\n",
|
||||||
ALPN_h1, "curl.haxx.se", 80);
|
ALPN_h1, "curl.haxx.se", 80);
|
||||||
if(result) {
|
if(result) {
|
||||||
fprintf(stderr, "Curl_altsvc_parse(6) failed!\n");
|
fprintf(stderr, "Curl_altsvc_parse(6) failed!\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user