You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2001/04/13 17:51:33 UTC

cvs commit: httpd-proxy/module-2.0 mod_proxy.c mod_proxy.h

minfrin     01/04/13 08:51:33

  Modified:    .        CHANGES
               module-2.0 mod_proxy.c mod_proxy.h
  Log:
  Added Max-Forwards support for all request types so as to prevent
  loops.
  PR: 1085
  
  Revision  Changes    Path
  1.25      +4 -0      httpd-proxy/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-proxy/CHANGES,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- CHANGES	2001/04/13 09:08:28	1.24
  +++ CHANGES	2001/04/13 15:51:32	1.25
  @@ -1,6 +1,10 @@
   
   mod_proxy changes for 2.0.15 current
   
  +  *) Added Max-Forwards support for all request types so as to prevent
  +     loops.
  +     [Graham Leggett <mi...@sharp.fm>]
  +
     *) Fix warnings about byte count type on Darwin (connect handler).
        [Chuck Murcko <ch...@topsail.org>]
   
  
  
  
  1.40      +37 -6     httpd-proxy/module-2.0/mod_proxy.c
  
  Index: mod_proxy.c
  ===================================================================
  RCS file: /home/cvs/httpd-proxy/module-2.0/mod_proxy.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- mod_proxy.c	2001/04/12 01:57:47	1.39
  +++ mod_proxy.c	2001/04/13 15:51:33	1.40
  @@ -269,15 +269,17 @@
       struct proxy_remote *ents = (struct proxy_remote *) proxies->elts;
       int i, rc;
       int direct_connect = 0;
  -    const char *maxfwd_str;
  +    const char *str;
       const char *pragma, *auth, *imstr;
  +    long maxfwd;
   
  +    /* is this for us? */
       if (!r->proxyreq || strncmp(r->filename, "proxy:", 6) != 0)
   	return DECLINED;
   
  -    if ((r->method_number == M_TRACE || r->method_number == M_OPTIONS) &&
  -	(maxfwd_str = apr_table_get(r->headers_in, "Max-Forwards")) != NULL) {
  -	long maxfwd = strtol(maxfwd_str, NULL, 10);
  +    /* handle max-forwards / OPTIONS / TRACE */
  +    if ((str = apr_table_get(r->headers_in, "Max-Forwards"))) {
  +	maxfwd = strtol(str, NULL, 10);
   	if (maxfwd < 1) {
               switch (r->method_number) {
               case M_TRACE: {
  @@ -298,11 +300,20 @@
   		    ap_finalize_request_protocol(r);
   	        return OK;
               }
  +	    default: {
  +		return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  +		                     "Max-Forwards has reached zero - proxy loop?");
  +	    }
               }
   	}
  -	apr_table_setn(r->headers_in, "Max-Forwards", 
  -		      apr_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd-1 : 0));
  +	maxfwd = (maxfwd > 0) ? maxfwd - 1 : 0;
  +    }
  +    else {
  +	/* set configured max-forwards */
  +	maxfwd = conf->maxfwd;
       }
  +    apr_table_setn(r->headers_in, "Max-Forwards", 
  +		   apr_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd : 0));
   
       if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)))
   	return rc;
  @@ -417,6 +428,8 @@
       ps->req_set = 0;
       ps->recv_buffer_size = 0; /* this default was left unset for some reason */
       ps->recv_buffer_size_set = 0;
  +    ps->maxfwd = DEFAULT_MAX_FORWARDS;
  +    ps->maxfwd_set = 0;
   
       return ps;
   }
  @@ -438,6 +451,7 @@
       ps->viaopt = (overrides->viaopt_set == 0) ? base->viaopt : overrides->viaopt;
       ps->req = (overrides->req_set == 0) ? base->req : overrides->req;
       ps->recv_buffer_size = (overrides->recv_buffer_size_set == 0) ? base->recv_buffer_size : overrides->recv_buffer_size;
  +    ps->maxfwd = (overrides->maxfwd_set == 0) ? base->maxfwd : overrides->maxfwd;
   
       return ps;
   }
  @@ -664,6 +678,21 @@
       return NULL;
   }
   
  +static const char *
  +    set_max_forwards(cmd_parms *parms, void *dummy, const char *arg)
  +{
  +    proxy_server_conf *psf =
  +    ap_get_module_config(parms->server->module_config, &proxy_module);
  +    long s = atol(arg);
  +    if (s < 0) {
  +	return "ProxyMaxForwards must be greater or equal to zero..";
  +    }
  +
  +    psf->maxfwd = s;
  +    psf->maxfwd_set = 1;
  +    return NULL;
  +}
  +
   static const char*
       set_via_opt(cmd_parms *parms, void *dummy, const char *arg)
   {
  @@ -701,6 +730,8 @@
        "A list of names, hosts or domains to which the proxy will not connect"),
       AP_INIT_TAKE1("ProxyReceiveBufferSize", set_recv_buffer_size, NULL, RSRC_CONF,
        "Receive buffer size for outgoing HTTP and FTP connections in bytes"),
  +    AP_INIT_TAKE1("ProxyMaxForwards", set_max_forwards, NULL, RSRC_CONF,
  +     "The maximum number of proxies a request may be forwarded through."),
       AP_INIT_ITERATE("NoProxy", set_proxy_dirconn, NULL, RSRC_CONF,
        "A list of domains, hosts, or subnets to which the proxy will connect directly"),
       AP_INIT_TAKE1("ProxyDomain", set_proxy_domain, NULL, RSRC_CONF,
  
  
  
  1.47      +4 -0      httpd-proxy/module-2.0/mod_proxy.h
  
  Index: mod_proxy.h
  ===================================================================
  RCS file: /home/cvs/httpd-proxy/module-2.0/mod_proxy.h,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- mod_proxy.h	2001/04/12 01:57:48	1.46
  +++ mod_proxy.h	2001/04/13 15:51:33	1.47
  @@ -134,6 +134,8 @@
   #define CRLF   "\015\012"
   #endif /*APR_CHARSET_EBCDIC*/
   
  +/* default Max-Forwards header setting */
  +#define DEFAULT_MAX_FORWARDS	10
   
   /* static information about a remote proxy */
   struct proxy_remote {
  @@ -179,6 +181,8 @@
       char viaopt_set;
       size_t recv_buffer_size;
       char recv_buffer_size_set;
  +    long maxfwd;
  +    char maxfwd_set;
   } proxy_server_conf;
   
   struct per_thread_data {