chuck 97/04/10 22:10:55
Modified: src/modules/proxy mod_proxy.c mod_proxy.h proxy_connect.c proxy_ftp.c proxy_http.c proxy_util.c Log: For hosts with multiple IP addresses, try all additional addresses if necessary to get a connect(). Fail only if hostent address list is exhausted. Revision Changes Path 1.10 +10 -4 apache/src/modules/proxy/mod_proxy.c Index: mod_proxy.c =================================================================== RCS file: /export/home/cvs/apache/src/modules/proxy/mod_proxy.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C3 -r1.9 -r1.10 *** mod_proxy.c 1997/03/02 05:05:21 1.9 --- mod_proxy.c 1997/04/11 05:10:49 1.10 *************** *** 335,340 **** --- 335,341 ---- get_module_config (s->module_config, &proxy_module); struct noproxy_entry *new; struct noproxy_entry *list=(struct noproxy_entry*)conf->noproxies->elts; + struct hostent hp; int found = 0; int i; *************** *** 350,357 **** new = push_array (conf->noproxies); new->name = arg; /* Don't do name lookups on things that aren't dotted */ ! if (strchr(arg, '.') != NULL) ! proxy_host2addr(new->name, &new->addr); else new->addr.s_addr = 0; } --- 351,360 ---- new = push_array (conf->noproxies); new->name = arg; /* Don't do name lookups on things that aren't dotted */ ! if (strchr(arg, '.') != NULL) { ! proxy_host2addr(new->name, &hp); ! memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr)); ! } else new->addr.s_addr = 0; } *************** *** 473,478 **** --- 476,482 ---- get_module_config (s->module_config, &proxy_module); struct nocache_entry *new; struct nocache_entry *list=(struct nocache_entry*)conf->nocaches->elts; + struct hostent hp; int found = 0; int i; *************** *** 488,495 **** new = push_array (conf->nocaches); new->name = arg; /* Don't do name lookups on things that aren't dotted */ ! if (strchr(arg, '.') != NULL) ! proxy_host2addr(new->name, &new->addr); else new->addr.s_addr= 0; } --- 492,501 ---- new = push_array (conf->nocaches); new->name = arg; /* Don't do name lookups on things that aren't dotted */ ! if (strchr(arg, '.') != NULL) { ! proxy_host2addr(new->name, &hp); ! memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr)); ! } else new->addr.s_addr= 0; } 1.10 +1 -1 apache/src/modules/proxy/mod_proxy.h Index: mod_proxy.h =================================================================== RCS file: /export/home/cvs/apache/src/modules/proxy/mod_proxy.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C3 -r1.9 -r1.10 *** mod_proxy.h 1997/03/20 18:40:14 1.9 --- mod_proxy.h 1997/04/11 05:10:50 1.10 *************** *** 270,275 **** server_rec *s); BUFF *proxy_cache_error(struct cache_req *r); int proxyerror(request_rec *r, const char *message); ! const char *proxy_host2addr(const char *host, struct in_addr *addr); int proxy_doconnect(int sock, struct sockaddr_in *addr, request_rec *r); --- 270,275 ---- server_rec *s); BUFF *proxy_cache_error(struct cache_req *r); int proxyerror(request_rec *r, const char *message); ! const char *proxy_host2addr(const char *host, struct hostent *reqhp); int proxy_doconnect(int sock, struct sockaddr_in *addr, request_rec *r); 1.7 +12 -3 apache/src/modules/proxy/proxy_connect.c Index: proxy_connect.c =================================================================== RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_connect.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C3 -r1.6 -r1.7 *** proxy_connect.c 1997/01/07 21:51:57 1.6 --- proxy_connect.c 1997/04/11 05:10:50 1.7 *************** *** 88,98 **** { struct sockaddr_in server; struct in_addr destaddr; const char *host, *err; char *p; int port, sock; char buffer[HUGE_STRING_LEN]; ! int nbytes, i; fd_set fds; void *sconf = r->server->module_config; --- 88,99 ---- { struct sockaddr_in server; struct in_addr destaddr; + struct hostent server_hp; const char *host, *err; char *p; int port, sock; char buffer[HUGE_STRING_LEN]; ! int nbytes, i, j; fd_set fds; void *sconf = r->server->module_config; *************** *** 136,142 **** Explain2("CONNECT to %s on port %d", host, port); server.sin_port = htons(port); ! err = proxy_host2addr(host, &server.sin_addr); if (err != NULL) return proxyerror(r, err); /* give up */ --- 137,143 ---- Explain2("CONNECT to %s on port %d", host, port); server.sin_port = htons(port); ! err = proxy_host2addr(host, &server_hp); if (err != NULL) return proxyerror(r, err); /* give up */ *************** *** 148,154 **** } note_cleanups_for_fd(r->pool, sock); ! i = proxy_doconnect(sock, &server, r); if (i == -1 ) return proxyerror(r, "Could not connect to remote machine"); --- 149,163 ---- } note_cleanups_for_fd(r->pool, sock); ! j = 0; ! while (server_hp.h_addr_list[j] != NULL) { ! memcpy(&server.sin_addr, server_hp.h_addr_list[j], ! sizeof(struct in_addr)); ! i = proxy_doconnect(sock, &server, r); ! if (i == 0) ! break; ! j++; ! } if (i == -1 ) return proxyerror(r, "Could not connect to remote machine"); 1.17 +14 -4 apache/src/modules/proxy/proxy_ftp.c Index: proxy_ftp.c =================================================================== RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_ftp.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C3 -r1.16 -r1.17 *** proxy_ftp.c 1997/04/11 05:01:53 1.16 --- proxy_ftp.c 1997/04/11 05:10:51 1.17 *************** *** 360,369 **** { char *host, *path, *p, *user, *password, *parms; const char *err; ! int port, userlen, i, len, sock, dsock, rc, nocache; int passlen = 0; int csd = 0; struct sockaddr_in server; struct hdr_entry *hdr; struct in_addr destaddr; array_header *resp_hdrs; --- 360,370 ---- { char *host, *path, *p, *user, *password, *parms; const char *err; ! int port, userlen, i, j, len, sock, dsock, rc, nocache; int passlen = 0; int csd = 0; struct sockaddr_in server; + struct hostent server_hp; struct hdr_entry *hdr; struct in_addr destaddr; array_header *resp_hdrs; *************** *** 454,460 **** memset(&server, 0, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_port = htons(port); ! err = proxy_host2addr(host, &server.sin_addr); if (err != NULL) return proxyerror(r, err); /* give up */ sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); --- 455,461 ---- memset(&server, 0, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_port = htons(port); ! err = proxy_host2addr(host, &server_hp); if (err != NULL) return proxyerror(r, err); /* give up */ sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); *************** *** 475,482 **** return SERVER_ERROR; } ! i = proxy_doconnect(sock, &server, r); ! if (i == -1) return proxyerror(r, "Could not connect to remote machine"); f = bcreate(pool, B_RDWR); bpushfd(f, sock, sock); --- 476,492 ---- return SERVER_ERROR; } ! j = 0; ! while (server_hp.h_addr_list[j] != NULL) { ! memcpy(&server.sin_addr, server_hp.h_addr_list[j], ! sizeof(struct in_addr)); ! i = proxy_doconnect(sock, &server, r); ! if (i == 0) ! break; ! j++; ! } ! if (i == -1) ! return proxyerror(r, "Could not connect to remote machine"); f = bcreate(pool, B_RDWR); bpushfd(f, sock, sock); 1.17 +14 -4 apache/src/modules/proxy/proxy_http.c Index: proxy_http.c =================================================================== RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_http.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C3 -r1.16 -r1.17 *** proxy_http.c 1997/04/06 07:43:49 1.16 --- proxy_http.c 1997/04/11 05:10:51 1.17 *************** *** 143,153 **** { char *p; const char *err, *desthost; ! int i, sock, len; array_header *reqhdrs_arr, *resp_hdrs; table_entry *reqhdrs; struct sockaddr_in server; struct in_addr destaddr; BUFF *f, *cache; struct hdr_entry *hdr; char buffer[HUGE_STRING_LEN], inprotocol[9], outprotocol[9]; --- 143,154 ---- { char *p; const char *err, *desthost; ! int i, j, sock, len; array_header *reqhdrs_arr, *resp_hdrs; table_entry *reqhdrs; struct sockaddr_in server; struct in_addr destaddr; + struct hostent server_hp; BUFF *f, *cache; struct hdr_entry *hdr; char buffer[HUGE_STRING_LEN], inprotocol[9], outprotocol[9]; *************** *** 208,219 **** { url = r->uri; /* restore original URL */ server.sin_port = htons(proxyport); ! err = proxy_host2addr(proxyhost, &server.sin_addr); if (err != NULL) return DECLINED; /* try another */ } else { server.sin_port = htons(destport); ! err = proxy_host2addr(desthost, &server.sin_addr); if (err != NULL) return proxyerror(r, err); /* give up */ } --- 209,220 ---- { url = r->uri; /* restore original URL */ server.sin_port = htons(proxyport); ! err = proxy_host2addr(proxyhost, &server_hp); if (err != NULL) return DECLINED; /* try another */ } else { server.sin_port = htons(destport); ! err = proxy_host2addr(desthost, &server_hp); if (err != NULL) return proxyerror(r, err); /* give up */ } *************** *** 225,231 **** } note_cleanups_for_fd(pool, sock); ! i = proxy_doconnect(sock, &server, r); if (i == -1) { if (proxyhost != NULL) return DECLINED; /* try again another way */ --- 226,241 ---- } note_cleanups_for_fd(pool, sock); ! ! j = 0; ! while (server_hp.h_addr_list[j] != NULL) { ! memcpy(&server.sin_addr, server_hp.h_addr_list[j], ! sizeof(struct in_addr)); ! i = proxy_doconnect(sock, &server, r); ! if (i == 0) ! break; ! j++; ! } if (i == -1) { if (proxyhost != NULL) return DECLINED; /* try again another way */ 1.12 +7 -5 apache/src/modules/proxy/proxy_util.c Index: proxy_util.c =================================================================== RCS file: /export/home/cvs/apache/src/modules/proxy/proxy_util.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C3 -r1.11 -r1.12 *** proxy_util.c 1997/04/09 06:51:07 1.11 --- proxy_util.c 1997/04/11 05:10:52 1.12 *************** *** 690,699 **** * This routine returns its own error message */ const char * ! proxy_host2addr(const char *host, struct in_addr *addr) { int i; ! unsigned long ipaddr; for (i=0; host[i] != '\0'; i++) if (!isdigit(host[i]) && host[i] != '.') --- 690,700 ---- * This routine returns its own error message */ const char * ! proxy_host2addr(const char *host, struct hostent *reqhp) { int i; ! struct in_addr ipaddr; ! char *addr_str; for (i=0; host[i] != '\0'; i++) if (!isdigit(host[i]) && host[i] != '.') *************** *** 705,716 **** hp = gethostbyname(host); if (hp == NULL) return "Host not found"; ! memcpy(addr, hp->h_addr, sizeof(struct in_addr)); } else { ! if ((ipaddr = inet_addr(host)) == -1) return "Bad IP address"; ! memcpy(addr, &ipaddr, sizeof(unsigned long)); } return NULL; } --- 706,718 ---- hp = gethostbyname(host); if (hp == NULL) return "Host not found"; ! memcpy(reqhp, hp, sizeof(struct hostent)); } else { ! if ((ipaddr.s_addr = inet_addr(host)) == -1) return "Bad IP address"; ! Explain1("Address is %s", addr_str); ! memcpy(reqhp->h_addr, &ipaddr, sizeof(struct in_addr)); } return NULL; }