1 /* Copyright 1999-2005 The Apache Software Foundation or its licensors, as
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * http_vhost.c: functions pertaining to virtual host addresses
19 * (configuration and run-time)
23 #include "apr_strings.h"
26 #define APR_WANT_STRFUNC
30 #include "ap_config.h"
32 #include "http_config.h"
34 #include "http_vhost.h"
35 #include "http_protocol.h"
36 #include "http_core.h"
38 #if APR_HAVE_ARPA_INET_H
39 #include <arpa/inet.h>
43 * After all the definitions there's an explanation of how it's all put
47 /* meta-list of name-vhosts. Each server_rec can be in possibly multiple
48 * lists of name-vhosts.
50 typedef struct name_chain name_chain;
53 server_addr_rec *sar; /* the record causing it to be in
54 * this chain (needed for port comparisons) */
55 server_rec *server; /* the server to use on a match */
58 /* meta-list of ip addresses. Each server_rec can be in possibly multiple
59 * hash chains since it can have multiple ips.
61 typedef struct ipaddr_chain ipaddr_chain;
64 server_addr_rec *sar; /* the record causing it to be in
65 * this chain (need for both ip addr and port
67 server_rec *server; /* the server to use if this matches */
68 name_chain *names; /* if non-NULL then a list of name-vhosts
69 * sharing this address */
72 /* This defines the size of the hash table used for hashing ip addresses
73 * of virtual hosts. It must be a power of two.
75 #ifndef IPHASH_TABLE_SIZE
76 #define IPHASH_TABLE_SIZE 256
79 /* A (n) bucket hash table, each entry has a pointer to a server rec and
80 * a pointer to the other entries in that bucket. Each individual address,
81 * even for virtualhosts with multiple addresses, has an entry in this hash
82 * table. There are extra buckets for _default_, and name-vhost entries.
84 * Note that after config time this is constant, so it is thread-safe.
86 static ipaddr_chain *iphash_table[IPHASH_TABLE_SIZE];
88 /* dump out statistics about the hash function */
89 /* #define IPHASH_STATISTICS */
91 /* list of the _default_ servers */
92 static ipaddr_chain *default_list;
94 /* list of the NameVirtualHost addresses */
95 static server_addr_rec *name_vhost_list;
96 static server_addr_rec **name_vhost_list_tail;
101 * The ip address determines which chain in iphash_table is interesting, then
102 * a comparison is done down that chain to find the first ipaddr_chain whose
103 * sar matches the address:port pair.
105 * If that ipaddr_chain has names == NULL then you're done, it's an ip-vhost.
107 * Otherwise it's a name-vhost list, and the default is the server in the
108 * ipaddr_chain record. We tuck away the ipaddr_chain record in the
109 * conn_rec field vhost_lookup_data. Later on after the headers we get a
110 * second chance, and we use the name_chain to figure out what name-vhost
111 * matches the headers.
113 * If there was no ip address match in the iphash_table then do a lookup
114 * in the default_list.
116 * How it's put together ... well you should be able to figure that out
117 * from how it's used. Or something like that.
121 /* called at the beginning of the config */
122 AP_DECLARE(void) ap_init_vhost_config(apr_pool_t *p)
124 memset(iphash_table, 0, sizeof(iphash_table));
126 name_vhost_list = NULL;
127 name_vhost_list_tail = &name_vhost_list;
132 * Parses a host of the form <address>[:port]
133 * paddr is used to create a list in the order of input
134 * **paddr is the ->next pointer of the last entry (or s->addrs)
135 * *paddr is the variable used to keep track of **paddr between calls
136 * port is the default port to assume
138 static const char *get_addresses(apr_pool_t *p, const char *w_,
139 server_addr_rec ***paddr,
140 apr_port_t default_port)
142 apr_sockaddr_t *my_addr;
143 server_addr_rec *sar;
144 char *w, *host, *scope_id;
153 w = apr_pstrdup(p, w_);
154 /* apr_parse_addr_port() doesn't understand ":*" so handle that first. */
155 wlen = strlen(w); /* wlen must be > 0 at this point */
157 if (w[wlen - 1] == '*') {
161 else if (w[wlen - 2] == ':') {
166 rv = apr_parse_addr_port(&host, &scope_id, &port, w, p);
167 /* If the string is "80", apr_parse_addr_port() will be happy and set
168 * host to NULL and port to 80, so watch out for that.
170 if (rv != APR_SUCCESS) {
171 return "The address or port is invalid";
174 return "Missing address for VirtualHost";
177 return "Scope ids are not supported";
179 if (!port && !wild_port) {
183 if (strcmp(host, "*") == 0) {
184 rv = apr_sockaddr_info_get(&my_addr, "0.0.0.0", APR_INET, port, 0, p);
185 ap_assert(rv == APR_SUCCESS); /* must be bug or out of storage */
187 else if (strcasecmp(host, "_default_") == 0
188 || strcmp(host, "255.255.255.255") == 0) {
189 rv = apr_sockaddr_info_get(&my_addr, "255.255.255.255", APR_INET, port, 0, p);
190 ap_assert(rv == APR_SUCCESS); /* must be bug or out of storage */
193 rv = apr_sockaddr_info_get(&my_addr, host, APR_UNSPEC, port, 0, p);
194 if (rv != APR_SUCCESS) {
195 ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
196 "Cannot resolve host name %s --- ignoring!", host);
201 /* Remember all addresses for the host */
204 sar = apr_pcalloc(p, sizeof(server_addr_rec));
207 sar->host_addr = my_addr;
208 sar->host_port = port;
209 sar->virthost = host;
210 my_addr = my_addr->next;
217 /* parse the <VirtualHost> addresses */
218 const char *ap_parse_vhost_addrs(apr_pool_t *p,
219 const char *hostname,
222 server_addr_rec **addrs;
225 /* start the list of addreses */
227 while (hostname[0]) {
228 err = get_addresses(p, ap_getword_conf(p, &hostname), &addrs, s->port);
234 /* terminate the list */
237 if (s->addrs->host_port) {
238 /* override the default port which is inherited from main_server */
239 s->port = s->addrs->host_port;
246 const char *ap_set_name_virtual_host(cmd_parms *cmd, void *dummy,
249 /* use whatever port the main server has at this point */
250 return get_addresses(cmd->pool, arg, &name_vhost_list_tail,
255 /* hash table statistics, keep this in here for the beta period so
256 * we can find out if the hash function is ok
258 #ifdef IPHASH_STATISTICS
259 static int iphash_compare(const void *a, const void *b)
261 return (*(const int *) b - *(const int *) a);
265 static void dump_iphash_statistics(server_rec *main_s)
267 unsigned count[IPHASH_TABLE_SIZE];
271 char buf[HUGE_STRING_LEN];
275 for (i = 0; i < IPHASH_TABLE_SIZE; ++i) {
277 for (src = iphash_table[i]; src; src = src->next) {
279 if (i < IPHASH_TABLE_SIZE) {
280 /* don't count the slop buckets in the total */
285 qsort(count, IPHASH_TABLE_SIZE, sizeof(count[0]), iphash_compare);
286 p = buf + apr_snprintf(buf, sizeof(buf),
287 "iphash: total hashed = %u, avg chain = %u, "
288 "chain lengths (count x len):",
289 total, total / IPHASH_TABLE_SIZE);
291 for (i = 1; i < IPHASH_TABLE_SIZE; ++i) {
292 if (count[i - 1] != count[i]) {
293 p += apr_snprintf(p, sizeof(buf) - (p - buf), " %ux%u",
294 total, count[i - 1]);
301 p += apr_snprintf(p, sizeof(buf) - (p - buf), " %ux%u",
302 total, count[IPHASH_TABLE_SIZE - 1]);
303 ap_log_error(APLOG_MARK, APLOG_DEBUG, main_s, buf);
308 /* This hashing function is designed to get good distribution in the cases
309 * where the server is handling entire "networks" of servers. i.e. a
310 * whack of /24s. This is probably the most common configuration for
311 * ISPs with large virtual servers.
313 * NOTE: This function is symmetric (i.e. collapses all 4 octets
314 * into one), so machine byte order (big/little endianness) does not matter.
316 * Hash function provided by David Hankins.
318 static APR_INLINE unsigned hash_inaddr(unsigned key)
321 return ((key >> 8) ^ key) % IPHASH_TABLE_SIZE;
324 static APR_INLINE unsigned hash_addr(struct apr_sockaddr_t *sa)
328 /* The key is the last four bytes of the IP address.
329 * For IPv4, this is the entire address, as always.
330 * For IPv6, this is usually part of the MAC address.
332 key = *(unsigned *)((char *)sa->ipaddr_ptr + sa->ipaddr_len - 4);
333 return hash_inaddr(key);
336 static ipaddr_chain *new_ipaddr_chain(apr_pool_t *p,
337 server_rec *s, server_addr_rec *sar)
341 new = apr_palloc(p, sizeof(*new));
350 static name_chain *new_name_chain(apr_pool_t *p,
351 server_rec *s, server_addr_rec *sar)
355 new = apr_palloc(p, sizeof(*new));
363 static APR_INLINE ipaddr_chain *find_ipaddr(apr_sockaddr_t *sa)
368 /* scan the hash table for an exact match first */
369 bucket = hash_addr(sa);
370 for (trav = iphash_table[bucket]; trav; trav = trav->next) {
371 server_addr_rec *sar = trav->sar;
372 apr_sockaddr_t *cur = sar->host_addr;
374 if (cur->port == 0 || sa->port == 0 || cur->port == sa->port) {
375 if (apr_sockaddr_equal(cur, sa)) {
383 static ipaddr_chain *find_default_server(apr_port_t port)
385 server_addr_rec *sar;
388 for (trav = default_list; trav; trav = trav->next) {
390 if (sar->host_port == 0 || sar->host_port == port) {
398 static void dump_a_vhost(apr_file_t *f, ipaddr_chain *ic)
402 char buf[MAX_STRING_LEN];
403 apr_sockaddr_t *ha = ic->sar->host_addr;
405 if (ha->family == APR_INET &&
406 ha->sa.sin.sin_addr.s_addr == DEFAULT_VHOST_ADDR) {
407 len = apr_snprintf(buf, sizeof(buf), "_default_:%u",
410 else if (ha->family == APR_INET &&
411 ha->sa.sin.sin_addr.s_addr == INADDR_ANY) {
412 len = apr_snprintf(buf, sizeof(buf), "*:%u",
416 len = apr_snprintf(buf, sizeof(buf), "%pI", ha);
418 if (ic->sar->host_port == 0) {
421 if (ic->names == NULL) {
422 apr_file_printf(f, "%-22s %s (%s:%u)\n", buf,
423 ic->server->server_hostname,
424 ic->server->defn_name, ic->server->defn_line_number);
427 apr_file_printf(f, "%-22s is a NameVirtualHost\n"
428 "%8s default server %s (%s:%u)\n",
429 buf, "", ic->server->server_hostname,
430 ic->server->defn_name, ic->server->defn_line_number);
431 for (nc = ic->names; nc; nc = nc->next) {
432 if (nc->sar->host_port) {
433 apr_file_printf(f, "%8s port %u ", "", nc->sar->host_port);
436 apr_file_printf(f, "%8s port * ", "");
438 apr_file_printf(f, "namevhost %s (%s:%u)\n",
439 nc->server->server_hostname,
440 nc->server->defn_name, nc->server->defn_line_number);
444 static void dump_vhost_config(apr_file_t *f)
449 apr_file_printf(f, "VirtualHost configuration:\n");
450 for (i = 0; i < IPHASH_TABLE_SIZE; ++i) {
451 for (ic = iphash_table[i]; ic; ic = ic->next) {
456 apr_file_printf(f, "wildcard NameVirtualHosts and _default_ servers:\n");
457 for (ic = default_list; ic; ic = ic->next) {
464 * Two helper functions for ap_fini_vhost_config()
466 static int add_name_vhost_config(apr_pool_t *p, server_rec *main_s,
467 server_rec *s, server_addr_rec *sar,
470 /* the first time we encounter a NameVirtualHost address
471 * ic->server will be NULL, on subsequent encounters
472 * ic->names will be non-NULL.
474 if (ic->names || ic->server == NULL) {
475 name_chain *nc = new_name_chain(p, s, sar);
476 nc->next = ic->names;
479 if (sar->host_port != ic->sar->host_port) {
480 /* one of the two is a * port, the other isn't */
481 ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_s,
482 "VirtualHost %s:%u -- mixing * "
483 "ports and non-* ports with "
484 "a NameVirtualHost address is not supported,"
485 " proceeding with undefined results",
486 sar->virthost, sar->host_port);
491 /* IP-based vhosts are handled by the caller */
496 static void remove_unused_name_vhosts(server_rec *main_s, ipaddr_chain **pic)
499 ipaddr_chain *ic = *pic;
501 if (ic->server == NULL) {
502 ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_s,
503 "NameVirtualHost %s:%u has no VirtualHosts",
504 ic->sar->virthost, ic->sar->host_port);
513 /* compile the tables and such we need to do the run-time vhost lookups */
514 AP_DECLARE(void) ap_fini_vhost_config(apr_pool_t *p, server_rec *main_s)
516 server_addr_rec *sar;
517 int has_default_vhost_addr;
520 ipaddr_chain **iphash_table_tail[IPHASH_TABLE_SIZE];
522 /* terminate the name_vhost list */
523 *name_vhost_list_tail = NULL;
525 /* Main host first */
528 if (!s->server_hostname) {
529 s->server_hostname = ap_get_local_host(p);
532 /* initialize the tails */
533 for (i = 0; i < IPHASH_TABLE_SIZE; ++i) {
534 iphash_table_tail[i] = &iphash_table[i];
537 /* The first things to go into the hash table are the NameVirtualHosts
538 * Since name_vhost_list is in the same order that the directives
539 * occured in the config file, we'll copy it in that order.
541 for (sar = name_vhost_list; sar; sar = sar->next) {
542 char inaddr_any[16] = {0}; /* big enough to handle IPv4 or IPv6 */
543 unsigned bucket = hash_addr(sar->host_addr);
544 ipaddr_chain *ic = new_ipaddr_chain(p, NULL, sar);
546 if (memcmp(sar->host_addr->ipaddr_ptr, inaddr_any,
547 sar->host_addr->ipaddr_len)) { /* not IN[6]ADDR_ANY */
548 *iphash_table_tail[bucket] = ic;
549 iphash_table_tail[bucket] = &ic->next;
552 /* A wildcard NameVirtualHost goes on the default_list so
553 * that it can catch incoming requests on any address.
555 ic->next = default_list;
558 /* Notice that what we've done is insert an ipaddr_chain with
559 * both server and names NULL. This fact is used to spot name-
560 * based vhosts in add_name_vhost_config().
564 /* The next things to go into the hash table are the virtual hosts
565 * themselves. They're listed off of main_s->next in the reverse
566 * order they occured in the config file, so we insert them at
567 * the iphash_table_tail but don't advance the tail.
570 for (s = main_s->next; s; s = s->next) {
571 has_default_vhost_addr = 0;
572 for (sar = s->addrs; sar; sar = sar->next) {
574 char inaddr_any[16] = {0}; /* big enough to handle IPv4 or IPv6 */
576 if ((sar->host_addr->family == AF_INET &&
577 sar->host_addr->sa.sin.sin_addr.s_addr == DEFAULT_VHOST_ADDR)
578 || !memcmp(sar->host_addr->ipaddr_ptr, inaddr_any, sar->host_addr->ipaddr_len)) {
579 ic = find_default_server(sar->host_port);
580 if (!ic || !add_name_vhost_config(p, main_s, s, sar, ic)) {
581 if (ic && ic->sar->host_port != 0) {
582 ap_log_error(APLOG_MARK, APLOG_WARNING,
583 0, main_s, "_default_ VirtualHost "
584 "overlap on port %u, the first has "
585 "precedence", sar->host_port);
587 ic = new_ipaddr_chain(p, s, sar);
588 ic->next = default_list;
591 has_default_vhost_addr = 1;
594 /* see if it matches something we've already got */
595 ic = find_ipaddr(sar->host_addr);
598 unsigned bucket = hash_addr(sar->host_addr);
600 ic = new_ipaddr_chain(p, s, sar);
601 ic->next = *iphash_table_tail[bucket];
602 *iphash_table_tail[bucket] = ic;
604 else if (!add_name_vhost_config(p, main_s, s, sar, ic)) {
605 ap_log_error(APLOG_MARK, APLOG_WARNING,
606 0, main_s, "VirtualHost %s:%u overlaps "
607 "with VirtualHost %s:%u, the first has "
608 "precedence, perhaps you need a "
609 "NameVirtualHost directive",
610 sar->virthost, sar->host_port,
611 ic->sar->virthost, ic->sar->host_port);
618 /* Ok now we want to set up a server_hostname if the user was
619 * silly enough to forget one.
620 * XXX: This is silly we should just crash and burn.
622 if (!s->server_hostname) {
623 if (has_default_vhost_addr) {
624 s->server_hostname = main_s->server_hostname;
626 else if (!s->addrs) {
627 /* what else can we do? at this point this vhost has
628 no configured name, probably because they used
629 DNS in the VirtualHost statement. It's disabled
630 anyhow by the host matching code. -djg */
632 apr_pstrdup(p, "bogus_host_without_forward_dns");
638 rv = apr_getnameinfo(&hostname, s->addrs->host_addr, 0);
639 if (rv == APR_SUCCESS) {
640 s->server_hostname = apr_pstrdup(p, hostname);
643 /* again, what can we do? They didn't specify a
644 ServerName, and their DNS isn't working. -djg */
647 apr_sockaddr_ip_get(&ipaddr_str, s->addrs->host_addr);
648 ap_log_error(APLOG_MARK, APLOG_ERR, rv, main_s,
649 "Failed to resolve server name "
650 "for %s (check DNS) -- or specify an explicit "
654 apr_pstrdup(p, "bogus_host_without_reverse_dns");
660 /* now go through and delete any NameVirtualHosts that didn't have any
661 * hosts associated with them. Lamers.
663 for (i = 0; i < IPHASH_TABLE_SIZE; ++i) {
664 remove_unused_name_vhosts(main_s, &iphash_table[i]);
666 remove_unused_name_vhosts(main_s, &default_list);
668 #ifdef IPHASH_STATISTICS
669 dump_iphash_statistics(main_s);
671 if (ap_exists_config_define("DUMP_VHOSTS")) {
672 apr_file_t *thefile = NULL;
673 apr_file_open_stderr(&thefile, p);
674 dump_vhost_config(thefile);
679 /*****************************************************************************
680 * run-time vhost matching functions
683 /* Lowercase and remove any trailing dot and/or :port from the hostname,
684 * and check that it is sane.
686 * In most configurations the exact syntax of the hostname isn't
687 * important so strict sanity checking isn't necessary. However, in
688 * mass hosting setups (using mod_vhost_alias or mod_rewrite) where
689 * the hostname is interpolated into the filename, we need to be sure
690 * that the interpolation doesn't expose parts of the filesystem.
691 * We don't do strict RFC 952 / RFC 1123 syntax checking in order
692 * to support iDNS and people who erroneously use underscores.
693 * Instead we just check for filesystem metacharacters: directory
694 * separators / and \ and sequences of more than one dot.
696 static void fix_hostname(request_rec *r)
698 char *host, *scope_id;
703 /* According to RFC 2616, Host header field CAN be blank. */
708 rv = apr_parse_addr_port(&host, &scope_id, &port, r->hostname, r->pool);
709 if (rv != APR_SUCCESS || scope_id) {
714 /* silly looking host ("Host: 123") but that isn't our job
715 * here to judge; apr_parse_addr_port() would think we had a port
718 host = apr_itoa(r->pool, (int)port);
721 /* Don't throw the Host: header's port number away:
722 save it in parsed_uri -- ap_get_server_port() needs it! */
723 /* @@@ XXX there should be a better way to pass the port.
724 * Like r->hostname, there should be a r->portno
726 r->parsed_uri.port = port;
727 r->parsed_uri.port_str = apr_itoa(r->pool, (int)port);
730 /* if the hostname is an IPv6 numeric address string, it was validated
731 * already; otherwise, further validation is needed
733 if (r->hostname[0] != '[') {
734 for (dst = host; *dst; dst++) {
735 if (apr_islower(*dst)) {
736 /* leave char unchanged */
738 else if (*dst == '.') {
739 if (*(dst + 1) == '.') {
743 else if (apr_isupper(*dst)) {
744 *dst = apr_tolower(*dst);
746 else if (*dst == '/' || *dst == '\\') {
750 /* strip trailing gubbins */
751 if (dst > host && dst[-1] == '.') {
759 r->status = HTTP_BAD_REQUEST;
760 ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
761 "Client sent malformed Host header");
766 /* return 1 if host matches ServerName or ServerAliases */
767 static int matches_aliases(server_rec *s, const char *host)
770 apr_array_header_t *names;
772 /* match ServerName */
773 if (!strcasecmp(host, s->server_hostname)) {
777 /* search all the aliases from ServerAlias directive */
780 char **name = (char **) names->elts;
781 for (i = 0; i < names->nelts; ++i) {
782 if(!name[i]) continue;
783 if (!strcasecmp(host, name[i]))
787 names = s->wild_names;
789 char **name = (char **) names->elts;
790 for (i = 0; i < names->nelts; ++i) {
791 if(!name[i]) continue;
792 if (!ap_strcasecmp_match(host, name[i]))
800 /* Suppose a request came in on the same socket as this r, and included
801 * a header "Host: host:port", would it map to r->server? It's more
802 * than just that though. When we do the normal matches for each request
803 * we don't even bother considering Host: etc on non-namevirtualhosts,
804 * we just call it a match. But here we require the host:port to match
805 * the ServerName and/or ServerAliases.
807 AP_DECLARE(int) ap_matches_request_vhost(request_rec *r, const char *host,
811 server_addr_rec *sar;
815 /* search all the <VirtualHost> values */
816 /* XXX: If this is a NameVirtualHost then we may not be doing the Right Thing
819 * NameVirtualHost 10.1.1.1
820 * <VirtualHost 10.1.1.1>
823 * <VirtualHost 10.1.1.1>
827 * Suppose r->server is v2, and we're asked to match "10.1.1.1". We'll say
828 * "yup it's v2", when really it isn't... if a request came in for 10.1.1.1
829 * it would really go to v1.
831 for (sar = s->addrs; sar; sar = sar->next) {
832 if ((sar->host_port == 0 || port == sar->host_port)
833 && !strcasecmp(host, sar->virthost)) {
838 /* the Port has to match now, because the rest don't have ports associated
840 if (port != s->port) {
844 return matches_aliases(s, host);
848 static void check_hostalias(request_rec *r)
851 * Even if the request has a Host: header containing a port we ignore
852 * that port. We always use the physical port of the socket. There
853 * are a few reasons for this:
855 * - the default of 80 or 443 for SSL is easier to handle this way
856 * - there is less of a possibility of a security problem
857 * - it simplifies the data structure
858 * - the client may have no idea that a proxy somewhere along the way
859 * translated the request to another ip:port
860 * - except for the addresses from the VirtualHost line, none of the other
861 * names we'll match have ports associated with them
863 const char *host = r->hostname;
871 port = r->connection->local_addr->port;
873 /* Recall that the name_chain is a list of server_addr_recs, some of
874 * whose ports may not match. Also each server may appear more than
875 * once in the chain -- specifically, it will appear once for each
876 * address from its VirtualHost line which matched. We only want to
877 * do the full ServerName/ServerAlias comparisons once for each
878 * server, fortunately we know that all the VirtualHost addresses for
879 * a single server are adjacent to each other.
882 for (src = r->connection->vhost_lookup_data; src; src = src->next) {
883 server_addr_rec *sar;
885 /* We only consider addresses on the name_chain which have a matching
889 if (sar->host_port != 0 && port != sar->host_port) {
895 /* does it match the virthost from the sar? */
896 if (!strcasecmp(host, sar->virthost)) {
901 /* we've already done ServerName and ServerAlias checks for this
908 if (matches_aliases(s, host)) {
915 /* s is the first matching server, we're done */
920 static void check_serverpath(request_rec *r)
927 port = r->connection->local_addr->port;
930 * This is in conjunction with the ServerPath code in http_core, so we
931 * get the right host attached to a non- Host-sending request.
933 * See the comment in check_hostalias about how each vhost can be
934 * listed multiple times.
938 for (src = r->connection->vhost_lookup_data; src; src = src->next) {
939 /* We only consider addresses on the name_chain which have a matching
942 if (src->sar->host_port != 0 && port != src->sar->host_port) {
952 if (s->path && !strncmp(r->uri, s->path, s->pathlen) &&
953 (s->path[s->pathlen - 1] == '/' ||
954 r->uri[s->pathlen] == '/' ||
955 r->uri[s->pathlen] == '\0')) {
963 AP_DECLARE(void) ap_update_vhost_from_headers(request_rec *r)
965 /* must set this for HTTP/1.1 support */
966 if (r->hostname || (r->hostname = apr_table_get(r->headers_in, "Host"))) {
968 if (r->status != HTTP_OK)
971 /* check if we tucked away a name_chain */
972 if (r->connection->vhost_lookup_data) {
981 * For every virtual host on this connection, call func_cb.
983 AP_DECLARE(int) ap_vhost_iterate_given_conn(conn_rec *conn,
984 ap_vhost_iterate_conn_cb func_cb,
993 if (conn->vhost_lookup_data) {
995 port = conn->local_addr->port;
997 for (src = conn->vhost_lookup_data; src; src = src->next) {
998 server_addr_rec *sar;
1000 /* We only consider addresses on the name_chain which have a
1004 if (sar->host_port != 0 && port != sar->host_port) {
1011 /* we've already done a callback for this vhost. */
1017 rv = func_cb(baton, conn, s);
1025 rv = func_cb(baton, conn, conn->base_server);
1031 /* Called for a new connection which has a known local_addr. Note that the
1032 * new connection is assumed to have conn->server == main server.
1034 AP_DECLARE(void) ap_update_vhost_given_ip(conn_rec *conn)
1039 /* scan the hash table for an exact match first */
1040 trav = find_ipaddr(conn->local_addr);
1043 /* save the name_chain for later in case this is a name-vhost */
1044 conn->vhost_lookup_data = trav->names;
1045 conn->base_server = trav->server;
1049 /* maybe there's a default server or wildcard name-based vhost
1050 * matching this port
1052 port = conn->local_addr->port;
1054 trav = find_default_server(port);
1056 conn->vhost_lookup_data = trav->names;
1057 conn->base_server = trav->server;
1061 /* otherwise we're stuck with just the main server
1062 * and no name-based vhosts
1064 conn->vhost_lookup_data = NULL;