[ -<strong>S</strong> ]
[ -<strong>t</strong> <var>timelimit</var> ]
[ -<strong>T</strong> <var>content-type</var> ]
+ [ -<strong>u</strong> <var>PUT-file</var> ]
[ -<strong>v</strong> <var>verbosity</var>]
[ -<strong>V</strong> ]
[ -<strong>w</strong> ]
fixed total amount of time. Per default there is no timelimit.</dd>
<dt><code>-T <var>content-type</var></code></dt>
- <dd>Content-type header to use for POST data, eg.
+ <dd>Content-type header to use for POST/PUT data, eg.
<code>application/x-www-form-urlencoded</code>.
Default: <code>text/plain</code>.</dd>
+ <dt><code>-u <var>PUT-file</var></code></dt>
+ <dd>File containing data to PUT. Remember to also set <code>-T</code>.</dd>
+
<dt><code>-v <var>verbosity</var></code></dt>
<dd>Set verbosity level - <code>4</code> and above prints information on
headers, <code>3</code> and above prints response codes (404, 200, etc.),
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 */
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);
}
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,
}
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");
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");
#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
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':
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;