You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ma...@hyperreal.org on 1998/04/01 16:41:46 UTC

cvs commit: apache-1.3/src/modules/proxy mod_proxy.c

martin      98/04/01 06:41:45

  Modified:    src/include  util_uri.h
               src/main  http_protocol.c util_uri.c
               src/modules/proxy  mod_proxy.c
  Log:
  After recent changes, the proxying of "CONNECT host:port HTTP/1.0" requests
  (as are issued by current browsers for https://host/ URLs) ceased to work.
  Now the request method is parsed early and used to decide which of two
  URI parsing routines should be used (either the full scheme://user:port@host...
  format, or the fixed host:port format for CONNECTs).
  
  Yet to fix: the request method is currently determined twice. "Probably" the
  later check is redundant (but I'm not sure because of the difficult logic
  with internal subrequests etc.)
  
  Revision  Changes    Path
  1.6       +1 -0      apache-1.3/src/include/util_uri.h
  
  Index: util_uri.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/util_uri.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -u -r1.5 -r1.6
  --- util_uri.h	1998/03/31 12:52:33	1.5
  +++ util_uri.h	1998/04/01 14:41:32	1.6
  @@ -112,6 +112,7 @@
   API_EXPORT(char *) unparse_uri_components(pool *p, const uri_components *uptr,
       unsigned flags);
   API_EXPORT(int) parse_uri_components(pool *p, const char *uri, uri_components *uptr);
  +API_EXPORT(int) parse_hostinfo_components(pool *p, const char *hostinfo, uri_components *uptr);
   /* called by the core in main() */
   extern void util_uri_init(void);
   
  
  
  
  1.206     +31 -2     apache-1.3/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/http_protocol.c,v
  retrieving revision 1.205
  retrieving revision 1.206
  diff -u -u -r1.205 -r1.206
  --- http_protocol.c	1998/03/31 12:52:45	1.205
  +++ http_protocol.c	1998/04/01 14:41:34	1.206
  @@ -581,14 +581,20 @@
   
       r->unparsed_uri = pstrdup(r->pool, uri);
   
  -    /* Simple syntax Errors in URLs are trapped by parse_uri_components(). */
  -    status = parse_uri_components(r->pool, uri, &r->parsed_uri);
  +    if (r->method_number == M_CONNECT) {
  +	status = parse_hostinfo_components(r->pool, uri, &r->parsed_uri);
  +    } else {
  +	/* Simple syntax Errors in URLs are trapped by parse_uri_components(). */
  +	status = parse_uri_components(r->pool, uri, &r->parsed_uri);
  +    }
   
       if (is_HTTP_SUCCESS(status)) {
   	/* if it has a scheme we may need to do absoluteURI vhost stuff */
   	if (r->parsed_uri.scheme
   	    && !strcasecmp(r->parsed_uri.scheme, http_method(r))) {
   	    r->hostname = r->parsed_uri.hostname;
  +	} else if (r->method_number == M_CONNECT) {
  +	    r->hostname = r->parsed_uri.hostname;
   	}
   	r->args = r->parsed_uri.query;
   	r->uri = r->parsed_uri.path ? r->parsed_uri.path
  @@ -664,6 +670,29 @@
       r->the_request = pstrdup(r->pool, l);
       r->method = getword_white(r->pool, &ll);
       uri = getword_white(r->pool, &ll);
  +
  +    /* Provide quick information about the request method as soon as known */
  +    if (!strcmp(r->method, "HEAD")) {
  +        r->header_only = 1;
  +        r->method_number = M_GET;
  +    }
  +    else if (!strcmp(r->method, "GET"))
  +        r->method_number = M_GET;
  +    else if (!strcmp(r->method, "POST"))
  +        r->method_number = M_POST;
  +    else if (!strcmp(r->method, "PUT"))
  +        r->method_number = M_PUT;
  +    else if (!strcmp(r->method, "DELETE"))
  +        r->method_number = M_DELETE;
  +    else if (!strcmp(r->method, "CONNECT"))
  +        r->method_number = M_CONNECT;
  +    else if (!strcmp(r->method, "OPTIONS"))
  +        r->method_number = M_OPTIONS;
  +    else if (!strcmp(r->method, "TRACE"))
  +        r->method_number = M_TRACE;
  +    else
  +        r->method_number = M_INVALID;   /* Will eventually croak. */
  +
       parse_uri(r, uri);
   
       r->assbackwards = (ll[0] == '\0');
  
  
  
  1.18      +37 -0     apache-1.3/src/main/util_uri.c
  
  Index: util_uri.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/util_uri.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -u -r1.17 -r1.18
  --- util_uri.c	1998/03/31 12:52:51	1.17
  +++ util_uri.c	1998/04/01 14:41:36	1.18
  @@ -543,4 +543,41 @@
       hostinfo = s + 1;
       goto deal_with_host;
   }
  +
  +/* Special case for CONNECT parsing: it comes with the hostinfo part only */
  +/* See the INTERNET-DRAFT document "Tunneling SSL Through a WWW Proxy"
  + * currently at http://www.mcom.com/newsref/std/tunneling_ssl.html
  + * for the format of the "CONNECT host:port HTTP/1.0" request
  + */
  +API_EXPORT(int) parse_hostinfo_components(pool *p, const char *hostinfo, uri_components *uptr)
  +{
  +    const char *s;
  +    char *endstr;
  +
  +    /* Initialize the structure. parse_uri() and parse_uri_components()
  +     * can be called more than once per request.
  +     */
  +    memset (uptr, '\0', sizeof(*uptr));
  +    uptr->is_initialized = 1;
  +    uptr->hostinfo = pstrdup(p, hostinfo);
  +
  +    /* We expect hostinfo to point to the first character of
  +     * the hostname.  There must be a port, separated by a colon
  +     */
  +    s = strchr(hostinfo, ':');
  +    if (s == NULL) {
  +	return HTTP_BAD_REQUEST;
  +    }
  +    uptr->hostname = pstrndup(p, hostinfo, s - hostinfo);
  +    ++s;
  +    uptr->port_str = pstrdup(p, s);
  +    if (*s != '\0') {
  +	uptr->port = strtol(uptr->port_str, &endstr, 10);
  +	if (*endstr == '\0') {
  +	    return HTTP_OK;
  +	}
  +	/* Invalid characters after ':' found */
  +    }
  +    return HTTP_BAD_REQUEST;
  +}
   #endif
  
  
  
  1.50      +9 -0      apache-1.3/src/modules/proxy/mod_proxy.c
  
  Index: mod_proxy.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/proxy/mod_proxy.c,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -u -r1.49 -r1.50
  --- mod_proxy.c	1998/03/31 12:52:59	1.49
  +++ mod_proxy.c	1998/04/01 14:41:43	1.50
  @@ -155,6 +155,15 @@
   	    r->handler = "proxy-server";
           }
       }
  +    /* We need special treatment for CONNECT proxying: it has no scheme part */
  +    else if (conf->req && r->method_number == M_CONNECT
  +	     && r->parsed_uri.hostname
  +	     && r->parsed_uri.port_str) {
  +	    r->proxyreq = 1;
  +	    r->uri = r->unparsed_uri;
  +	    r->filename = pstrcat(r->pool, "proxy:", r->uri, NULL);
  +	    r->handler = "proxy-server";
  +    }
       return DECLINED;
   }