From a7452b8b8c824e4227372a21a0517d34c8185f85 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 4 Jun 2013 22:50:58 +0200 Subject: [PATCH] sws: support extracting test number from CONNECT ipv6-address! If an ipv6-address is provided to CONNECT, the last hexadecimal group in the address will be used as the test number! For example the address "[1234::ff]" would be treated as test case 255. --- tests/FILEFORMAT | 4 +++- tests/server/sws.c | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT index 019137a55..97afa967f 100644 --- a/tests/FILEFORMAT +++ b/tests/FILEFORMAT @@ -257,7 +257,9 @@ data that is defined within the section. If there's no test number found above, the HTTP test server will use the number following the last dot in the given hostname (made so that a CONNECT can still pass on test number) so that "foo.bar.123" gets treated as test case -123. +123. Alternatively, if an ipv6-address is provided to CONNECT, the last +hexadecimal group in the address will be used as the test numer! For example +the address "[1234::ff]" would be treated as test case 255. Set type="perl" to write the test case as a perl script. It implies that there's no memory debugging and valgrind gets shut off for this test. diff --git a/tests/server/sws.c b/tests/server/sws.c index 7e1c44012..38658cb74 100644 --- a/tests/server/sws.c +++ b/tests/server/sws.c @@ -518,6 +518,7 @@ static int ProcessRequest(struct httprequest *req) if(sscanf(req->reqbuf, "CONNECT %" MAXDOCNAMELEN_TXT "s HTTP/%d.%d", doc, &prot_major, &prot_minor) == 3) { char *portp = NULL; + unsigned long part=0; sprintf(logbuf, "Received a CONNECT %s HTTP/%d.%d request", doc, prot_major, prot_minor); @@ -530,14 +531,24 @@ static int ProcessRequest(struct httprequest *req) if(doc[0] == '[') { char *p = &doc[1]; - while(*p && (ISXDIGIT(*p) || (*p == ':') || (*p == '.'))) - p++; + /* scan through the hexgroups and store the value of the last group + in the 'part' variable and use as test case number!! */ + while(*p && (ISXDIGIT(*p) || (*p == ':') || (*p == '.'))) { + char *endp; + part = strtoul(p, &endp, 16); + if(ISXDIGIT(*p)) + p = endp; + else + p++; + } if(*p != ']') logmsg("Invalid CONNECT IPv6 address format"); else if (*(p+1) != ':') logmsg("Invalid CONNECT IPv6 port format"); else portp = p+1; + + req->testno = part; } else portp = strchr(doc, ':'); @@ -548,7 +559,10 @@ static int ProcessRequest(struct httprequest *req) logmsg("Invalid CONNECT port received"); else req->connect_port = curlx_ultous(ulnum); + } + logmsg("Port number: %d, test case number: %ld", + req->connect_port, req->testno); } }