httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeff Trawick <traw...@attglobal.net>
Subject Re: mod_proxy and AAAA queries
Date Sun, 02 Mar 2003 13:49:25 GMT
Chris Monson wrote:

(patch)

A couple of comments:

For the representation of the config directive

+ #define IP_LOOKUP_DEFAULT       0
+ #define IP_LOOKUP_ALL           1
+ #define IP_LOOKUP_IPV4OKAY      2
+ #define IP_LOOKUP_IPV6OKAY      3
+     unsigned int ip_lookups : 4;
+

Why not just store whatever flags should be passed in to 
apr_sockaddr_info_get() (or rather, whatever flags should be OR-ed with 
anything else the module needs to specify)?  As I think you mentioned 
before, new bit values would be needed if we added IPv6Only or IPv4Only 
in the future.  (Not a big deal, but I just don't see the benefit to 
using bit field here.  Any other opinions from the peanut gallery?)

---/---

In the code below, we already have an IPv4 address and we're getting 
apr_sockaddr_info_get() to build a representation of it.  I don't think 
the IP lookup flags should be specified here.

                   /* make the connection */
!                 apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, 
"%d.%d.%d.%d", h3, h2, h1, h0), connect_addr->family, pasvport, 0, p);
                   rv = apr_connect(data_sock, pasv_addr);
                   if (rv != APR_SUCCESS) {
                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,



Chris Monson wrote:

> Cliff Woolley wrote:
>
> > On Sat, 1 Mar 2003, Chris Monson wrote:
> >
> >
> >
> >> Done.  Where shall I submit the patch?  Is it kosher to send it to this
> >> list?
> >>
> >
> >
> > Absolutely.
> >
> > (Well, sometimes if the patch is really really big, we have people
> > post it
> > to a webpage somewhere and just mail the URL to the list, but most 
> of the
> > time just go ahead and mail the patch to the list.  You can either paste
> > it inline or attach it, though if you attach it try to use mime type
> > "text/plain".)
> >
> Patch is included as an attachment.
>
> C
>
>
> ------------------------------------------------------------------------
>
> *** server/core.c	2003-03-01 08:12:10.000000000 -0700
> --- server/new/core.c	2003-03-01 09:56:08.000000000 -0700
> ***************
> *** 144,149 ****
> --- 144,150 ----
>       conf->use_canonical_name = USE_CANONICAL_NAME_UNSET;
>
>       conf->hostname_lookups = HOSTNAME_LOOKUP_UNSET;
> +     conf->ip_lookups = IP_LOOKUP_DEFAULT;
>       conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate 
> default */
>       conf->satisfy = SATISFY_NOSPEC;
>
> ***************
> *** 620,625 ****
> --- 621,653 ----
>    * here...
>    */
>
> + AP_DECLARE(apr_int32_t) ap_get_iplookup_flags(request_rec *r)
> + {
> +     apr_int32_t flags;
> +
> +     core_dir_config *conf;
> +     conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
> +                                                    &core_module);
> +
> +     switch (conf->ip_lookups) {
> +         default:
> +             /* falls through */
> +         case IP_LOOKUP_DEFAULT:
> +             /* falls through */
> +         case IP_LOOKUP_ALL:
> +             flags = 0;
> +             break;
> +         case IP_LOOKUP_IPV4OKAY:
> +             flags = APR_IPV4_ADDR_OK;
> +             break;
> +         case IP_LOOKUP_IPV6OKAY:
> +             flags = APR_IPV6_ADDR_OK;
> +             break;
> +     }
> +
> +     return flags;
> + }
> +
>   AP_DECLARE(int) ap_allow_options(request_rec *r)
>   {
>       core_dir_config *conf =
> ***************
> *** 2113,2118 ****
> --- 2141,2172 ----
>       return NULL;
>   }
>
> + static const char *set_ip_lookups(cmd_parms *cmd, void *d_,
> +                                   const char *arg)
> + {
> +     core_dir_config *d = d_;
> +     const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
> +
> +     if (err != NULL) {
> +         return err;
> +     }
> +
> +     if (!strcasecmp(arg, "all")) {
> +         d->ip_lookups = IP_LOOKUP_ALL;
> +     }
> +     else if (!strcasecmp(arg, "ipv4okay")) {
> +         d->ip_lookups = IP_LOOKUP_IPV4OKAY;
> +     }
> +     else if (!strcasecmp(arg, "ipv6okay")) {
> +         d->ip_lookups = IP_LOOKUP_IPV6OKAY;
> +     }
> +     else {
> +         return "parameter must be 'all', 'ipv4okay', or 'ipv6okay'";
> +     }
> +
> +     return NULL;
> + }
> +
>   static const char *set_serverpath(cmd_parms *cmd, void *dummy,
>                                     const char *arg)
>   {
> ***************
> *** 2982,2987 ****
> --- 3036,3043 ----
>     ACCESS_CONF|RSRC_CONF,
>     "\"on\" to enable, \"off\" to disable reverse DNS lookups, or 
> \"double\" to "
>     "enable double-reverse DNS lookups"),
> + AP_INIT_TAKE1("IPLookups", set_ip_lookups, NULL, ACCESS_CONF | 
> RSRC_CONF,
> +   "Set the IP lookup order (All|IPv4Okay|IPv6Okay)"),
>   AP_INIT_TAKE1("ServerAdmin", set_server_string_slot,
>     (void *)APR_OFFSETOF(server_rec, server_admin), RSRC_CONF,
>     "The email address of the server administrator"),
> *** include/http_core.h	2003-03-01 08:53:31.000000000 -0700
> --- include/new/http_core.h	2003-03-01 09:54:56.000000000 -0700
> ***************
> *** 135,140 ****
> --- 135,148 ----
>   #define AP_MIN_BYTES_TO_WRITE  8000
>
>   /**
> +  * Retrieve the value of IPLookups as flags for apr_sockaddr_info_get
> +  * @param r The current request
> +  * @return the flags bitmask for apr_sockaddr_info_get
> +  * @deffunc apr_int32_t ap_get_iplookup_flags(request_rec *r)
> +  */
> + AP_DECLARE(apr_int32_t) ap_get_iplookup_flags(request_rec *r);
> +
> + /**
>    * Retrieve the value of Options for this request
>    * @param r The current request
>    * @return the Options bitmask
> ***************
> *** 464,469 ****
> --- 472,483 ----
>   #define HOSTNAME_LOOKUP_UNSET	3
>       unsigned int hostname_lookups : 4;
>
> + #define IP_LOOKUP_DEFAULT       0
> + #define IP_LOOKUP_ALL           1
> + #define IP_LOOKUP_IPV4OKAY      2
> + #define IP_LOOKUP_IPV6OKAY      3
> +     unsigned int ip_lookups : 4;
> +
>       signed int do_rfc1413 : 2;   /* See if client is advertising a 
> username? */
>
>       signed int content_md5 : 2;  /* calculate Content-MD5? */
> *** modules/proxy/proxy_http.c	2003-03-01 09:54:27.000000000 -0700
> --- modules/proxy/new/proxy_http.c	2003-03-01 09:53:24.000000000 -0700
> ***************
> *** 204,209 ****
> --- 204,210 ----
>       int server_port;
>       apr_status_t err;
>       apr_sockaddr_t *uri_addr;
> +     apr_int32_t lookup_flags;
>       /*
>        * Break up the URL to determine the host to connect to
>        */
> ***************
> *** 222,231 ****
>                    "proxy: HTTP connecting %s to %s:%d", *url, 
> uri->hostname,
>                    uri->port);
>
>       /* do a DNS lookup for the destination host */
>       /* see memory note above */
>       err = apr_sockaddr_info_get(&uri_addr, apr_pstrdup(c->pool, 
> uri->hostname),
> !                                 APR_UNSPEC, uri->port, 0, c->pool);
>
>       /* allocate these out of the connection pool - the check on
>        * r->connection->id makes sure that this string does not get 
> accessed
> --- 223,234 ----
>                    "proxy: HTTP connecting %s to %s:%d", *url, 
> uri->hostname,
>                    uri->port);
>
> +     lookup_flags = ap_get_iplookup_flags(r);
> +
>       /* do a DNS lookup for the destination host */
>       /* see memory note above */
>       err = apr_sockaddr_info_get(&uri_addr, apr_pstrdup(c->pool, 
> uri->hostname),
> !                                 APR_UNSPEC, uri->port, lookup_flags, 
> c->pool);
>
>       /* allocate these out of the connection pool - the check on
>        * r->connection->id makes sure that this string does not get 
> accessed
> ***************
> *** 236,242 ****
>           p_conn->port = proxyport;
>           /* see memory note above */
>           err = apr_sockaddr_info_get(&p_conn->addr, p_conn->name, 
> APR_UNSPEC,
> !                                     p_conn->port, 0, c->pool);
>       } else {
>           p_conn->name = apr_pstrdup(c->pool, uri->hostname);
>           p_conn->port = uri->port;
> --- 239,245 ----
>           p_conn->port = proxyport;
>           /* see memory note above */
>           err = apr_sockaddr_info_get(&p_conn->addr, p_conn->name, 
> APR_UNSPEC,
> !                                     p_conn->port, lookup_flags, 
> c->pool);
>       } else {
>           p_conn->name = apr_pstrdup(c->pool, uri->hostname);
>           p_conn->port = uri->port;
> *** modules/proxy/proxy_ftp.c	2003-03-01 09:54:27.000000000 -0700
> --- modules/proxy/new/proxy_ftp.c	2003-03-01 09:53:24.000000000 -0700
> ***************
> *** 801,806 ****
> --- 801,807 ----
>   #if defined(USE_MDTM) && (defined(HAVE_TIMEGM) || defined(HAVE_GMTOFF))
>       apr_time_t mtime = 0L;
>   #endif
> +     apr_int32_t lookup_flags;
>
>       /* stuff for PASV mode */
>       int connect = 0, use_port = 0;
> ***************
> *** 820,825 ****
> --- 821,829 ----
>       ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
>                    "proxy: FTP: serving URL %s", url);
>
> +     /* Get the appropriate DNS lookup flags */
> +     lookup_flags = ap_get_iplookup_flags(r);
> +
>       /* create space for state information */
>       backend = (proxy_conn_rec *) 
> ap_get_module_config(c->conn_config, &proxy_ftp_module);
>       if (!backend) {
> ***************
> *** 914,920 ****
>          "proxy: FTP: connecting %s to %s:%d", url, connectname, 
> connectport);
>
>       /* do a DNS lookup for the destination host */
> !     err = apr_sockaddr_info_get(&connect_addr, connectname, 
> APR_UNSPEC, connectport, 0, p);
>
>       /* check if ProxyBlock directive on this host */
>       if (OK != ap_proxy_checkproxyblock(r, conf, connect_addr)) {
> --- 918,924 ----
>          "proxy: FTP: connecting %s to %s:%d", url, connectname, 
> connectport);
>
>       /* do a DNS lookup for the destination host */
> !     err = apr_sockaddr_info_get(&connect_addr, connectname, 
> APR_UNSPEC, connectport, lookup_flags, p);
>
>       /* check if ProxyBlock directive on this host */
>       if (OK != ap_proxy_checkproxyblock(r, conf, connect_addr)) {
> ***************
> *** 1288,1294 ****
>                   /* make the connection */
>                   apr_socket_addr_get(&data_addr, APR_REMOTE, sock);
>                   apr_sockaddr_ip_get(&data_ip, data_addr);
> !                 apr_sockaddr_info_get(&epsv_addr, data_ip, 
> connect_addr->family, data_port, 0, p);
>                   rv = apr_connect(data_sock, epsv_addr);
>                   if (rv != APR_SUCCESS) {
>                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
> --- 1292,1298 ----
>                   /* make the connection */
>                   apr_socket_addr_get(&data_addr, APR_REMOTE, sock);
>                   apr_sockaddr_ip_get(&data_ip, data_addr);
> !                 apr_sockaddr_info_get(&epsv_addr, data_ip, 
> connect_addr->family, data_port, lookup_flags, p);
>                   rv = apr_connect(data_sock, epsv_addr);
>                   if (rv != APR_SUCCESS) {
>                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
> ***************
> *** 1373,1379 ****
>   #endif
>
>                   /* make the connection */
> !                 apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, 
> "%d.%d.%d.%d", h3, h2, h1, h0), connect_addr->family, pasvport, 0, p);
>                   rv = apr_connect(data_sock, pasv_addr);
>                   if (rv != APR_SUCCESS) {
>                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
> --- 1377,1383 ----
>   #endif
>
>                   /* make the connection */
> !                 apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, 
> "%d.%d.%d.%d", h3, h2, h1, h0), connect_addr->family, pasvport, 
> lookup_flags, p);
>                   rv = apr_connect(data_sock, pasv_addr);
>                   if (rv != APR_SUCCESS) {
>                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
> ***************
> *** 1418,1424 ****
>   #endif                          /* _OSD_POSIX */
>           }
>
> !         apr_sockaddr_info_get(&local_addr, local_ip, APR_UNSPEC, 
> local_port, 0, r->pool);
>
>           if ((rv = apr_bind(local_sock, local_addr)) != APR_SUCCESS) {
>               ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
> --- 1422,1428 ----
>   #endif                          /* _OSD_POSIX */
>           }
>
> !         apr_sockaddr_info_get(&local_addr, local_ip, APR_UNSPEC, 
> local_port, lookup_flags, r->pool);
>
>           if ((rv = apr_bind(local_sock, local_addr)) != APR_SUCCESS) {
>               ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
> *** modules/proxy/proxy_connect.c	2003-03-01 09:54:27.000000000 -0700
> --- modules/proxy/new/proxy_connect.c	2003-03-01 09:53:24.000000000 -0700
> ***************
> *** 135,140 ****
> --- 135,141 ----
>       apr_int32_t pollcnt;
>       apr_int16_t pollevent;
>       apr_sockaddr_t *uri_addr, *connect_addr;
> +     apr_int32_t lookup_flags;
>
>       apr_uri_t uri;
>       const char *connectname;
> ***************
> *** 165,178 ****
>       ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
>   		 "proxy: CONNECT: connecting %s to %s:%d", url, uri.hostname, 
> uri.port);
>
>       /* do a DNS lookup for the destination host */
> !     err = apr_sockaddr_info_get(&uri_addr, uri.hostname, APR_UNSPEC, 
> uri.port, 0, p);
>
>       /* are we connecting directly, or via a proxy? */
>       if (proxyname) {
>   	connectname = proxyname;
>   	connectport = proxyport;
> !         err = apr_sockaddr_info_get(&connect_addr, proxyname, 
> APR_UNSPEC, proxyport, 0, p);
>       }
>       else {
>   	connectname = uri.hostname;
> --- 166,181 ----
>       ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
>   		 "proxy: CONNECT: connecting %s to %s:%d", url, uri.hostname, 
> uri.port);
>
> +     lookup_flags = ap_get_iplookup_flags(r);
> +
>       /* do a DNS lookup for the destination host */
> !     err = apr_sockaddr_info_get(&uri_addr, uri.hostname, APR_UNSPEC, 
> uri.port, lookup_flags, p);
>
>       /* are we connecting directly, or via a proxy? */
>       if (proxyname) {
>   	connectname = proxyname;
>   	connectport = proxyport;
> !         err = apr_sockaddr_info_get(&connect_addr, proxyname, 
> APR_UNSPEC, proxyport, lookup_flags, p);
>       }
>       else {
>   	connectname = uri.hostname;



Mime
View raw message