httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ch...@locus.apache.org
Subject cvs commit: apache-2.0/src/modules/proxy proxy_util.c
Date Sat, 11 Nov 2000 11:07:03 GMT
chuck       00/11/11 03:07:03

  Modified:    src/modules/proxy proxy_util.c
  Log:
  This is the 1.3.x current proxy into 2.0 - first stage
  Obtained from: Sam Magnuson
  Submitted by:  Chuck Murcko
  
  Revision  Changes    Path
  1.22      +423 -382  apache-2.0/src/modules/proxy/proxy_util.c
  
  Index: proxy_util.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/proxy/proxy_util.c,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- proxy_util.c	2000/11/11 06:06:00	1.21
  +++ proxy_util.c	2000/11/11 11:07:03	1.22
  @@ -57,21 +57,18 @@
    */
   
   /* Utility routines for Apache proxy */
  -#include "apr_strings.h"
   #include "mod_proxy.h"
   #include "http_main.h"
  -#include "apr_md5.h"
   #include "http_log.h"
   #include "util_uri.h"
  -#include "util_date.h"    /* get ap_checkmask() decl. */
  -
  -#include <pthread.h>
  +#include "util_date.h"	/* get ap_checkmask() decl. */
  +#include "apr_md5.h"
   
   static int proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r);
   static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r);
   static int proxy_match_hostname(struct dirconn_entry *This, request_rec *r);
   static int proxy_match_word(struct dirconn_entry *This, request_rec *r);
  -
  +static struct per_thread_data *get_per_thread_data(void);
   /* already called in the knowledge that the characters are hex digits */
   int ap_proxy_hex2c(const char *x)
   {
  @@ -80,20 +77,20 @@
   #ifndef CHARSET_EBCDIC
       ch = x[0];
       if (apr_isdigit(ch))
  -    i = ch - '0';
  +	i = ch - '0';
       else if (apr_isupper(ch))
  -    i = ch - ('A' - 10);
  +	i = ch - ('A' - 10);
       else
  -    i = ch - ('a' - 10);
  +	i = ch - ('a' - 10);
       i <<= 4;
   
       ch = x[1];
       if (apr_isdigit(ch))
  -    i += ch - '0';
  +	i += ch - '0';
       else if (apr_isupper(ch))
  -    i += ch - ('A' - 10);
  +	i += ch - ('A' - 10);
       else
  -    i += ch - ('a' - 10);
  +	i += ch - ('a' - 10);
       return i;
   #else /*CHARSET_EBCDIC*/
       return (1 == sscanf(x, "%2x", &i)) ? os_toebcdic[i&0xFF] : 0;
  @@ -108,15 +105,15 @@
       x[0] = '%';
       i = (ch & 0xF0) >> 4;
       if (i >= 10)
  -    x[1] = ('A' - 10) + i;
  +	x[1] = ('A' - 10) + i;
       else
  -    x[1] = '0' + i;
  +	x[1] = '0' + i;
   
       i = ch & 0x0F;
       if (i >= 10)
  -    x[2] = ('A' - 10) + i;
  +	x[2] = ('A' - 10) + i;
       else
  -    x[2] = '0' + i;
  +	x[2] = '0' + i;
   #else /*CHARSET_EBCDIC*/
       static const char ntoa[] = { "0123456789ABCDEF" };
       ch &= 0xFF;
  @@ -137,13 +134,13 @@
    * and encodes those which must be encoded, and does not touch
    * those which must not be touched.
    */
  -char *
  -     ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t, int isenc)
  +char *ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
  +	int isenc)
   {
       int i, j, ch;
       char *y;
  -    char *allowed;    /* characters which should not be encoded */
  -    char *reserved;    /* characters which much not be en/de-coded */
  +    char *allowed;	/* characters which should not be encoded */
  +    char *reserved;	/* characters which much not be en/de-coded */
   
   /* N.B. in addition to :@&=, this allows ';' in an http path
    * and '?' in an ftp path -- this may be revised
  @@ -153,51 +150,51 @@
    * it only permits ; / ? : @ = & as reserved chars.)
    */
       if (t == enc_path)
  -    allowed = "$-_.+!*'(),;:@&=";
  +	allowed = "$-_.+!*'(),;:@&=";
       else if (t == enc_search)
  -    allowed = "$-_.!*'(),;:@&=";
  +	allowed = "$-_.!*'(),;:@&=";
       else if (t == enc_user)
  -    allowed = "$-_.+!*'(),;@&=";
  +	allowed = "$-_.+!*'(),;@&=";
       else if (t == enc_fpath)
  -    allowed = "$-_.+!*'(),?:@&=";
  -    else            /* if (t == enc_parm) */
  -    allowed = "$-_.+!*'(),?/:@&=";
  +	allowed = "$-_.+!*'(),?:@&=";
  +    else			/* if (t == enc_parm) */
  +	allowed = "$-_.+!*'(),?/:@&=";
   
       if (t == enc_path)
  -    reserved = "/";
  +	reserved = "/";
       else if (t == enc_search)
  -    reserved = "+";
  +	reserved = "+";
       else
  -    reserved = "";
  +	reserved = "";
   
       y = apr_palloc(p, 3 * len + 1);
   
       for (i = 0, j = 0; i < len; i++, j++) {
   /* always handle '/' first */
  -    ch = x[i];
  -    if (strchr(reserved, ch)) {
  -        y[j] = ch;
  -        continue;
  -    }
  +	ch = x[i];
  +	if (strchr(reserved, ch)) {
  +	    y[j] = ch;
  +	    continue;
  +	}
   /* decode it if not already done */
  -    if (isenc && ch == '%') {
  -        if (!apr_isxdigit(x[i + 1]) || !apr_isxdigit(x[i + 2]))
  -        return NULL;
  -        ch = ap_proxy_hex2c(&x[i + 1]);
  -        i += 2;
  -        if (ch != 0 && strchr(reserved, ch)) {    /* keep it encoded */
  -        ap_proxy_c2hex(ch, &y[j]);
  -        j += 2;
  -        continue;
  -        }
  -    }
  +	if (isenc && ch == '%') {
  +	    if (!ap_isxdigit(x[i + 1]) || !ap_isxdigit(x[i + 2]))
  +		return NULL;
  +	    ch = ap_proxy_hex2c(&x[i + 1]);
  +	    i += 2;
  +	    if (ch != 0 && strchr(reserved, ch)) {	/* keep it encoded */
  +		ap_proxy_c2hex(ch, &y[j]);
  +		j += 2;
  +		continue;
  +	    }
  +	}
   /* recode it, if necessary */
  -    if (!apr_isalnum(ch) && !strchr(allowed, ch)) {
  -        ap_proxy_c2hex(ch, &y[j]);
  -        j += 2;
  -    }
  -    else
  -        y[j] = ch;
  +	if (!apr_isalnum(ch) && !strchr(allowed, ch)) {
  +	    ap_proxy_c2hex(ch, &y[j]);
  +	    j += 2;
  +	}
  +	else
  +	    y[j] = ch;
       }
       y[j] = '\0';
       return y;
  @@ -215,81 +212,81 @@
    */
   char *
        ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
  -            char **passwordp, char **hostp, int *port)
  +			char **passwordp, char **hostp, int *port)
   {
       int i;
       char *strp, *host, *url = *urlp;
       char *user = NULL, *password = NULL;
   
       if (url[0] != '/' || url[1] != '/')
  -    return "Malformed URL";
  +	return "Malformed URL";
       host = url + 2;
       url = strchr(host, '/');
       if (url == NULL)
  -    url = "";
  +	url = "";
       else
  -    *(url++) = '\0';    /* skip seperating '/' */
  +	*(url++) = '\0';	/* skip seperating '/' */
   
       /* find _last_ '@' since it might occur in user/password part */
       strp = strrchr(host, '@');
   
       if (strp != NULL) {
  -    *strp = '\0';
  -    user = host;
  -    host = strp + 1;
  +	*strp = '\0';
  +	user = host;
  +	host = strp + 1;
   
   /* find password */
  -    strp = strchr(user, ':');
  -    if (strp != NULL) {
  -        *strp = '\0';
  -        password = ap_proxy_canonenc(p, strp + 1, strlen(strp + 1), enc_user, 1);
  -        if (password == NULL)
  -        return "Bad %-escape in URL (password)";
  -    }
  -
  -    user = ap_proxy_canonenc(p, user, strlen(user), enc_user, 1);
  -    if (user == NULL)
  -        return "Bad %-escape in URL (username)";
  +	strp = strchr(user, ':');
  +	if (strp != NULL) {
  +	    *strp = '\0';
  +	    password = ap_proxy_canonenc(p, strp + 1, strlen(strp + 1), enc_user, 1);
  +	    if (password == NULL)
  +		return "Bad %-escape in URL (password)";
  +	}
  +
  +	user = ap_proxy_canonenc(p, user, strlen(user), enc_user, 1);
  +	if (user == NULL)
  +	    return "Bad %-escape in URL (username)";
       }
       if (userp != NULL) {
  -    *userp = user;
  +	*userp = user;
       }
       if (passwordp != NULL) {
  -    *passwordp = password;
  +	*passwordp = password;
       }
   
       strp = strrchr(host, ':');
       if (strp != NULL) {
  -    *(strp++) = '\0';
  +	*(strp++) = '\0';
   
  -    for (i = 0; strp[i] != '\0'; i++)
  -        if (!apr_isdigit(strp[i]))
  -        break;
  -
  -    /* if (i == 0) the no port was given; keep default */
  -    if (strp[i] != '\0') {
  -        return "Bad port number in URL";
  -    } else if (i > 0) {
  -        *port = atoi(strp);
  -        if (*port > 65535)
  -        return "Port number in URL > 65535";
  +	for (i = 0; strp[i] != '\0'; i++)
  +	    if (!apr_isdigit(strp[i]))
  +		break;
  +
  +	/* if (i == 0) the no port was given; keep default */
  +	if (strp[i] != '\0') {
  +	    return "Bad port number in URL";
  +	} else if (i > 0) {
  +	    *port = atoi(strp);
  +	    if (*port > 65535)
  +		return "Port number in URL > 65535";
  +	}
       }
  -    }
  -    ap_str_tolower(host);        /* DNS names are case insensitive */
  +    ap_str_tolower(host);		/* DNS names are case-insensitive */
       if (*host == '\0')
  -    return "Missing host in URL";
  +	return "Missing host in URL";
   /* check hostname syntax */
       for (i = 0; host[i] != '\0'; i++)
  -    if (!apr_isdigit(host[i]) && host[i] != '.')
  -        break;
  +	if (!apr_isdigit(host[i]) && host[i] != '.')
  +	    break;
       /* must be an IP address */
  -#ifdef WIN32
  +#if defined(WIN32) || defined(NETWARE) || defined(TPF) || defined(BEOS)
       if (host[i] == '\0' && (inet_addr(host) == -1))
   #else
  -    if (host[i] == '\0' && (apr_inet_addr(host) == -1 || inet_network(host) ==
-1))
  +    if (host[i] == '\0' && (ap_inet_addr(host) == -1 || inet_network(host) == -1))
   #endif
       {
  -    return "Bad IP address in URL";
  +	return "Bad IP address in URL";
       }
   
   /*    if (strchr(host,'.') == NULL && domain != NULL)
  @@ -321,49 +318,49 @@
       q = strchr(x, ',');
       /* check for RFC 850 date */
       if (q != NULL && q - x > 3 && q[1] == ' ') {
  -    *q = '\0';
  -    for (wk = 0; wk < 7; wk++)
  -        if (strcmp(x, lwday[wk]) == 0)
  -        break;
  -    *q = ',';
  -    if (wk == 7)
  -        return x;        /* not a valid date */
  -    if (q[4] != '-' || q[8] != '-' || q[11] != ' ' || q[14] != ':' ||
  -        q[17] != ':' || strcmp(&q[20], " GMT") != 0)
  -        return x;
  -    if (sscanf(q + 2, "%u-%3s-%u %u:%u:%u %3s", &mday, month, &year,
  -           &hour, &min, &sec, zone) != 7)
  -        return x;
  -    if (year < 70)
  -        year += 2000;
  -    else
  -        year += 1900;
  +	*q = '\0';
  +	for (wk = 0; wk < 7; wk++)
  +	    if (strcmp(x, lwday[wk]) == 0)
  +		break;
  +	*q = ',';
  +	if (wk == 7)
  +	    return x;		/* not a valid date */
  +	if (q[4] != '-' || q[8] != '-' || q[11] != ' ' || q[14] != ':' ||
  +	    q[17] != ':' || strcmp(&q[20], " GMT") != 0)
  +	    return x;
  +	if (sscanf(q + 2, "%u-%3s-%u %u:%u:%u %3s", &mday, month, &year,
  +		   &hour, &min, &sec, zone) != 7)
  +	    return x;
  +	if (year < 70)
  +	    year += 2000;
  +	else
  +	    year += 1900;
       }
       else {
   /* check for acstime() date */
  -    if (x[3] != ' ' || x[7] != ' ' || x[10] != ' ' || x[13] != ':' ||
  -        x[16] != ':' || x[19] != ' ' || x[24] != '\0')
  -        return x;
  -    if (sscanf(x, "%3s %3s %u %u:%u:%u %u", week, month, &mday, &hour,
  -           &min, &sec, &year) != 7)
  -        return x;
  -    for (wk = 0; wk < 7; wk++)
  -        if (strcmp(week, apr_day_snames[wk]) == 0)
  -        break;
  -    if (wk == 7)
  -        return x;
  +	if (x[3] != ' ' || x[7] != ' ' || x[10] != ' ' || x[13] != ':' ||
  +	    x[16] != ':' || x[19] != ' ' || x[24] != '\0')
  +	    return x;
  +	if (sscanf(x, "%3s %3s %u %u:%u:%u %u", week, month, &mday, &hour,
  +		   &min, &sec, &year) != 7)
  +	    return x;
  +	for (wk = 0; wk < 7; wk++)
  +	    if (strcmp(week, ap_day_snames[wk]) == 0)
  +		break;
  +	if (wk == 7)
  +	    return x;
       }
   
   /* check date */
       for (mon = 0; mon < 12; mon++)
  -    if (strcmp(month, apr_month_snames[mon]) == 0)
  -        break;
  +	if (strcmp(month, ap_month_snames[mon]) == 0)
  +	    break;
       if (mon == 12)
  -    return x;
  +	return x;
   
       q = apr_palloc(p, 30);
  -    apr_snprintf(q, 30, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", apr_day_snames[wk], mday,
  -        apr_month_snames[mon], year, hour, min, sec);
  +    apr_snprintf(q, 30, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", ap_day_snames[wk],
  +       mday, ap_month_snames[mon], year, hour, min, sec);
       return q;
   }
   
  @@ -439,61 +436,61 @@
       char *value, *end;
       char field[MAX_STRING_LEN];
   
  -    resp_hdrs = apr_make_table(r->pool, 20);
  +    resp_hdrs = ap_make_table(r->pool, 20);
   
       /*
        * Read header lines until we get the empty separator line, a read error,
        * the connection closes (EOF), or we timeout.
        */
       while ((len = proxy_getline(buffer, size, f, 1)) > 0) {
  -    
  -    if (!(value = strchr(buffer, ':'))) {     /* Find the colon separator */
  -
  -        /* Buggy MS IIS servers sometimes return invalid headers
  -         * (an extra "HTTP/1.0 200, OK" line sprinkled in between
  -         * the usual MIME headers). Try to deal with it in a sensible
  -         * way, but log the fact.
  -         * XXX: The mask check is buggy if we ever see an HTTP/1.10 */
  -
  -        if (!ap_checkmask(buffer, "HTTP/#.# ###*")) {
  -        /* Nope, it wasn't even an extra HTTP header. Give up. */
  -        return NULL;
  -        }
  +	
  +	if (!(value = strchr(buffer, ':'))) {     /* Find the colon separator */
   
  -        ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r->server,
  -             "proxy: Ignoring duplicate HTTP header "
  -             "returned by %s (%s)", r->uri, r->method);
  -        continue;
  -    }
  +	    /* Buggy MS IIS servers sometimes return invalid headers
  +	     * (an extra "HTTP/1.0 200, OK" line sprinkled in between
  +	     * the usual MIME headers). Try to deal with it in a sensible
  +	     * way, but log the fact.
  +	     * XXX: The mask check is buggy if we ever see an HTTP/1.10 */
  +
  +	    if (!ap_checkmask(buffer, "HTTP/#.# ###*")) {
  +		/* Nope, it wasn't even an extra HTTP header. Give up. */
  +		return NULL;
  +	    }
  +
  +	    ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r->server,
  +			 "proxy: Ignoring duplicate HTTP header "
  +			 "returned by %s (%s)", r->uri, r->method);
  +	    continue;
  +	}
   
           *value = '\0';
           ++value;
  -    /* XXX: RFC2068 defines only SP and HT as whitespace, this test is
  -     * wrong... and so are many others probably.
  -     */
  +	/* XXX: RFC2068 defines only SP and HT as whitespace, this test is
  +	 * wrong... and so are many others probably.
  +	 */
           while (apr_isspace(*value))
               ++value;            /* Skip to start of value   */
   
  -    /* should strip trailing whitespace as well */
  -    for (end = &value[strlen(value)-1]; end > value && apr_isspace(*end);
--end)
  -        *end = '\0';
  -
  -        apr_table_add(resp_hdrs, buffer, value);
  -
  -    /* the header was too long; at the least we should skip extra data */
  -    if (len >= size - 1) { 
  -        while ((len = proxy_getline(field, MAX_STRING_LEN, f, 1))
  -            >= MAX_STRING_LEN - 1) {
  -        /* soak up the extra data */
  -        }
  -        if (len == 0) /* time to exit the larger loop as well */
  -        break;
  -    }
  +	/* should strip trailing whitespace as well */
  +	for (end = &value[strlen(value)-1]; end > value && apr_isspace(*end); --end)
  +	    *end = '\0';
  +
  +        ap_table_add(resp_hdrs, buffer, value);
  +
  +	/* the header was too long; at the least we should skip extra data */
  +	if (len >= size - 1) { 
  +	    while ((len = proxy_getline(field, MAX_STRING_LEN, f, 1))
  +		    >= MAX_STRING_LEN - 1) {
  +		/* soak up the extra data */
  +	    }
  +	    if (len == 0) /* time to exit the larger loop as well */
  +		break;
  +	}
       }
       return resp_hdrs;
   }
   
  -long int ap_proxy_send_fb(proxy_completion *completion, BUFF *f, request_rec *r, ap_cache_el
 *c)
  +long int ap_proxy_send_fb(proxy_completion *completion, BUFF *f, request_rec *r, ap_cache_el
*c)
   {
       int  ok;
       char buf[IOBUFSIZE];
  @@ -501,10 +498,10 @@
       apr_ssize_t cntr;
       register int n, o;
       conn_rec *con = r->connection;
  -    int alternate_timeouts = 1;    /* 1 if we alternate between soft & hard timeouts
*/
  +    int alternate_timeouts = 1;	/* 1 if we alternate between soft & hard timeouts */
       apr_file_t *cachefp = NULL;
       int written = 0, wrote_to_cache;
  -    
  +	
       total_bytes_rcvd = 0;
       if (c) ap_cache_el_data(c, &cachefp);
   
  @@ -512,7 +509,7 @@
       /* The cache copy is ASCII, not EBCDIC, even for text/html) */
       ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
       if (c != NULL && c->fp != NULL)
  -        ap_bsetflag(c->fp, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
  +		ap_bsetflag(c->fp, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
       ap_bsetflag(con->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
   #endif
   
  @@ -521,17 +518,20 @@
        * has its own timeout handler which can set both buffers to EOUT.
        */
   
  -#ifdef WIN32
  +#if defined(WIN32) || defined(TPF) || defined(NETWARE)
       /* works fine under win32, so leave it */
  +    alternate_timeouts = 0;
   #else
       /* CHECKME! Since hard_timeout won't work in unix on sends with partial
        * cache completion, we have to alternate between hard_timeout
        * for reads, and soft_timeout for send.  This is because we need
        * to get a return from ap_bwrite to be able to continue caching.
        * BUT, if we *can't* continue anyway, just use hard_timeout.
  +     * (Also, if no cache file is written, use hard timeouts)
        */
   
  -    if (!completion || completion->content_length > 0 || completion->cache_completion
== 1.0) {
  +    if (!completion || completion->content_length > 0
  +      || completion->cache_completion == 1.0) {
           alternate_timeouts = 0;
       }
   #endif
  @@ -540,28 +540,26 @@
        * or (after the client aborted) while we can successfully
        * read and finish the configured cache_completion.
        */
  -    for (ok = 1; ok; cntr=0) {
  -        /* Read block from server */
  -        if(ap_bread(f, buf, IOBUFSIZE, &cntr) != APR_SUCCESS && !cntr)
  +    for (ok = 1; ok; cntr = 0) {
  +	/* Read block from server */
  +	if (ap_bread(f, buf, IOBUFSIZE, &cntr) != APR_SUCCESS && !cntr)
           {
               if (c != NULL) {
                   ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
  -                              "proxy: error reading from %s", c->name);
  +                    "proxy: error reading from %s", c->name);
                   ap_proxy_cache_error(&c);
               }
               break;
  -        }
  +	}
           else if(cntr == 0) break;
  -       
  -    
  -        /* Write to cache first. */
  -        /*@@@ XXX FIXME: Assuming that writing the cache file won't time out?!!? */
  +
  +	/* Write to cache first. */
  +	/*@@@ XXX FIXME: Assuming that writing the cache file won't time out?!!? */
           wrote_to_cache = cntr;
           if (cachefp && apr_write(cachefp, &buf[0], &wrote_to_cache) !=
APR_SUCCESS) {
               ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
  -                          "proxy: error writing to cache");
  +		"proxy: error writing to cache");
               ap_proxy_cache_error(&c);
  -            cachefp = NULL;
           } else {
               written += n;
           }
  @@ -570,7 +568,7 @@
           total_bytes_rcvd += cntr;
           in_buffer = cntr;
   
  -        /* Write the block to the client, detect aborted transfers */
  +	/* Write the block to the client, detect aborted transfers */
           while (!con->aborted && in_buffer > 0) {
               if (ap_bwrite(con->client, &buf[o], in_buffer, &cntr) != APR_SUCCESS)
{
                   if (completion) {
  @@ -594,7 +592,7 @@
       } /* loop and ap_bread while "ok" */
   
       if (!con->aborted)
  -        ap_bflush(con->client);
  +	ap_bflush(con->client);
   
       return total_bytes_rcvd;
   }
  @@ -608,25 +606,25 @@
    */
   void ap_proxy_send_headers(request_rec *r, const char *respline, apr_table_t *t)
   {
  -    int i;
  -    BUFF *fp = r->connection->client;
  -    apr_table_entry_t *elts = (apr_table_entry_t *) apr_table_elts(t)->elts;
  -
  -    ap_bvputs(fp, respline, CRLF, NULL);
  -
  -    for (i = 0; i < apr_table_elts(t)->nelts; ++i) {
  -        if (elts[i].key != NULL) {
  -            ap_bvputs(fp, elts[i].key, ": ", elts[i].val, CRLF, NULL);
  -            apr_table_addn(r->headers_out, elts[i].key, elts[i].val);
  -        }
  -    }
  +	int i;
  +	BUFF *fp = r->connection->client;
  +	apr_table_entry_t *elts = (apr_table_entry_t *) apr_table_elts(t)->elts;
  +
  +	ap_bvputs(fp, respline, CRLF, NULL);
  +
  +	for (i = 0; i < ap_table_elts(t)->nelts; ++i) {
  +            if (elts[i].key != NULL) {
  +                ap_bvputs(fp, elts[i].key, ": ", elts[i].val, CRLF, NULL);
  +                apr_table_addn(r->headers_out, elts[i].key, elts[i].val);
  +            }
  +	}
   
  -    ap_bputs(CRLF, fp);
  +	ap_bputs(CRLF, fp);
   }
   
   
   /*
  - * list is a comma-separated list of case insensitive tokens, with
  + * list is a comma-separated list of case-insensitive tokens, with
    * optional whitespace around the tokens.
    * The return returns 1 if the token val is found in the list, or 0
    * otherwise.
  @@ -639,26 +637,25 @@
       len = strlen(val);
   
       while (list != NULL) {
  -    p = ap_strchr_c(list, ',');
  -    if (p != NULL) {
  -        i = p - list;
  -        do
  -        p++;
  -        while (apr_isspace(*p));
  +	p = ap_strchr_c(list, ',');
  +	if (p != NULL) {
  +	    i = p - list;
  +	    do
  +		p++;
  +	    while (apr_isspace(*p));
  +	}
  +	else
  +	    i = strlen(list);
  +
  +	while (i > 0 && apr_isspace(list[i - 1]))
  +	    i--;
  +	if (i == len && strncasecmp(list, val, len) == 0)
  +	    return 1;
  +	list = p;
       }
  -    else
  -        i = strlen(list);
  -
  -    while (i > 0 && apr_isspace(list[i - 1]))
  -        i--;
  -    if (i == len && strncasecmp(list, val, len) == 0)
  -        return 1;
  -    list = p;
  -    }
       return 0;
   }
   
  -
   /*
    * Converts 8 hex digits to a time integer
    */
  @@ -668,19 +665,19 @@
       unsigned int j;
   
       for (i = 0, j = 0; i < 8; i++) {
  -    ch = x[i];
  -    j <<= 4;
  -    if (apr_isdigit(ch))
  -        j |= ch - '0';
  -    else if (apr_isupper(ch))
  -        j |= ch - ('A' - 10);
  -    else
  -        j |= ch - ('a' - 10);
  +	ch = x[i];
  +	j <<= 4;
  +	if (apr_isdigit(ch))
  +	    j |= ch - '0';
  +	else if (apr_isupper(ch))
  +	    j |= ch - ('A' - 10);
  +	else
  +	    j |= ch - ('a' - 10);
       }
       if (j == 0xffffffff)
  -    return -1;        /* so that it works with 8-byte ints */
  +	return -1;		/* so that it works with 8-byte ints */
       else
  -    return j;
  +	return j;
   }
   
   /*
  @@ -692,18 +689,18 @@
       unsigned int j = t;
   
       for (i = 7; i >= 0; i--) {
  -    ch = j & 0xF;
  -    j >>= 4;
  -    if (ch >= 10)
  -        y[i] = ch + ('A' - 10);
  -    else
  -        y[i] = ch + '0';
  +	ch = j & 0xF;
  +	j >>= 4;
  +	if (ch >= 10)
  +	    y[i] = ch + ('A' - 10);
  +	else
  +	    y[i] = ch + '0';
       }
       y[8] = '\0';
   }
   
   
  -void ap_proxy_cache_error(ap_cache_el  **c)
  +void ap_proxy_cache_error(ap_cache_el **c)
   {
       if (c && *c) {
           const char *name = (*c)->name;
  @@ -716,15 +713,15 @@
   int ap_proxyerror(request_rec *r, int statuscode, const char *message)
   {
       apr_table_setn(r->notes, "error-notes",
  -          apr_pstrcat(r->pool, 
  -                 "The proxy server could not handle the request "
  -                 "<EM><A HREF=\"", ap_escape_uri(r->pool, r->uri),
  -                 "\">", ap_escape_html(r->pool, r->method),
  -                 "&nbsp;", 
  -                 ap_escape_html(r->pool, r->uri), "</A></EM>.<P>\n"
  -                 "Reason: <STRONG>",
  -                 ap_escape_html(r->pool, message), 
  -                 "</STRONG>", NULL));
  +	apr_pstrcat(r->pool, 
  +		"The proxy server could not handle the request "
  +		"<EM><A HREF=\"", ap_escape_uri(r->pool, r->uri),
  +		"\">", ap_escape_html(r->pool, r->method),
  +		"&nbsp;", 
  +		ap_escape_html(r->pool, r->uri), "</A></EM>.<P>\n"
  +		"Reason: <STRONG>",
  +		ap_escape_html(r->pool, message), 
  +		"</STRONG>", NULL));
   
       /* Allow "error-notes" string to be printed by ap_send_error_response() */
       apr_table_setn(r->notes, "verbose-error-to", apr_pstrdup(r->pool, "*"));
  @@ -740,34 +737,30 @@
   {
       int i;
       struct hostent *hp;
  -/* XXX - Either get rid of TLS, or use pthread/APR functions */
  -#define APACHE_TLS
  -    static APACHE_TLS struct hostent hpbuf;
  -    static APACHE_TLS u_long ipaddr;
  -    static APACHE_TLS char *charpbuf[2];
  +    struct per_thread_data *ptd = get_per_thread_data();
   
       for (i = 0; host[i] != '\0'; i++)
  -        if (!apr_isdigit(host[i]) && host[i] != '.')
  -            break;
  +	if (!apr_isdigit(host[i]) && host[i] != '.')
  +	    break;
   
       if (host[i] != '\0') {
  -        hp = gethostbyname(host);
  -        if (hp == NULL)
  -            return "Host not found";
  +	hp = gethostbyname(host);
  +	if (hp == NULL)
  +	    return "Host not found";
       }
       else {
  -        ipaddr = apr_inet_addr(host);
  -        hp = gethostbyaddr((char *) &ipaddr, sizeof(u_long), AF_INET);
  -        if (hp == NULL) {
  -            memset(&hpbuf, 0, sizeof(hpbuf));
  -            hpbuf.h_name = 0;
  -            hpbuf.h_addrtype = AF_INET;
  -            hpbuf.h_length = sizeof(u_long);
  -            hpbuf.h_addr_list = charpbuf;
  -            hpbuf.h_addr_list[0] = (char *) &ipaddr;
  -            hpbuf.h_addr_list[1] = 0;
  -            hp = &hpbuf;
  -        }
  +	ptd->ipaddr = ap_inet_addr(host);
  +	hp = gethostbyaddr((char *) &ptd->ipaddr, sizeof(ptd->ipaddr), AF_INET);
  +	if (hp == NULL) {
  +	    memset(&ptd->hpbuf, 0, sizeof(ptd->hpbuf));
  +	    ptd->hpbuf.h_name = 0;
  +	    ptd->hpbuf.h_addrtype = AF_INET;
  +	    ptd->hpbuf.h_length = sizeof(ptd->ipaddr);
  +	    ptd->hpbuf.h_addr_list = ptd->charpbuf;
  +	    ptd->hpbuf.h_addr_list[0] = (char *) &ptd->ipaddr;
  +	    ptd->hpbuf.h_addr_list[1] = 0;
  +	    hp = &ptd->hpbuf;
  +	}
       }
       *reqhp = *hp;
       return NULL;
  @@ -780,24 +773,24 @@
       int port = -1;
   
       if (r->hostname != NULL)
  -    return r->hostname;
  +	return r->hostname;
   
       /* Set url to the first char after "scheme://" */
       if ((url = strchr(r->uri, ':')) == NULL
  -    || url[1] != '/' || url[2] != '/')
  -    return NULL;
  +	|| url[1] != '/' || url[2] != '/')
  +	return NULL;
   
  -    url = apr_pstrdup(r->pool, &url[1]);    /* make it point to "//", which is what
proxy_canon_netloc expects */
  +    url = apr_pstrdup(r->pool, &url[1]);	/* make it point to "//", which is what
proxy_canon_netloc expects */
   
       err = ap_proxy_canon_netloc(r->pool, &url, &user, &password, &host,
&port);
   
       if (err != NULL)
  -    ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
  -             "%s", err);
  +	ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r,
  +		     "%s", err);
   
       r->hostname = host;
   
  -    return host;        /* ought to return the port, too */
  +    return host;		/* ought to return the port, too */
   }
   
   /* Return TRUE if addr represents an IP address (or an IP network address) */
  @@ -809,7 +802,7 @@
       long bits;
   
       /* if the address is given with an explicit netmask, use that */
  -    /* Due to a deficiency in apr_inet_addr(), it is impossible to parse */
  +    /* Due to a deficiency in ap_inet_addr(), it is impossible to parse */
       /* "partial" addresses (with less than 4 quads) correctly, i.e.  */
       /* 192.168.123 is parsed as 192.168.0.123, which is not what I want. */
       /* I therefore have to parse the IP address manually: */
  @@ -822,86 +815,87 @@
   
       /* Iterate over up to 4 (dotted) quads. */
       for (quads = 0; quads < 4 && *addr != '\0'; ++quads) {
  -    char *tmp;
  +	char *tmp;
   
  -    if (*addr == '/' && quads > 0)    /* netmask starts here. */
  -        break;
  +	if (*addr == '/' && quads > 0)	/* netmask starts here. */
  +	    break;
   
  -    if (!apr_isdigit(*addr))
  -        return 0;        /* no digit at start of quad */
  +	if (!apr_isdigit(*addr))
  +	    return 0;		/* no digit at start of quad */
   
  -    ip_addr[quads] = strtol(addr, &tmp, 0);
  +	ip_addr[quads] = strtol(addr, &tmp, 0);
   
  -    if (tmp == addr)    /* expected a digit, found something else */
  -        return 0;
  +	if (tmp == addr)	/* expected a digit, found something else */
  +	    return 0;
   
  -    if (ip_addr[quads] < 0 || ip_addr[quads] > 255) {
  -        /* invalid octet */
  -        return 0;
  -    }
  +	if (ip_addr[quads] < 0 || ip_addr[quads] > 255) {
  +	    /* invalid octet */
  +	    return 0;
  +	}
   
  -    addr = tmp;
  +	addr = tmp;
   
  -    if (*addr == '.' && quads != 3)
  -        ++addr;        /* after the 4th quad, a dot would be illegal */
  +	if (*addr == '.' && quads != 3)
  +	    ++addr;		/* after the 4th quad, a dot would be illegal */
       }
   
       for (This->addr.s_addr = 0, i = 0; i < quads; ++i)
  -    This->addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i));
  +	This->addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i));
   
  -    if (addr[0] == '/' && apr_isdigit(addr[1])) {    /* net mask follows: */
  -    char *tmp;
  +    if (addr[0] == '/' && apr_isdigit(addr[1])) {	/* net mask follows: */
  +	char *tmp;
   
  -    ++addr;
  +	++addr;
   
  -    bits = strtol(addr, &tmp, 0);
  +	bits = strtol(addr, &tmp, 0);
   
  -    if (tmp == addr)    /* expected a digit, found something else */
  -        return 0;
  +	if (tmp == addr)	/* expected a digit, found something else */
  +	    return 0;
   
  -    addr = tmp;
  +	addr = tmp;
   
  -    if (bits < 0 || bits > 32)    /* netmask must be between 0 and 32 */
  -        return 0;
  +	if (bits < 0 || bits > 32)	/* netmask must be between 0 and 32 */
  +	    return 0;
   
       }
       else {
  -    /* Determine (i.e., "guess") netmask by counting the */
  -    /* number of trailing .0's; reduce #quads appropriately */
  -    /* (so that 192.168.0.0 is equivalent to 192.168.)        */
  -    while (quads > 0 && ip_addr[quads - 1] == 0)
  -        --quads;
  -
  -    /* "IP Address should be given in dotted-quad form, optionally followed by a netmask
(e.g., 192.168.111.0/24)"; */
  -    if (quads < 1)
  -        return 0;
  -
  -    /* every zero-byte counts as 8 zero-bits */
  -    bits = 8 * quads;
  -
  -    if (bits != 32)        /* no warning for fully qualified IP address */
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  -                         "Warning: NetMask not supplied with IP-Addr; guessing: %s/%ld",
  -            inet_ntoa(This->addr), bits);
  +	/* Determine (i.e., "guess") netmask by counting the */
  +	/* number of trailing .0's; reduce #quads appropriately */
  +	/* (so that 192.168.0.0 is equivalent to 192.168.)        */
  +	while (quads > 0 && ip_addr[quads - 1] == 0)
  +	    --quads;
  +
  +	/* "IP Address should be given in dotted-quad form, optionally followed by a netmask (e.g.,
192.168.111.0/24)"; */
  +	if (quads < 1)
  +	    return 0;
  +
  +	/* every zero-byte counts as 8 zero-bits */
  +	bits = 8 * quads;
  +
  +	if (bits != 32)		/* no warning for fully qualified IP address */
  +            ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +	      "Warning: NetMask not supplied with IP-Addr; guessing: %s/%ld\n",
  +		 inet_ntoa(This->addr), bits);
       }
   
  -    This->mask.s_addr = htonl(APR_INADDR_NONE << (32 - bits));
  +    This->mask.s_addr = htonl(INADDR_NONE << (32 - bits));
   
       if (*addr == '\0' && (This->addr.s_addr & ~This->mask.s_addr) !=
0) {
  -    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "Warning: NetMask
and IP-Addr disagree in %s/%ld",
  -        inet_ntoa(This->addr), bits);
  -    This->addr.s_addr &= This->mask.s_addr;
  -    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  -                     "         Set to %s/%ld",
  -        inet_ntoa(This->addr), bits);
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +	    "Warning: NetMask and IP-Addr disagree in %s/%ld\n",
  +		inet_ntoa(This->addr), bits);
  +	This->addr.s_addr &= This->mask.s_addr;
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +	    "         Set to %s/%ld\n",
  +		inet_ntoa(This->addr), bits);
       }
   
       if (*addr == '\0') {
  -    This->matcher = proxy_match_ipaddr;
  -    return 1;
  +	This->matcher = proxy_match_ipaddr;
  +	return 1;
       }
       else
  -    return (*addr == '\0');    /* okay iff we've parsed the whole string */
  +	return (*addr == '\0');	/* okay iff we've parsed the whole string */
   }
   
   /* Return TRUE if addr represents an IP address (or an IP network address) */
  @@ -922,54 +916,54 @@
       memset(ip_addr, '\0', sizeof ip_addr);
   
       if (4 == sscanf(host, "%d.%d.%d.%d", &ip_addr[0], &ip_addr[1], &ip_addr[2],
&ip_addr[3])) {
  -    for (addr.s_addr = 0, i = 0; i < 4; ++i)
  -        addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i));
  +	for (addr.s_addr = 0, i = 0; i < 4; ++i)
  +	    addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i));
   
  -    if (This->addr.s_addr == (addr.s_addr & This->mask.s_addr)) {
  +	if (This->addr.s_addr == (addr.s_addr & This->mask.s_addr)) {
   #if DEBUGGING
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "1)IP-Match: %s[%s] <-> ", host, inet_ntoa(addr));
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "%s/", inet_ntoa(This->addr));
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "%s", inet_ntoa(This->mask));
   #endif
  -        return 1;
  -    }
  +	    return 1;
  +	}
   #if DEBUGGING
  -    else {
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +	else {
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "1)IP-NoMatch: %s[%s] <-> ", host, inet_ntoa(addr));
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "%s/", inet_ntoa(This->addr));
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "%s", inet_ntoa(This->mask));
  -    }
  +	}
   #endif
       }
       else {
  -    struct hostent the_host;
  +	struct hostent the_host;
   
  -    memset(&the_host, '\0', sizeof the_host);
  -    found = ap_proxy_host2addr(host, &the_host);
  +	memset(&the_host, '\0', sizeof the_host);
  +	found = ap_proxy_host2addr(host, &the_host);
   
  -    if (found != NULL) {
  +	if (found != NULL) {
   #if DEBUGGING
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                            "2)IP-NoMatch: hostname=%s msg=%s", host, found);
   #endif
  -        return 0;
  -    }
  -
  -    if (the_host.h_name != NULL)
  -        found = the_host.h_name;
  -    else
  -        found = host;
  +	    return 0;
  +	}
   
  -    /* Try to deal with multiple IP addr's for a host */
  -    for (ip_listptr = the_host.h_addr_list; *ip_listptr; ++ip_listptr) {
  -        ip_list = (struct in_addr *) *ip_listptr;
  -        if (This->addr.s_addr == (ip_list->s_addr & This->mask.s_addr)) {
  +	if (the_host.h_name != NULL)
  +	    found = the_host.h_name;
  +	else
  +	    found = host;
  +
  +	/* Try to deal with multiple IP addr's for a host */
  +	for (ip_listptr = the_host.h_addr_list; *ip_listptr; ++ip_listptr) {
  +	    ip_list = (struct in_addr *) *ip_listptr;
  +	    if (This->addr.s_addr == (ip_list->s_addr & This->mask.s_addr)) {
   #if DEBUGGING
           ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                          "3)IP-Match: %s[%s] <-> ", found, inet_ntoa(*ip_list));
  @@ -978,19 +972,19 @@
           ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                          "%s", inet_ntoa(This->mask));
   #endif
  -        return 1;
  -        }
  +		return 1;
  +	    }
   #if DEBUGGING
  -        else {
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +	    else {
  +                ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                          "3)IP-NoMatch: %s[%s] <-> ", found, inet_ntoa(*ip_list));
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +                ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                          "%s/", inet_ntoa(This->addr));
  -        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +                ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                          "%s", inet_ntoa(This->mask));
  -        }
  +	    }
   #endif
  -    }
  +	}
       }
   
       return 0;
  @@ -1004,26 +998,26 @@
   
       /* Domain name must start with a '.' */
       if (addr[0] != '.')
  -    return 0;
  +	return 0;
   
       /* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */
       for (i = 0; apr_isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i)
  -    continue;
  +	continue;
   
   #if 0
       if (addr[i] == ':') {
  -    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                        "@@@@ handle optional port in proxy_is_domainname()");
  -    /* @@@@ handle optional port */
  +	/* @@@@ handle optional port */
       }
   #endif
   
       if (addr[i] != '\0')
  -    return 0;
  +	return 0;
   
       /* Strip trailing dots */
       for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i)
  -    addr[i] = '\0';
  +	addr[i] = '\0';
   
       This->matcher = proxy_match_domainname;
       return 1;
  @@ -1035,19 +1029,19 @@
       const char *host = proxy_get_host_of_request(r);
       int d_len = strlen(This->name), h_len;
   
  -    if (host == NULL)        /* some error was logged already */
  -    return 0;
  +    if (host == NULL)		/* some error was logged already */
  +	return 0;
   
       h_len = strlen(host);
   
       /* @@@ do this within the setup? */
       /* Ignore trailing dots in domain comparison: */
       while (d_len > 0 && This->name[d_len - 1] == '.')
  -    --d_len;
  +	--d_len;
       while (h_len > 0 && host[h_len - 1] == '.')
  -    --h_len;
  +	--h_len;
       return h_len > d_len
  -    && strncasecmp(&host[h_len - d_len], This->name, d_len) == 0;
  +	&& strncasecmp(&host[h_len - d_len], This->name, d_len) == 0;
   }
   
   /* Return TRUE if addr represents a host name */
  @@ -1059,27 +1053,27 @@
   
       /* Host names must not start with a '.' */
       if (addr[0] == '.')
  -    return 0;
  +	return 0;
   
       /* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */
       for (i = 0; apr_isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i);
   
   #if 0
       if (addr[i] == ':') {
  -    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +    ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                        "@@@@ handle optional port in proxy_is_hostname()");
  -    /* @@@@ handle optional port */
  +	/* @@@@ handle optional port */
       }
   #endif
   
       if (addr[i] != '\0' || ap_proxy_host2addr(addr, &host) != NULL)
  -    return 0;
  +	return 0;
   
       This->hostentry = ap_pduphostent (p, &host);
   
       /* Strip trailing dots */
       for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i)
  -    addr[i] = '\0';
  +	addr[i] = '\0';
   
       This->matcher = proxy_match_hostname;
       return 1;
  @@ -1104,17 +1098,17 @@
   
       /* Try to deal with multiple IP addr's for a host */
       for (ip_list = *This->hostentry->h_addr_list; *ip_list != 0UL; ++ip_list)
  -    if (*ip_list == ? ? ? ? ? ? ? ? ? ? ? ? ?)
  -        return 1;
  +	if (*ip_list == ? ? ? ? ? ? ? ? ? ? ? ? ?)
  +	    return 1;
   #endif
   
       /* Ignore trailing dots in host2 comparison: */
       while (h2_len > 0 && host2[h2_len - 1] == '.')
  -    --h2_len;
  +	--h2_len;
       while (h1_len > 0 && host[h1_len - 1] == '.')
  -    --h1_len;
  +	--h1_len;
       return h1_len == h2_len
  -    && strncasecmp(host, host2, h1_len) == 0;
  +	&& strncasecmp(host, host2, h1_len) == 0;
   }
   
   /* Return TRUE if addr is to be matched as a word */
  @@ -1134,6 +1128,7 @@
   int ap_proxy_doconnect(apr_socket_t *sock, char *host, apr_uint32_t port, request_rec *r)
   {
       int i;
  +
       for (i = 0; host[i] != '\0'; i++)
           if (!apr_isdigit(host[i]) && host[i] != '.')
               break;
  @@ -1151,14 +1146,15 @@
           else if (rv == APR_SUCCESS)
               return 0;
           else {
  -            ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy connect to %s port %d failed",
host, port);
  +            ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
  +                "proxy connect to %s port %d failed", host, port);
               return -1;
           }
       }
       return -1;
   }
   
  -/* This function is called by apr_table_do() for all header lines */
  +/* This function is called by ap_table_do() for all header lines */
   /* (from proxy_http.c and proxy_ftp.c) */
   /* It is passed a table_do_args struct pointer and a MIME field and value pair */
   int ap_proxy_send_hdr_line(void *p, const char *key, const char *value)
  @@ -1168,18 +1164,63 @@
           return 1;
       if (!r->assbackwards)
           ap_rvputs(r, key, ": ", value, CRLF, NULL);
  -    return 1; /* tell apr_table_do() to continue calling us for more headers */
  +    return 1; /* tell ap_table_do() to continue calling us for more headers */
   }
   
   /* send a text line to one or two BUFF's; return line length */
  -unsigned ap_proxy_bputs2(const char *data, BUFF *client, ap_cache_el  *cache)
  +unsigned ap_proxy_bputs2(const char *data, BUFF *client, ap_cache_el *cache)
   {
       unsigned len = ap_bputs(data, client);
       apr_file_t *cachefp = NULL;
  -    
  +
       if (ap_cache_el_data(cache, &cachefp) == APR_SUCCESS)
  -        apr_puts(data, cachefp);
  +	apr_puts(data, cachefp);
       return len;
  +}
  +
  +#if defined WIN32
  +
  +static DWORD tls_index;
  +
  +BOOL WINAPI DllMain (HINSTANCE dllhandle, DWORD reason, LPVOID reserved)
  +{
  +    LPVOID memptr;
  +
  +    switch (reason) {
  +    case DLL_PROCESS_ATTACH:
  +	tls_index = TlsAlloc();
  +    case DLL_THREAD_ATTACH: /* intentional no break */
  +	TlsSetValue (tls_index, malloc (sizeof (struct per_thread_data)));
  +	break;
  +    case DLL_THREAD_DETACH:
  +	memptr = TlsGetValue (tls_index);
  +	if (memptr) {
  +	    free (memptr);
  +	    TlsSetValue (tls_index, 0);
  +	}
  +	break;
  +    }
  +
  +    return TRUE;
  +}
  +
  +#endif
  +
  +static struct per_thread_data *get_per_thread_data(void)
  +{
  +#if 0
  +#if defined(WIN32)
  +
  +    return (struct per_thread_data *) TlsGetValue (tls_index);
  +
  +#else
  +
  +    static APACHE_TLS struct per_thread_data sptd;
  +    return &sptd;
  +
  +#endif
  +#endif
  +    return NULL;
   }
   
   int ap_proxy_cache_send(request_rec *r, ap_cache_el *c)
  
  
  

Mime
View raw message