From: Graham Leggett Date: Sun, 6 Sep 2009 11:03:14 +0000 (+0000) Subject: Add support for HTTP PUT to ab. X-Git-Tag: 2.3.3~338 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1df1bda0106f87ca79257300fdaa96dc4f9792e3;p=apache Add support for HTTP PUT to ab. Submiited by: Jeff Barnes git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@811806 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index b80a023894..e82595e1c8 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,8 @@ Changes with Apache 2.3.3 + *) Add support for HTTP PUT to ab. [Jeff Barnes ] + *) ServerTokens now accepts 'Off' which disables sending of Server: header and sets SERVER_SOFTWARE to empty. It also accepts 'Set' which allows the user to specify any string as the Server: diff --git a/docs/man/ab.8 b/docs/man/ab.8 index 37b680ce98..451b1e4997 100644 --- a/docs/man/ab.8 +++ b/docs/man/ab.8 @@ -27,7 +27,7 @@ ab \- Apache HTTP server benchmarking tool .SH "SYNOPSIS" .PP -\fBab\fR [ -\fBA\fR \fIauth-username\fR:\fIpassword\fR ] [ -\fBb\fR \fIwindowsize\fR ] [ -\fBc\fR \fIconcurrency\fR ] [ -\fBC\fR \fIcookie-name\fR=\fIvalue\fR ] [ -\fBd\fR ] [ -\fBe\fR \fIcsv-file\fR ] [ -\fBf\fR \fIprotocol\fR ] [ -\fBg\fR \fIgnuplot-file\fR ] [ -\fBh\fR ] [ -\fBH\fR \fIcustom-header\fR ] [ -\fBi\fR ] [ -\fBk\fR ] [ -\fBn\fR \fIrequests\fR ] [ -\fBp\fR \fIPOST-file\fR ] [ -\fBP\fR \fIproxy-auth-username\fR:\fIpassword\fR ] [ -\fBq\fR ] [ -\fBr\fR ] [ -\fBs\fR ] [ -\fBS\fR ] [ -\fBt\fR \fItimelimit\fR ] [ -\fBT\fR \fIcontent-type\fR ] [ -\fBv\fR \fIverbosity\fR] [ -\fBV\fR ] [ -\fBw\fR ] [ -\fBx\fR \fI-attributes\fR ] [ -\fBX\fR \fIproxy\fR[:\fIport\fR] ] [ -\fBy\fR \fI-attributes\fR ] [ -\fBz\fR \fI
-attributes\fR ] [ -\fBZ\fR \fIciphersuite\fR ] [http[s]://]\fIhostname\fR[:\fIport\fR]/\fIpath\fR +\fBab\fR [ -\fBA\fR \fIauth-username\fR:\fIpassword\fR ] [ -\fBb\fR \fIwindowsize\fR ] [ -\fBc\fR \fIconcurrency\fR ] [ -\fBC\fR \fIcookie-name\fR=\fIvalue\fR ] [ -\fBd\fR ] [ -\fBe\fR \fIcsv-file\fR ] [ -\fBf\fR \fIprotocol\fR ] [ -\fBg\fR \fIgnuplot-file\fR ] [ -\fBh\fR ] [ -\fBH\fR \fIcustom-header\fR ] [ -\fBi\fR ] [ -\fBk\fR ] [ -\fBn\fR \fIrequests\fR ] [ -\fBp\fR \fIPOST-file\fR ] [ -\fBu\fR \fIPUT-file\fR ] [ -\fBP\fR \fIproxy-auth-username\fR:\fIpassword\fR ] [ -\fBq\fR ] [ -\fBr\fR ] [ -\fBs\fR ] [ -\fBS\fR ] [ -\fBt\fR \fItimelimit\fR ] [ -\fBT\fR \fIcontent-type\fR ] [ -\fBv\fR \fIverbosity\fR] [ -\fBV\fR ] [ -\fBw\fR ] [ -\fBx\fR \fI-attributes\fR ] [ -\fBX\fR \fIproxy\fR[:\fIport\fR] ] [ -\fBy\fR \fI-attributes\fR ] [ -\fBz\fR \fI" "\n", trstring, tdstring, tdstring, totalread); - if (posting > 0) + if (posting == 1) printf("" "\n", trstring, tdstring, tdstring, totalposted); + if (posting == 2) + printf("" + "\n", + trstring, tdstring, tdstring, totalposted); printf("" "\n", trstring, tdstring, tdstring, totalbread); @@ -1622,12 +1628,13 @@ static void test(void) } else { snprintf_res = apr_snprintf(request, sizeof(_request), - "POST %s HTTP/1.0\r\n" + "%s %s HTTP/1.0\r\n" "%s" "%s" "%s" "Content-length: %" APR_SIZE_T_FMT "\r\n" "Content-type: %s\r\n" "%s" "\r\n", + (posting == 1) ? "POST" : "PUT", (isproxy) ? fullurl : path, keepalive ? "Connection: Keep-Alive\r\n" : "", cookie, auth, @@ -1639,14 +1646,15 @@ static void test(void) } if (verbosity >= 2) - printf("INFO: POST header == \n---\n%s\n---\n", request); + printf("INFO: %s header == \n---\n%s\n---\n", + (posting == 2) ? "PUT" : "POST", request); reqlen = strlen(request); /* * Combine headers and (optional) post file into one contineous buffer */ - if (posting == 1) { + if (posting >= 1) { char *buff = malloc(postlen + reqlen + 1); if (!buff) { fprintf(stderr, "error creating request buffer: out of memory\n"); @@ -1835,6 +1843,7 @@ static void usage(const char *progname) fprintf(stderr, " -t timelimit Seconds to max. wait for responses\n"); fprintf(stderr, " -b windowsize Size of TCP send/receive buffer, in bytes\n"); fprintf(stderr, " -p postfile File containing data to POST. Remember also to set -T\n"); + fprintf(stderr, " -u putfile File containing data to PUT. Remember also to set -T\n"); fprintf(stderr, " -T content-type Content-type header for POSTing, eg.\n"); fprintf(stderr, " 'application/x-www-form-urlencoded'\n"); fprintf(stderr, " Default is 'text/plain'\n"); @@ -2028,7 +2037,7 @@ int main(int argc, const char * const argv[]) #endif apr_getopt_init(&opt, cntxt, argc, argv); - while ((status = apr_getopt(opt, "n:c:t:b:T:p:v:rkVhwix:y:z:C:H:P:A:g:X:de:Sq" + while ((status = apr_getopt(opt, "n:c:t:b:T:p:u:v:rkVhwix:y:z:C:H:P:A:g:X:de:Sq" #ifdef USE_SSL "Z:f:" #endif @@ -2053,8 +2062,8 @@ int main(int argc, const char * const argv[]) windowsize = atoi(optarg); break; case 'i': - if (posting == 1) - err("Cannot mix POST and HEAD\n"); + if (posting > 0) + err("Cannot mix POST/PUT and HEAD\n"); posting = -1; break; case 'g': @@ -2079,6 +2088,16 @@ int main(int argc, const char * const argv[]) exit(r); } break; + case 'u': + if (posting != 0) + err("Cannot mix PUT and HEAD\n"); + if (0 == (r = open_postfile(optarg))) { + posting = 2; + } + else if (postdata) { + exit(r); + } + break; case 'r': recverrok = 1; break;
-attributes\fR ] [ -\fBZ\fR \fIciphersuite\fR ] [http[s]://]\fIhostname\fR[:\fIport\fR]/\fIpath\fR .SH "SUMMARY" diff --git a/support/ab.c b/support/ab.c index 48a3e46c02..1d80efe62c 100644 --- a/support/ab.c +++ b/support/ab.c @@ -789,8 +789,10 @@ static void output_results(int sig) if (keepalive) printf("Keep-Alive requests: %d\n", doneka); printf("Total transferred: %" APR_INT64_T_FMT " bytes\n", totalread); - if (posting > 0) + if (posting == 1) printf("Total POSTed: %" APR_INT64_T_FMT "\n", totalposted); + if (posting == 2) + printf("Total PUT: %" APR_INT64_T_FMT "\n", totalposted); printf("HTML transferred: %" APR_INT64_T_FMT " bytes\n", totalbread); /* avoid divide by zero */ @@ -1074,10 +1076,14 @@ static void output_html_results(void) printf("
Total transferred:%" APR_INT64_T_FMT " bytes
Total POSTed:%" APR_INT64_T_FMT "
Total PUT:%" APR_INT64_T_FMT "
HTML transferred:%" APR_INT64_T_FMT " bytes