You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Dirk-Willem van Gulik <di...@jrc.it> on 1999/04/01 13:36:01 UTC

[patch] ab.c, ab.8

On the subject of extening ab to do cookies.

I've been using this hacked version for quite some time. I guess
you could call it well tested. Mainly for Cookies, Accept-Encoding
and Basic AUTH. 

But never thoughd it would be general enough to be usefull. But 
perhaps it is; so I've put the  comments in the ab.8 man page. 
See attached. If I do not hear any loud cries of foul; I'll commit 
it monday or so.

Dw.

Index: ab.c
===================================================================
RCS file: /x3/home/cvs/apache-1.3/src/support/ab.c,v
retrieving revision 1.20
diff -u -c -3 -r1.20 ab.c
*** ab.c	1999/02/19 16:25:35	1.20
--- ab.c	1999/04/01 11:33:30
***************
*** 174,179 ****
--- 174,180 ----
  char *postdata;			/* *buffer containing data from postfile */
  int postlen = 0;		/* length of data to be POSTed */
  char content_type[1024];	/* content type to put in POST header */
+ char cookie[1024], auth[1024], hdrs[4096]; /* XXXX braindead fixed lenght buffers */
  int port = 80;			/* port number */
  
  int use_html = 0;		/* use html in the report */
***************
*** 223,228 ****
--- 224,257 ----
      exit(errno);
  }
  
+ /* -- simple uuencode, lifted from main/util.c which
+  *    needed the pool, so duplicated here with normal 
+  *    malloc. Just for Basic Auth encoding.
+  */
+ static const char basis_64[] = 
+ 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
+ 
+ static char * uuencode(char *string) 
+ { 
+ 	int i, len = strlen(string); 
+ 	char *p; 
+ 	char *encoded = (char *) malloc((len+2) / 3 * 4); 
+ 	p = encoded; 
+ 	for (i = 0; i < len; i += 3) { 
+ 		*p++ = basis_64[string[i] >> 2]; 
+ 		*p++ = basis_64[((string[i] & 0x3) << 4) | 
+ 				((int) (string[i + 1] & 0xF0) >> 4) ]; 
+ 		*p++ = basis_64[((string[i + 1] & 0xF) << 2) | 
+ 				((int) (string[i + 2] & 0xC0) >> 6)]; 
+ 		*p++ = basis_64[string[i + 2] & 0x3F]; 
+ 		}; 
+ 	*p-- = '\0'; 
+ 	*p-- = '='; 
+ 	*p-- = '='; 
+ 	return encoded; 
+ 	} 
+ 
+ 
  /* --------------------------------------------------------- */
  
  /* write out request to a connection - assumes we can write
***************
*** 732,760 ****
      if (!posting) {
  	sprintf(request, "GET %s HTTP/1.0\r\n"
  		"User-Agent: ApacheBench/%s\r\n"
! 		"%s"
  		"Host: %s\r\n"
  		"Accept: */*\r\n"
! 		"\r\n",
  		path,
  		VERSION,
  		keepalive ? "Connection: Keep-Alive\r\n" : "",
! 		hostname);
      }
      else {
  	sprintf(request, "POST %s HTTP/1.0\r\n"
  		"User-Agent: ApacheBench/%s\r\n"
! 		"%s"
  		"Host: %s\r\n"
  		"Accept: */*\r\n"
  		"Content-length: %d\r\n"
  		"Content-type: %s\r\n"
  		"\r\n",
  		path,
  		VERSION,
  		keepalive ? "Connection: Keep-Alive\r\n" : "",
  		hostname, postlen,
! 		(content_type[0]) ? content_type : "text/plain");
      }
  
      if (verbosity >= 2)
