17 #define CHANGE_FD_SETSIZE 1
21 #undef CHANGE_FD_SETSIZE
22 #define CHANGE_FD_SETSIZE 0
30 #include <osreldate.h>
31 #if __FreeBSD_version < 220000
32 #undef CHANGE_FD_SETSIZE
33 #define CHANGE_FD_SETSIZE 0
38 #if CHANGE_FD_SETSIZE && SQUID_MAXFD > DEFAULT_FD_SETSIZE
39 #define FD_SETSIZE SQUID_MAXFD
61 #include <sys/socket.h>
64 #include <netinet/in.h>
67 #include <arpa/inet.h>
82 #define PROXY_PORT 3128
83 #define PROXY_ADDR "127.0.0.1"
84 #define READ_BUF_SZ 4096
97 static struct timeval
now;
128 struct _f FD[SQUID_MAXFD];
140 #define RFC1123_STRFTIME "%a, %d %b %Y %H:%M:%S GMT"
145 static char buf[128];
146 struct tm *gmt = gmtime(t);
163 while (fd > 0 &&
FD[fd].cb ==
NULL)
187 printf(
"\rWaiting for open connections to finish...\n");
188 signal(sig, SIG_DFL);
206 char *p, *header =
NULL;
207 int oldlen = strlen(r->
buf);
208 int newlen = oldlen + len;
210 memcpy(r->
buf + oldlen,
buf, len);
211 r->
buf[newlen + 1] =
'\0';
212 for (p = r->
buf; r->
headfound < 2 && used < newlen; p++, used++) {
219 if (strncmp(header,
"HTTP", 4) == 0)
220 r->
status = atoi(header + 8);
221 else if (strncasecmp(header,
"Content-Length:", 15) == 0)
223 else if (strncasecmp(header,
"X-Request-URI:", 14) == 0) {
225 if (strncmp(r->
url, header + 15, strcspn(header + 15,
"\r\n"))) {
227 strncpy(
url, header + 15, strcspn(header + 15,
"\r\n"));
228 url[strcspn(header + 15,
"\r\n")] =
'\n';
229 fprintf(stderr,
"ERROR: Sent %s received %s\n",
245 memmove(r->
buf, header, newlen - (header - r->
buf) + 1);
252 for (; used < len; used++) {
263 else if (strcmp(r->
method,
"HEAD") == 0);
265 fprintf(stderr,
"ERROR: %s got %d of %d bytes\n",
269 fprintf(stderr,
"WARNING: %s size mismatch wanted %d bytes got %d\n",
272 fprintf(stderr,
"WARNING: %s invalid checksum wanted 0x%lx got 0x%lx\n",
276 fprintf(stderr,
"WARNING: %s status mismatch wanted %d got %d\n",
301 struct sockaddr_in S;
305 if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
309 memset(&S,
'\0',
sizeof(
struct sockaddr_in));
310 S.sin_family = AF_INET;
313 if (connect(s, (
struct sockaddr *) &S,
sizeof(S)) < 0) {
318 strcpy(urlbuf, urlin);
319 method = strtok(urlbuf,
" ");
322 file = strtok(
NULL,
" ");
324 checksum = strtok(
NULL,
" ");
335 r = calloc(1,
sizeof *r);
346 if (checksum && strcmp(checksum,
"-") != 0)
352 host = strchr(
url,
'/') + 2;
353 url = strchr(host,
'/');
357 snprintf(msg,
sizeof(msg)-1,
"%s %s HTTP/1.0\r\n",
method,
url);
360 snprintf(
buf,
sizeof(
buf)-1,
"Host: %s\r\n", host);
364 strcat(msg,
"Accept: */*\r\n");
365 if (
opt_ims && (lrand48() & 0x03) == 0) {
366 w = time(
NULL) - (lrand48() & 0x3FFFF);
367 snprintf(
buf,
sizeof(
buf)-1,
"If-Modified-Since: %s\r\n",
mkrfc850(&w));
370 if (file && strcmp(file,
"-") != 0) {
371 f = open(file, O_RDONLY);
377 snprintf(
buf,
sizeof(
buf)-1,
"Content-Length: %d\r\n", (
int) st.st_size);
380 if (
opt_range && (lrand48() & 0x03) == 0) {
383 strcat(msg,
"Range: bytes=");
384 while (((len = (
int) lrand48()) & 0x03) == 0 || !count) {
385 const int offset = (
int) lrand48();
388 switch (lrand48() & 0x03) {
390 snprintf(
buf,
sizeof(
buf)-1,
"-%d", len);
393 snprintf(
buf,
sizeof(
buf)-1,
"%d-", offset);
396 snprintf(
buf,
sizeof(
buf)-1,
"%d-%d", offset, offset + len);
407 if ((len2 = write(s, msg, len)) != len) {
409 perror(
"write request");
415 while ((len = read(f,
buf,
sizeof(
buf))) > 0) {
416 len2 = write(s,
buf, len);
418 perror(
"write body");
439 static char buf[8192];
442 if (fgets(
buf, 8191, stdin) ==
NULL) {
443 printf(
"Done Reading URLS\n");
450 if ((t = strchr(
buf,
'\n')))
464 fprintf(stderr,
"usage: %s: -p port -h host -n max\n",
progname);
465 fprintf(stderr,
" -t <tracefile> Save request trace\n");
466 fprintf(stderr,
" -c Check checksum agains trace\n");
467 fprintf(stderr,
" -i Send random If-Modified-Since times\n");
468 fprintf(stderr,
" -l <seconds> Connection lifetime timeout (default 60)\n");
469 fprintf(stderr,
" -a Accelerator mode\n");
470 fprintf(stderr,
" -H <string> Custom header\n");
483 struct timeval start;
486 setbuf(stdout,
NULL);
487 setbuf(stderr,
NULL);
492 while ((c =
getopt(argc, argv,
"ap:h:H:n:icrl:L:t:")) != -1) {
539 signal(SIGPIPE, SIG_IGN);
541 while (
nfds ||
FD[0].cb) {
547 for (i = 1; i <=
maxfd; i++) {
551 fprintf(stderr,
"WARNING: fd %d lifetime timeout\n", i);
558 fprintf(stderr,
"maxfd=%d\n",
maxfd);
564 for (i = 0; i <=
maxfd; i++) {
565 if (!FD_ISSET(i, &R))
573 if (select(1, &R2,
NULL,
NULL, &to) == 1)
577 if (
now.tv_sec >
last.tv_sec) {
579 dt = (
int) (
now.tv_sec - start.tv_sec);
580 printf(
"T+ %6d: %9d req (%+4d), %4d conn, %3d/sec avg, %dmb, %dkb/sec avg\n",
595 printf(
"Exiting normally\n");