You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jeff Barnes <jb...@yahoo.com> on 2009/09/04 18:19:13 UTC
Re: ab
Apparently my last submission to the list was a patch for a fork of ab (http://code.google.com/p/apachebench-standalone/wiki/HowToBuild).
Sorry for the confusion (mine). Please find the attached svn diff for the *correct* ab.c and ab.8. (http://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x/support/ab.c and http://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x/docs/ab.8).
To recap, I added support for HTTP PUT requests to ab and updated the man page. I hope you find the changes useful.
Also, I have inlined the diffs to this email message.
Regards,
Jeff
ndex: support/ab.c
===================================================================
--- support/ab.c (revision 808959)
+++ support/ab.c (working copy)
@@ -763,8 +763,10 @@
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 */
@@ -1048,10 +1050,14 @@
printf("<tr %s><th colspan=2 %s>Total transferred:</th>"
"<td colspan=2 %s>%" APR_INT64_T_FMT " bytes</td></tr>\n",
trstring, tdstring, tdstring, totalread);
- if (posting > 0)
+ if (posting == 1)
printf("<tr %s><th colspan=2 %s>Total POSTed:</th>"
"<td colspan=2 %s>%" APR_INT64_T_FMT "</td></tr>\n",
trstring, tdstring, tdstring, totalposted);
+ if (posting == 2)
+ printf("<tr %s><th colspan=2 %s>Total PUT:</th>"
+ "<td colspan=2 %s>%" APR_INT64_T_FMT "</td></tr>\n",
+ trstring, tdstring, tdstring, totalposted);
printf("<tr %s><th colspan=2 %s>HTML transferred:</th>"
"<td colspan=2 %s>%" APR_INT64_T_FMT " bytes</td></tr>\n",
trstring, tdstring, tdstring, totalbread);
@@ -1606,12 +1612,13 @@
}
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,
@@ -1623,14 +1630,15 @@
}
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");
@@ -1831,6 +1839,7 @@
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");
@@ -2022,7 +2031,7 @@
#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
@@ -2047,8 +2056,8 @@
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':
@@ -2073,6 +2082,16 @@
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;
Index: docs/man/ab.8
===================================================================
--- docs/man/ab.8 (revision 808959)
+++ docs/man/ab.8 (working copy)
@@ -27,7 +27,7 @@
.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<table>-attributes\fR ] [ -\fBX\fR \fIproxy\fR[:\fIport\fR] ] [ -\fBy\fR \fI<tr>-attributes\fR ] [ -\fBz\fR \fI<td>-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<table>-attributes\fR ] [ -\fBX\fR \fIproxy\fR[:\fIport\fR] ] [ -\fBy\fR \fI<tr>-attributes\fR ] [ -\fBz\fR \fI<td>-attributes\fR ] [ -\fBZ\fR \fIciphersuite\fR ] [http[s]://]\fIhostname\fR[:\fIport\fR]/\fIpath\fR
.SH "SUMMARY"
--- On Tue, 8/18/09, Jeff Barnes <jb...@yahoo.com> wrote:
> From: Jeff Barnes <jb...@yahoo.com>
> Subject: Re: ab
> To: dev@httpd.apache.org
> Date: Tuesday, August 18, 2009, 5:22 AM
> Here is the svn diff for ab to
> implement PUT requests. I also modified the ab man page, but
> I don't know where to check it out. I can provide the
> updated man page in its entirety or someone could point me
> to the svn server for it and I can send a diff. Or ?
>
> Best regards,
> Jeff Barnes
>
> Index: ab.c
> ===================================================================
> --- ab.c (revision 18)
> +++ ab.c (working copy)
> @@ -807,8 +807,10 @@
> 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);
> + else 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 */
> @@ -1092,10 +1094,14 @@
> printf("<tr %s><th
> colspan=2 %s>Total transferred:</th>"
> "<td colspan=2 %s>%"
> APR_INT64_T_FMT " bytes</td></tr>\n",
> trstring, tdstring, tdstring,
> totalread);
> - if (posting > 0)
> + if (posting == 1)
> printf("<tr
> %s><th colspan=2 %s>Total POSTed:</th>"
> "<td colspan=2
> %s>%" APR_INT64_T_FMT "</td></tr>\n",
> trstring,
> tdstring, tdstring, totalposted);
> + else if (posting == 2)
> + printf("<tr %s><th
> colspan=2 %s>Total PUT:</th>"
> + "<td
> colspan=2 %s>%" APR_INT64_T_FMT
> "</td></tr>\n",
> + trstring,
> tdstring, tdstring, totalposted);
> printf("<tr %s><th
> colspan=2 %s>HTML transferred:</th>"
> "<td colspan=2 %s>%"
> APR_INT64_T_FMT " bytes</td></tr>\n",
> trstring, tdstring, tdstring,
> totalbread);
> @@ -1637,7 +1643,7 @@
>
> keepalive ? "Connection: Keep-Alive\r\n" :
> "",
>
> cookie, auth, hdrs);
> }
> - else {
> + else if (posting == 1) {
> snprintf_res =
> apr_snprintf(request, sizeof(_request),
> "POST
> %s HTTP/1.0\r\n"
> "%s"
> "%s" "%s"
> @@ -1651,6 +1657,21 @@
>
> postlen,
>
> (content_type[0]) ? content_type :
> "text/plain", hdrs);
> }
> + else {
> + snprintf_res =
> apr_snprintf(request, sizeof(_request),
> + "PUT %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",
> + (isproxy) ?
> fullurl : path,
> + keepalive ?
> "Connection: Keep-Alive\r\n" : "",
> + cookie, auth,
> + postlen,
> +
> (content_type[0]) ? content_type : "text/plain", hdrs);
> + }
> +
> if (snprintf_res >=
> sizeof(_request)) {
> err("Request too
> long\n");
> }
> @@ -1663,7 +1684,7 @@
> /*
> * 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");
> @@ -1852,6 +1873,7 @@
> 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
> postfile 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");
> @@ -1967,26 +1989,26 @@
>
> rv = apr_file_open(&postfd,
> pfile, APR_READ, APR_OS_DEFAULT, cntxt);
> if (rv != APR_SUCCESS) {
> - fprintf(stderr, "ab: Could not
> open POST data file (%s): %s\n", pfile,
> + fprintf(stderr, "ab: Could not
> open POST/PUT data file (%s): %s\n", pfile,
>
> apr_strerror(rv, errmsg, sizeof errmsg));
> return rv;
> }
>
> rv = apr_file_info_get(&finfo,
> APR_FINFO_NORM, postfd);
> if (rv != APR_SUCCESS) {
> - fprintf(stderr, "ab: Could not
> stat POST data file (%s): %s\n", pfile,
> + fprintf(stderr, "ab: Could not
> stat POST/PUT data file (%s): %s\n", pfile,
>
> apr_strerror(rv, errmsg, sizeof errmsg));
> return rv;
> }
> postlen = (apr_size_t)finfo.size;
> postdata = malloc(postlen);
> if (!postdata) {
> - fprintf(stderr, "ab: Could not
> allocate POST data buffer\n");
> + fprintf(stderr, "ab: Could not
> allocate POST/PUT data buffer\n");
> return APR_ENOMEM;
> }
> rv = apr_file_read_full(postfd,
> postdata, postlen, NULL);
> if (rv != APR_SUCCESS) {
> - fprintf(stderr, "ab: Could not
> read POST data file: %s\n",
> + fprintf(stderr, "ab: Could not
> read POST/PUT data file: %s\n",
>
> apr_strerror(rv, errmsg, sizeof errmsg));
> return rv;
> }
> @@ -2045,7 +2067,7 @@
> #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
> @@ -2071,7 +2093,7 @@
>
> break;
> case
> 'i':
>
> if (posting == 1)
> -
> err("Cannot mix POST and HEAD\n");
> +
> err("Cannot mix PUT, POST and HEAD\n");
>
> posting = -1;
>
> break;
> case
> 'g':
> @@ -2088,7 +2110,7 @@
>
> break;
> case
> 'p':
>
> if (posting != 0)
> -
> err("Cannot mix POST and HEAD\n");
> +
> err("Cannot mix PUT, POST and HEAD\n");
>
> if (0 == (r = open_postfile(optarg))) {
>
> posting = 1;
>
> }
> @@ -2096,6 +2118,16 @@
>
> exit(r);
>
> }
>
> break;
> + case 'u':
> + if
> (posting != 0)
> +
> err("Cannot mix PUT, POST and HEAD\n");
> + if
> (0 == (r = open_postfile(optarg))) {
> +
> posting = 2;
> + }
> +
> else if (postdata) {
> +
> exit(r);
> + }
> +
> break;
> case
> 'r':
>
> recverrok = 1;
>
> break;
>
>
> --- On Mon, 8/17/09, Philip M. Gollucci <pg...@p6m7g8.com>
> wrote:
>
> > From: Philip M. Gollucci <pg...@p6m7g8.com>
> > Subject: Re: ab
> > To: dev@httpd.apache.org
> > Date: Monday, August 17, 2009, 7:28 PM
> > Jeff Barnes wrote:
> > > A need arose for my organization to be able to
> load
> > test web services. I modified ab.c to be able to send
> HTTP
> > PUT requests.
> > >
> > > We have been using it for a couple of weeks and
> it is
> > performing as expected. I would be happy to provide
> the
> > changes (minor, it mimics POST requests).
> > >
> > > Would it be appropriate for me to post the svn
> diff to
> > this list?
> > >
> > > Best regards,
> > > Jeff Barnes
> > >
> > >
> > Please do so.
> >
> >
>
Re: ab
Posted by Graham Leggett <mi...@sharp.fm>.
Jeff Barnes wrote:
> Apparently my last submission to the list was a patch for a fork of ab (http://code.google.com/p/apachebench-standalone/wiki/HowToBuild).
>
> Sorry for the confusion (mine). Please find the attached svn diff for the *correct* ab.c and ab.8. (http://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x/support/ab.c and http://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x/docs/ab.8).
>
> To recap, I added support for HTTP PUT requests to ab and updated the man page. I hope you find the changes useful.
>
> Also, I have inlined the diffs to this email message.
Would it be possible to open a bugzilla issue for this, and attach the
patch there? This will make sure it doesn't fall through the cracks.
Regards,
Graham
--