--- 761,791 ----
      if (!posting) {
  	sprintf(request, "GET %s HTTP/1.0\r\n"
  		"User-Agent: ApacheBench/%s\r\n"
! 		"%s" "%s" "%s"
  		"Host: %s\r\n"
  		"Accept: */*\r\n"
! 		"\r\n" "%s" ,
  		path,
  		VERSION,
  		keepalive ? "Connection: Keep-Alive\r\n" : "",
! 		cookie, auth, hostname,hdrs);
      }
      else {
  	sprintf(request, "POST %s HTTP/1.0\r\n"
  		"User-Agent: ApacheBench/%s\r\n"
! 		"%s" "%s" "%s"	
  		"Host: %s\r\n"
  		"Accept: */*\r\n"
  		"Content-length: %d\r\n"
  		"Content-type: %s\r\n"
+ 		"%s"
  		"\r\n",
  		path,
  		VERSION,
  		keepalive ? "Connection: Keep-Alive\r\n" : "",
+ 		cookie, auth,
  		hostname, postlen,
! 		(content_type[0]) ? content_type : "text/plain",hdrs);
      }
  
      if (verbosity >= 2)
***************
*** 851,856 ****
--- 882,894 ----
      fprintf(stderr, "    -x attributes   String to insert as table attributes\n");
      fprintf(stderr, "    -y attributes   String to insert as tr attributes\n");
      fprintf(stderr, "    -z attributes   String to insert as td or th attributes\n");
+     fprintf(stderr, "    -C attribute	 Add cookie, eg. 'Apache=1234. (repeatable)\n");
+     fprintf(stderr, "    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: zop'\n");
+     fprintf(stderr, "                    Inserted after all normal header lines. (repeatable)\n");
+     fprintf(stderr, "    -A attribute    Add Basic WWW Authentication, the attributes\n");
+     fprintf(stderr, "                    are a colon separated username and password.\n");
+     fprintf(stderr, "    -p attribute    Add Basic Proxy Authentication, the attributes\n");
+     fprintf(stderr, "                    are a colon separated username and password.\n");
      fprintf(stderr, "    -V              Print version number and exit\n");
      fprintf(stderr, "    -k              Use HTTP KeepAlive feature\n");
      fprintf(stderr, "    -h              Display usage information (this message)\n");
***************
*** 929,937 ****
      tablestring = "";
      trstring = "";
      tdstring = "bgcolor=white";
! 
      optind = 1;
