httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mar...@hyperreal.org
Subject cvs commit: apache-1.3/src/modules/proxy mod_proxy.c mod_proxy.h proxy_http.c
Date Sun, 16 Aug 1998 20:51:57 GMT
martin      98/08/16 13:51:57

  Modified:    htdocs/manual/mod mod_proxy.html
               src      CHANGES
               src/include httpd.h
               src/modules/proxy mod_proxy.c mod_proxy.h proxy_http.c
  Log:
  Add proxy Via: header management. Currently, Via: headers can be left
  unchanged (compatibility), can be set to protocol and host only,
  or to protocol, host and comment. Optionally, all Via: headers can
  be suppressed if intranet privacy in companies is desired when going out
  over a firewall apache.
  
  Revision  Changes    Path
  1.44      +53 -0     apache-1.3/htdocs/manual/mod/mod_proxy.html
  
  Index: mod_proxy.html
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/htdocs/manual/mod/mod_proxy.html,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -u -r1.43 -r1.44
  --- mod_proxy.html	1998/08/06 01:05:30	1.43
  +++ mod_proxy.html	1998/08/16 20:51:52	1.44
  @@ -48,6 +48,7 @@
   <LI><A HREF="#proxyreceivebuffersize">ProxyReceiveBufferSize</A>
   <LI><A HREF="#noproxy">NoProxy</A>
   <LI><A HREF="#proxydomain">ProxyDomain</A>
  +<LI><A HREF="#proxyvia">ProxyVia</A>
   <LI><A HREF="#cacheroot">CacheRoot</A>
   <LI><A HREF="#cachesize">CacheSize</A>
   <LI><A HREF="#cachemaxexpire">CacheMaxExpire</A>
  @@ -549,6 +550,58 @@
     NoProxy         .mycompany.com 192.168.112.0/21 
     ProxyDomain     .mycompany.com
   </PRE>
  +
  +<HR>
  +
  +<H2><A NAME="proxyvia">ProxyVia</A></H2>
  +<A
  + HREF="directive-dict.html#Syntax"
  + REL="Help"
  +><STRONG>Syntax:</STRONG></A> ProxyVia { <EM>off</EM>
  +                                       | <EM>on</EM>
  +				       | <EM>full</EM>
  +				       | <EM>block</EM>
  +				       }<BR>
  +<A
  + HREF="directive-dict.html#Default"
  + REL="Help"
  +><STRONG>Default:</STRONG></A> <EM>ProxyVia off</EM><BR>
  +<A
  + HREF="directive-dict.html#Context"
  + REL="Help"
  +><STRONG>Context:</STRONG></A> server config, virtual host<BR>
  +<A
  + HREF="directive-dict.html#Override"
  + REL="Help"
  +><STRONG>Override:</STRONG></A> <EM>Not applicable</EM><BR>
  +<A
  + HREF="directive-dict.html#Status"
  + REL="Help"
  +><STRONG>Status:</STRONG></A> Base<BR>
  +<A
  + HREF="directive-dict.html#Module"
  + REL="Help"
  +><STRONG>Module:</STRONG></A> mod_proxy<BR>
  +<A
  + HREF="directive-dict.html#Compatibility"
  + REL="Help"
  +><STRONG>Compatibility:</STRONG></A> ProxyVia is only available in
  +Apache 1.3.2 and later.<P>
  +
  +This directive controls the use of the <SAMP>Via:</SAMP> HTTP header
  +by the proxy. Its intended use is to control the flow of of proxy
  +requests along a chain of proxy servers.
  +See RFC2068 (HTTP/1.1) for an explanation of <SAMP>Via:</SAMP> header lines.<UL>
  +<LI>If set to <EM>off</EM>, which is the default, no special
  +processing is performed. If a request or reply contains a <SAMP>Via:</SAMP>
header,
  +it is passed through unchanged.
  +<LI>If set to <EM>on</EM>, each request and reply will get a <SAMP>Via:</SAMP>
header
  +line added for the current host.
  +<LI>If set to <EM>full</EM>, each generated <SAMP>Via:</SAMP>
header line will
  +additionally have the Apache server version shown as a <SAMP>Via:</SAMP> comment
field.
  +<LI>If set to <EM>block</EM>, every proxy request will have all its
  +<SAMP>Via:</SAMP> header lines removed. No new <SAMP>Via:</SAMP>
header will be generated.
  +</UL>
   
   <HR>
   
  
  
  
  1.1028    +3 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1027
  retrieving revision 1.1028
  diff -u -u -r1.1027 -r1.1028
  --- CHANGES	1998/08/16 20:21:24	1.1027
  +++ CHANGES	1998/08/16 20:51:53	1.1028
  @@ -1,5 +1,8 @@
   Changes with Apache 1.3.2
   
  +  *) Make the proxy generate and understand Via: headers
  +     [Martin Kraemer]
  +
     *) Change the proxy to use tables instead of array_headers for
        the header lines. [Martin Kraemer]
   
  
  
  
  1.238     +2 -0      apache-1.3/src/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/httpd.h,v
  retrieving revision 1.237
  retrieving revision 1.238
  diff -u -u -r1.237 -r1.238
  --- httpd.h	1998/08/13 02:59:33	1.237
  +++ httpd.h	1998/08/16 20:51:54	1.238
  @@ -122,6 +122,8 @@
   /* -- Internal representation for a HTTP protocol number, e.g., HTTP/1.1 -- */
   
   #define HTTP_VERSION(major,minor) (1000*(major)+(minor))
  +#define HTTP_VERSION_MAJOR(number) ((number)/1000)
  +#define HTTP_VERSION_MINOR(number) ((number)%1000)
   
   
   /* -------------- Port number for server running standalone --------------- */
  
  
  
  1.60      +27 -2     apache-1.3/src/modules/proxy/mod_proxy.c
  
  Index: mod_proxy.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/mod_proxy.c,v
  retrieving revision 1.59
  retrieving revision 1.60
  diff -u -u -r1.59 -r1.60
  --- mod_proxy.c	1998/08/16 20:21:26	1.59
  +++ mod_proxy.c	1998/08/16 20:51:55	1.60
  @@ -67,12 +67,12 @@
   /* This will become global when the protocol abstraction comes */
   static struct proxy_services defports[] =
   {
  +    {"http", DEFAULT_HTTP_PORT},
       {"ftp", DEFAULT_FTP_PORT},
  +    {"https", DEFAULT_HTTPS_PORT},
       {"gopher", DEFAULT_GOPHER_PORT},
  -    {"http", DEFAULT_HTTP_PORT},
       {"nntp", DEFAULT_NNTP_PORT},
       {"wais", DEFAULT_WAIS_PORT},
  -    {"https", DEFAULT_HTTPS_PORT},
       {"snews", DEFAULT_SNEWS_PORT},
       {"prospero", DEFAULT_PROSPERO_PORT},
       {NULL, -1}			/* unknown port */
  @@ -415,6 +415,7 @@
       ps->dirconn = ap_make_array(p, 10, sizeof(struct dirconn_entry));
       ps->nocaches = ap_make_array(p, 10, sizeof(struct nocache_entry));
       ps->domain = NULL;
  +    ps->viaopt = via_off; /* initially backward compatible with 1.3.1 */
       ps->req = 0;
   
       ps->cache.root = NULL;
  @@ -780,6 +781,28 @@
       return NULL;    
   }
   
  +static const char*
  +    set_via_opt(cmd_parms *parms, void *dummy, char *arg)
  +{
  +    proxy_server_conf *psf =
  +    ap_get_module_config(parms->server->module_config, &proxy_module);
  +
  +    if (strcasecmp(arg, "Off") == 0)
  +        psf->viaopt = via_off;
  +    else if (strcasecmp(arg, "On") == 0)
  +        psf->viaopt = via_on;
  +    else if (strcasecmp(arg, "Block") == 0)
  +        psf->viaopt = via_block;
  +    else if (strcasecmp(arg, "Full") == 0)
  +        psf->viaopt = via_full;
  +    else {
  +	return "ProxyVia must be one of: "
  +               "off | on | full | block";
  +    }
  +
  +    return NULL;    
  +}
  +
   static const handler_rec proxy_handlers[] =
   {
       {"proxy-server", proxy_handler},
  @@ -824,6 +847,8 @@
        "A list of names, hosts or domains for which caching is *not* provided"},
       {"CacheForceCompletion", set_cache_completion, NULL, RSRC_CONF, TAKE1,
        "Force a http cache completion after this percentage is loaded"},
  +    {"ProxyVia", set_via_opt, NULL, RSRC_CONF, TAKE1,
  +     "Configure Via: proxy header header to one of: on | off | block | full"},
       {NULL}
   };
   
  
  
  
  1.39      +6 -0      apache-1.3/src/modules/proxy/mod_proxy.h
  
  Index: mod_proxy.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/mod_proxy.h,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -u -r1.38 -r1.39
  --- mod_proxy.h	1998/08/16 20:21:27	1.38
  +++ mod_proxy.h	1998/08/16 20:51:55	1.39
  @@ -212,6 +212,12 @@
       array_header *nocaches;
       char *domain;		/* domain name to use in absence of a domain name in the request */
       int req;			/* true if proxy requests are enabled */
  +    enum {
  +      via_off,
  +      via_on,
  +      via_block,
  +      via_full
  +    } viaopt;                   /* how to deal with proxy Via: headers */
       size_t recv_buffer_size;
   } proxy_server_conf;
   
  
  
  
  1.58      +61 -5     apache-1.3/src/modules/proxy/proxy_http.c
  
  Index: proxy_http.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/proxy_http.c,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -u -r1.57 -r1.58
  --- proxy_http.c	1998/08/16 20:21:28	1.57
  +++ proxy_http.c	1998/08/16 20:51:56	1.58
  @@ -180,6 +180,7 @@
       struct hostent server_hp;
       BUFF *f;
       char buffer[HUGE_STRING_LEN];
  +    char portstr[32];
       pool *p = r->pool;
       const long int zero = 0L;
       int destport = 0;
  @@ -303,18 +304,47 @@
       ap_hard_timeout("proxy send", r);
       ap_bvputs(f, r->method, " ", proxyhost ? url : urlptr, " HTTP/1.0" CRLF,
   	   NULL);
  -    ap_bvputs(f, "Host: ", desthost, NULL);
       if (destportstr != NULL && destport != DEFAULT_HTTP_PORT)
  -	ap_bvputs(f, ":", destportstr, CRLF, NULL);
  +	ap_bvputs(f, "Host: ", desthost, ":", destportstr, CRLF, NULL);
       else
  -	ap_bputs(CRLF, f);
  +	ap_bvputs(f, "Host: ", desthost, CRLF, NULL);
   
  +    if (conf->viaopt == via_block) {
  +	/* Block all outgoing Via: headers */
  +	ap_table_unset(r->headers_in, "Via");
  +    } else if (conf->viaopt != via_off) {
  +	/* Create a "Via:" request header entry and merge it */
  +	i = ap_get_server_port(r);
  +	if (ap_is_default_port(i,r)) {
  +	    strcpy(portstr,"");
  +	} else {
  +	    ap_snprintf(portstr, sizeof portstr, ":%d", i);
  +	}
  +	/* Generate outgoing Via: header with/without server comment: */
  +	ap_table_mergen(r->headers_in, "Via",
  +		    (conf->viaopt == via_full)
  +			? ap_psprintf(p, "%d.%d %s%s (%s)",
  +				HTTP_VERSION_MAJOR(r->proto_num),
  +				HTTP_VERSION_MINOR(r->proto_num),
  +				ap_get_server_name(r), portstr,
  +				SERVER_BASEVERSION)
  +			: ap_psprintf(p, "%d.%d %s%s",
  +				HTTP_VERSION_MAJOR(r->proto_num),
  +				HTTP_VERSION_MINOR(r->proto_num),
  +				ap_get_server_name(r), portstr)
  +			);
  +    }
  +
       reqhdrs_arr = ap_table_elts(r->headers_in);
       reqhdrs = (table_entry *) reqhdrs_arr->elts;
       for (i = 0; i < reqhdrs_arr->nelts; i++) {
   	if (reqhdrs[i].key == NULL || reqhdrs[i].val == NULL
   	/* Clear out headers not to send */
   	    || !strcasecmp(reqhdrs[i].key, "Host")	/* Already sent */
  +	    /* XXX: @@@ FIXME: "Proxy-Authorization" should *only* be 
  +	     * suppressed if THIS server requested the authentication,
  +	     * not when a frontend proxy requested it!
  +	     */
   	    || !strcasecmp(reqhdrs[i].key, "Proxy-Authorization"))
   	    continue;
   	ap_bvputs(f, reqhdrs[i].key, ": ", reqhdrs[i].val, CRLF, NULL);
  @@ -341,7 +371,13 @@
   
   /* Is it an HTTP/1 response?  This is buggy if we ever see an HTTP/1.10 */
       if (ap_checkmask(buffer, "HTTP/#.# ###*")) {
  -/* If not an HTTP/1 messsage or if the status line was > 8192 bytes */
  +	int major, minor;
  +	if (2 != sscanf(buffer, "HTTP/%u.%u", &major, &minor)) {
  +	    major = 1;
  +	    minor = 0;
  +	}
  +
  +/* If not an HTTP/1 message or if the status line was > 8192 bytes */
   	if (buffer[5] != '1' || buffer[len - 1] != '\n') {
   	    ap_bclose(f);
   	    ap_kill_timeout(r);
  @@ -360,8 +396,28 @@
   /* Also, take care with headers with multiple occurences. */
   
   	resp_hdrs = ap_proxy_read_headers(p, buffer, HUGE_STRING_LEN, f);
  +
  +	if (conf->viaopt != via_off && conf->viaopt != via_block) {
  +	    /* Create a "Via:" response header entry and merge it */
  +	    i = ap_get_server_port(r);
  +	    if (ap_is_default_port(i,r)) {
  +		strcpy(portstr,"");
  +	    } else {
  +		ap_snprintf(portstr, sizeof portstr, ":%d", i);
  +	    }
  +	    ap_table_mergen((table *)resp_hdrs, "Via",
  +			    (conf->viaopt == via_full)
  +			    ? ap_psprintf(p, "%d.%d %s%s (%s)",
  +				major, minor,
  +				ap_get_server_name(r), portstr,
  +				SERVER_BASEVERSION)
  +			    : ap_psprintf(p, "%d.%d %s%s",
  +				major, minor,
  +				ap_get_server_name(r), portstr)
  +			    );
  +	}
   
  -	clear_connection(p, (table *) resp_hdrs);	/* Strip Connection hdrs */
  +	clear_connection(p, resp_hdrs);	/* Strip Connection hdrs */
       }
       else {
   /* an http/0.9 response */
  
  
  

Mime
View raw message