!     while ((c = getopt(argc, argv, "n:c:t:T:p:v:kVhwx:y:z:")) > 0) {
  	switch (c) {
  	case 'n':
  	    requests = atoi(optarg);
--- 967,975 ----
      tablestring = "";
      trstring = "";
      tdstring = "bgcolor=white";
!     cookie[0]='\0'; auth[0]='\0'; hdrs[0]='\0';
      optind = 1;
!     while ((c = getopt(argc, argv, "n:c:t:T:p:v:kVhwx:y:z:C:H:P:A:")) > 0) {
  	switch (c) {
  	case 'n':
  	    requests = atoi(optarg);
***************
*** 962,967 ****
--- 1000,1030 ----
  	    break;
  	case 'T':
  	    strcpy(content_type, optarg);
+ 	    break;
+ 	case 'C':
+ 	    strncat(cookie, "Cookie: ",sizeof(cookie));
+ 	    strncat(cookie, optarg,sizeof(cookie));
+ 	    strncat(cookie, "\r\n",sizeof(cookie));
+ 	    break;
+ 	case 'A':
+ 	    /* assume username passwd already to be in colon
+ 	     * separated form. Only does basic auth. Use -H for digest.
+ 	     */
+ 	    strncat(cookie, "Authorization: basic ",sizeof(auth));
+ 	    strncat(cookie, uuencode(optarg),sizeof(auth));
+ 	    strncat(cookie, "\r\n",sizeof(auth));
+ 	    break;
+ 	case 'P':
+ 	    /* assume username passwd already to be in colon
+ 	     * separated form.
+ 	     */
+ 	    strncat(cookie, "Proxy-Authorization: basic ",sizeof(auth));
+ 	    strncat(cookie, uuencode(optarg),sizeof(auth));
+ 	    strncat(cookie, "\r\n",sizeof(auth));
+ 	    break;
+ 	case 'H':
+ 	    strncat(cookie, optarg,sizeof(hdrs));
+ 	    strncat(cookie, "\r\n",sizeof(hdrs));
  	    break;
  	case 'V':
  	    copyright();
Index: ab.8
===================================================================
RCS file: /x3/home/cvs/apache-1.3/src/support/ab.8,v
retrieving revision 1.4
diff -u -c -3 -r1.4 ab.8
*** ab.8	1999/02/19 16:25:35	1.4
--- ab.8	1999/04/01 11:33:30
***************
*** 66,71 ****
--- 66,79 ----
  ] [
  .BI \-p " POST file"
  ] [
+ .BI \-A " Authenticate username:password"
+ ] [
+ .BI \-P " Proxy Authenticate username:password"
+ ] [
+ .BI \-H " Custom header"
+ ] [
+ .BI \-C " Cookie name=value"
+ ] [
  .BI \-T " content-type"
  ] [
  .BI \-v " verbosity"
***************
*** 124,129 ****
--- 132,162 ----
  .TP 12
  .BI \-p " POST file"
  File containing data to POST.
+ 
+ .TP 12
+ .BI \-A " Authorization username:password"
+ Supply BASIC Authentification credentials to the server. The username
+ and password are separated by a single ':' and send on the wire uuencoded.
+ The string is send regardless of wether the server needs it; (i.e. has
+ send an 401. Authentifcation needed).
+ 
+ .TP 12
+ .BI \-p " Proxy-Authorization username:password"
+ Supply BASIC Authentification credentials to a proxy en-route. The username
+ and password are separated by a single ':' and send on the wire uuencoded.
+ The string is send regardless of wether the proxy needs it; (i.e. has
+ send an 407 Proxy authentifcation needed).
+ 
+ .TP 12
+ .BI \-C " Cookie name=value"
+ Add a 'Cookie:' line to the request. The argument is typically in the form
+ of a 'name=value' pair. This field is repeatable.
+ 
+ .TP 12
+ .BI \-p " Header string"
+ Postfix extra headers to the request. The argument is typically in the form
+ of a valid header line; containing a colon separated field value pair. (i.e. 
+ 'Accept-Encoding: zip/zop;8bit').
  
  .TP 12
  .BI \-T " content-type"

RE: [patch] ab.c, ab.8

Posted by Lars Eilebrecht <la...@hyperreal.org>.
According to Dirk-Willem van Gulik:

>  But never thoughd it would be general enough to be usefull. But 
>  perhaps it is; so I've put the  comments in the ab.8 man page. 
>  See attached. If I do not hear any loud cries of foul; I'll commit 
>  it monday or so.

Go for it.

ciao...
-- 
Lars Eilebrecht              - Modesty: Being comfortable that others
lars@hyperreal.org                      will discover your greatness.


Re: [patch] ab.c, ab.8

Posted by "Life is hard, and then you die." <ro...@innovation.ch>.
> Index: ab.c
> ===================================================================
> RCS file: /x3/home/cvs/apache-1.3/src/support/ab.c,v
> retrieving revision 1.20
> diff -u -c -3 -r1.20 ab.c
> *** ab.c        1999/02/19 16:25:35     1.20
> --- ab.c        1999/04/01 11:33:30
[snip]
> + /* -- simple uuencode, lifted from main/util.c which
> +  *    needed the pool, so duplicated here with normal
> +  *    malloc. Just for Basic Auth encoding.
> +  */
> + static const char basis_64[] =
> +       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
> +
> + static char * uuencode(char *string)
> + {
> +       int i, len = strlen(string);
> +       char *p;
> +       char *encoded = (char *) malloc((len+2) / 3 * 4);
> +       p = encoded;
> +       for (i = 0; i < len; i += 3) {
> +               *p++ = basis_64[string[i] >> 2];
> +               *p++ = basis_64[((string[i] & 0x3) << 4) |
> +                               ((int) (string[i + 1] & 0xF0) >> 4) ];
> +               *p++ = basis_64[((string[i + 1] & 0xF) << 2) |
> +                               ((int) (string[i + 2] & 0xC0) >> 6)];
> +               *p++ = basis_64[string[i + 2] & 0x3F];
> +               };
> +       *p-- = '\0';
> +       *p-- = '=';
> +       *p-- = '=';
> +       return encoded;
> +       }
> +
[snip]

I suggest updating this to the latest version of ap_uuencode in util.c
as the above version is quite broken.


  Cheers,

  Ronald