dgaudet 97/09/15 17:59:48
Modified: src/modules/proxy mod_proxy.c mod_proxy.h proxy_cache.c proxy_connect.c proxy_ftp.c proxy_http.c proxy_util.c Added: src/modules/proxy .indent.pro Log: painful indent Revision Changes Path 1.25 +274 -271 apachen/src/modules/proxy/mod_proxy.c Index: mod_proxy.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/mod_proxy.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- mod_proxy.c 1997/09/05 00:26:32 1.24 +++ mod_proxy.c 1997/09/16 00:59:38 1.25 @@ -55,16 +55,17 @@ /* Some WWW schemes and their default ports; this is basically /etc/services */ /* This will become global when the protocol abstraction comes */ -static struct proxy_services defports[]={ - { "ftp", DEFAULT_FTP_PORT}, - { "gopher", DEFAULT_GOPHER_PORT}, - { "http", DEFAULT_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 */ +static struct proxy_services defports[] = +{ + {"ftp", DEFAULT_FTP_PORT}, + {"gopher", DEFAULT_GOPHER_PORT}, + {"http", DEFAULT_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 */ }; /* @@ -80,27 +81,28 @@ /* -------------------------------------------------------------- */ /* Translate the URL into a 'filename' */ -static int -alias_match(char *uri, char *alias_fakename) +static int alias_match(char *uri, char *alias_fakename) { - char *end_fakename = alias_fakename + strlen (alias_fakename); + char *end_fakename = alias_fakename + strlen(alias_fakename); char *aliasp = alias_fakename, *urip = uri; - while (aliasp < end_fakename) - { - if (*aliasp == '/') - { + while (aliasp < end_fakename) { + if (*aliasp == '/') { /* any number of '/' in the alias matches any number in * the supplied URI, but there must be at least one... */ - if (*urip != '/') return 0; - - while (*aliasp == '/') ++ aliasp; - while (*urip == '/') ++ urip; + if (*urip != '/') + return 0; + + while (*aliasp == '/') + ++aliasp; + while (*urip == '/') + ++urip; } else { /* Other characters are compared literally */ - if (*urip++ != *aliasp++) return 0; + if (*urip++ != *aliasp++) + return 0; } } @@ -117,31 +119,28 @@ return urip - uri; } -static int -proxy_trans(request_rec *r) +static int proxy_trans(request_rec *r) { void *sconf = r->server->module_config; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + + if (r->proxyreq) { + if (!conf->req) + return DECLINED; - if (r->proxyreq) - { - if (!conf->req) return DECLINED; - r->filename = pstrcat(r->pool, "proxy:", r->uri, NULL); r->handler = "proxy-server"; return OK; - } else - { + } + else { int i, len; - struct proxy_alias *ent=(struct proxy_alias *)conf->aliases->elts; + struct proxy_alias *ent = (struct proxy_alias *) conf->aliases->elts; - for (i=0; i < conf->aliases->nelts; i++) - { + for (i = 0; i < conf->aliases->nelts; i++) { len = alias_match(r->uri, ent[i].fake); - if (len > 0) - { + if (len > 0) { r->filename = pstrcat(r->pool, "proxy:", ent[i].real, r->uri + len, NULL); r->handler = "proxy-server"; @@ -158,33 +157,35 @@ /* * Canonicalise the URL */ -static int -proxy_fixup(request_rec *r) +static int proxy_fixup(request_rec *r) { char *url, *p; int i; - if (strncmp(r->filename, "proxy:", 6) != 0) return DECLINED; + if (strncmp(r->filename, "proxy:", 6) != 0) + return DECLINED; url = &r->filename[6]; /* lowercase the scheme */ p = strchr(url, ':'); - if (p == NULL || p == url) return BAD_REQUEST; - for (i=0; i != p - url; i++) url[i] = tolower(url[i]); + if (p == NULL || p == url) + return BAD_REQUEST; + for (i = 0; i != p - url; i++) + url[i] = tolower(url[i]); /* canonicalise each specific scheme */ if (strncmp(url, "http:", 5) == 0) - return proxy_http_canon(r, url+5, "http", DEFAULT_PORT); + return proxy_http_canon(r, url + 5, "http", DEFAULT_PORT); else if (strncmp(url, "ftp:", 4) == 0) - return proxy_ftp_canon(r, url+4); - else return OK; /* otherwise; we've done the best we can */ + return proxy_ftp_canon(r, url + 4); + else + return OK; /* otherwise; we've done the best we can */ } -static void -proxy_init(server_rec *r, pool *p) +static void proxy_init(server_rec *r, pool *p) { proxy_garbage_init(r, p); -} +} @@ -194,27 +195,27 @@ /* domain in this case. I think it is better to redirect to a FQDN, since */ /* these will later be found in the bookmarks files. */ /* The "ProxyDomain" directive determines what domain will be appended */ -static int -proxy_needsdomain(request_rec *r, const char *url, const char *domain) +static int proxy_needsdomain(request_rec *r, const char *url, const char *domain) { - char *scheme = pstrdup (r->pool, url); + char *scheme = pstrdup(r->pool, url); char *url_copy, *user = NULL, *password = NULL, *path, *err, *host; int port = -1; /* We only want to worry about GETs */ - if (r->method_number != M_GET) return DECLINED; + if (r->method_number != M_GET) + return DECLINED; /* Set url to the first char after "scheme://" */ - if ((url_copy = strchr(scheme,':')) == NULL + if ((url_copy = strchr(scheme, ':')) == NULL || url_copy[1] != '/' || url_copy[2] != '/') return DECLINED; - *url_copy++ = '\0'; /* delimit scheme, make url_copy point to "//", which is what proxy_canon_netloc expects */ + *url_copy++ = '\0'; /* delimit scheme, make url_copy point to "//", which is what proxy_canon_netloc expects */ /* Save the path - it will be re-appended for the redirection later */ path = strchr(&url_copy[2], '/'); if (path != NULL) - ++path; /* leading '/' will be overwritten by proxy_canon_netloc */ + ++path; /* leading '/' will be overwritten by proxy_canon_netloc */ else path = ""; @@ -227,32 +228,31 @@ } /* If host does contain a dot already, or it is "localhost", decline */ - if (strchr (host, '.') != NULL || strcasecmp(host, "localhost") == 0) + if (strchr(host, '.') != NULL || strcasecmp(host, "localhost") == 0) return DECLINED; /* host name has a dot already */ - else - { + else { char *nuri; char *ref = table_get(r->headers_in, "Referer"); char strport[10]; /* now, rebuild URL */ if (port == -1) - strcpy (strport, ""); + strcpy(strport, ""); else ap_snprintf(strport, sizeof(strport), ":%d", port); /* Reassemble the request, but insert the domain after the host name */ nuri = pstrcat(r->pool, scheme, "://", (user != NULL) ? user : "", - (password != NULL) ? ":" : "", - (password != NULL) ? password : "", - (user != NULL) ? "@" : "", + (password != NULL) ? ":" : "", + (password != NULL) ? password : "", + (user != NULL) ? "@" : "", host, domain, strport, "/", path, NULL); table_set(r->headers_out, "Location", nuri); aplog_error(APLOG_MARK, APLOG_ERR, r->server, - pstrcat(r->pool, "Domain missing: ", r->uri, " sent to ", nuri, - ref ? " from " : NULL, ref, NULL)); + pstrcat(r->pool, "Domain missing: ", r->uri, " sent to ", nuri, + ref ? " from " : NULL, ref, NULL)); return REDIRECT; } @@ -260,31 +260,33 @@ /* -------------------------------------------------------------- */ /* Invoke handler */ - -static int -proxy_handler(request_rec *r) + +static int proxy_handler(request_rec *r) { char *url, *scheme, *p; void *sconf = r->server->module_config; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); - array_header *proxies=conf->proxies; - struct proxy_remote *ents=(struct proxy_remote *)proxies->elts; + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + array_header *proxies = conf->proxies; + struct proxy_remote *ents = (struct proxy_remote *) proxies->elts; int i, rc; struct cache_req *cr; int direct_connect = 0; - if (strncmp(r->filename, "proxy:", 6) != 0) return DECLINED; + if (strncmp(r->filename, "proxy:", 6) != 0) + return DECLINED; if ((rc = setup_client_block(r, REQUEST_CHUNKED_ERROR))) return rc; url = r->filename + 6; p = strchr(url, ':'); - if (p == NULL) return BAD_REQUEST; + if (p == NULL) + return BAD_REQUEST; rc = proxy_cache_check(r, url, &conf->cache, &cr); - if (rc != DECLINED) return rc; + if (rc != DECLINED) + return rc; /* If the host doesn't have a domain name, add one and redirect. */ if (conf->domain != NULL @@ -298,56 +300,55 @@ /* Check URI's destination host against NoProxy hosts */ /* Bypass ProxyRemote server lookup if configured as NoProxy */ /* we only know how to handle communication to a proxy via http */ - /*if (strcmp(scheme, "http") == 0)*/ + /*if (strcmp(scheme, "http") == 0) */ { int ii; - struct dirconn_entry *list=(struct dirconn_entry*)conf->dirconn->elts; + struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; /* if (*++p == '/' && *++p == '/') */ - for (direct_connect=ii=0; ii < conf->dirconn->nelts && !direct_connect; ii++) - { - direct_connect = list[ii].matcher (&list[ii], r); + for (direct_connect = ii = 0; ii < conf->dirconn->nelts && !direct_connect; ii++) { + direct_connect = list[ii].matcher(&list[ii], r); aplog_error(APLOG_MARK, APLOG_DEBUG, r->server, "URI and NoProxy: %s: %s", r->uri, list[ii].name); } #if DEBUGGING { char msg[256]; - sprintf (msg, (direct_connect)?"NoProxy for %s":"UseProxy for %s", r->uri); + sprintf(msg, (direct_connect) ? "NoProxy for %s" : "UseProxy for %s", r->uri); aplog_error(APLOG_MARK, APLOG_DEBUG, r->server, msg); } #endif } - + /* firstly, try a proxy, unless a NoProxy directive is active */ if (!direct_connect) - for (i=0; i < proxies->nelts; i++) - { - p = strchr(ents[i].scheme, ':'); /* is it a partial URL? */ - if (strcmp(ents[i].scheme, "*") == 0 || - (p == NULL && strcmp(scheme, ents[i].scheme) == 0) || - (p != NULL && - strncmp(url, ents[i].scheme, strlen(ents[i].scheme)) == 0)) - { - /* CONNECT is a special method that bypasses the normal - * proxy code. - */ - if (r->method_number == M_CONNECT) - rc = proxy_connect_handler(r, cr, url, ents[i].hostname, - ents[i].port); + for (i = 0; i < proxies->nelts; i++) { + p = strchr(ents[i].scheme, ':'); /* is it a partial URL? */ + if (strcmp(ents[i].scheme, "*") == 0 || + (p == NULL && strcmp(scheme, ents[i].scheme) == 0) || + (p != NULL && + strncmp(url, ents[i].scheme, strlen(ents[i].scheme)) == 0)) { + /* CONNECT is a special method that bypasses the normal + * proxy code. + */ + if (r->method_number == M_CONNECT) + rc = proxy_connect_handler(r, cr, url, ents[i].hostname, + ents[i].port); /* we only know how to handle communication to a proxy via http */ - else if (strcmp(ents[i].protocol, "http") == 0) - rc = proxy_http_handler(r, cr, url, ents[i].hostname, - ents[i].port); - else rc = DECLINED; - - /* an error or success */ - if (rc != DECLINED && rc != BAD_GATEWAY) return rc; - /* we failed to talk to the upstream proxy */ + else if (strcmp(ents[i].protocol, "http") == 0) + rc = proxy_http_handler(r, cr, url, ents[i].hostname, + ents[i].port); + else + rc = DECLINED; + + /* an error or success */ + if (rc != DECLINED && rc != BAD_GATEWAY) + return rc; + /* we failed to talk to the upstream proxy */ + } } - } /* otherwise, try it direct */ /* N.B. what if we're behind a firewall, where we must use a proxy or @@ -360,44 +361,45 @@ return proxy_http_handler(r, cr, url, NULL, 0); if (strcmp(scheme, "ftp") == 0) return proxy_ftp_handler(r, cr, url); - else return NOT_IMPLEMENTED; + else + return NOT_IMPLEMENTED; } /* -------------------------------------------------------------- */ /* Setup configurable data */ static void * -create_proxy_config(pool *p, server_rec *s) + create_proxy_config(pool *p, server_rec *s) { - proxy_server_conf *ps = pcalloc(p, sizeof(proxy_server_conf)); + proxy_server_conf *ps = pcalloc(p, sizeof(proxy_server_conf)); - ps->proxies = make_array(p, 10, sizeof(struct proxy_remote)); - ps->aliases = make_array(p, 10, sizeof(struct proxy_alias)); - ps->noproxies = make_array(p, 10, sizeof(struct noproxy_entry)); - ps->dirconn = make_array(p, 10, sizeof(struct dirconn_entry)); - ps->nocaches = make_array(p, 10, sizeof(struct nocache_entry)); - ps->domain = NULL; - ps->req = 0; + ps->proxies = make_array(p, 10, sizeof(struct proxy_remote)); + ps->aliases = make_array(p, 10, sizeof(struct proxy_alias)); + ps->noproxies = make_array(p, 10, sizeof(struct noproxy_entry)); + ps->dirconn = make_array(p, 10, sizeof(struct dirconn_entry)); + ps->nocaches = make_array(p, 10, sizeof(struct nocache_entry)); + ps->domain = NULL; + ps->req = 0; - ps->cache.root = NULL; - ps->cache.space = DEFAULT_CACHE_SPACE; - ps->cache.maxexpire = DEFAULT_CACHE_MAXEXPIRE; - ps->cache.defaultexpire = DEFAULT_CACHE_EXPIRE; - ps->cache.lmfactor = DEFAULT_CACHE_LMFACTOR; - ps->cache.gcinterval = -1; - /* at these levels, the cache can have 2^18 directories (256,000) */ - ps->cache.dirlevels=3; - ps->cache.dirlength=1; + ps->cache.root = NULL; + ps->cache.space = DEFAULT_CACHE_SPACE; + ps->cache.maxexpire = DEFAULT_CACHE_MAXEXPIRE; + ps->cache.defaultexpire = DEFAULT_CACHE_EXPIRE; + ps->cache.lmfactor = DEFAULT_CACHE_LMFACTOR; + ps->cache.gcinterval = -1; + /* at these levels, the cache can have 2^18 directories (256,000) */ + ps->cache.dirlevels = 3; + ps->cache.dirlength = 1; - return ps; + return ps; } static const char * -add_proxy(cmd_parms *cmd, void *dummy, char *f, char *r) + add_proxy(cmd_parms *cmd, void *dummy, char *f, char *r) { server_rec *s = cmd->server; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(s->module_config,&proxy_module); + (proxy_server_conf *) get_module_config(s->module_config, &proxy_module); struct proxy_remote *new; char *p, *q; int port; @@ -406,25 +408,27 @@ if (p == NULL || p[1] != '/' || p[2] != '/' || p[3] == '\0') return "Bad syntax for a remote proxy server"; q = strchr(p + 3, ':'); - if (q != NULL) - { - if (sscanf(q+1, "%u", &port) != 1 || port > 65535) + if (q != NULL) { + if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) return "Bad syntax for a remote proxy server (bad port number)"; *q = '\0'; - } else port = -1; + } + else + port = -1; *p = '\0'; - if (strchr(f, ':') == NULL) str_tolower(f); /* lowercase scheme */ - str_tolower(p + 3); /* lowercase hostname */ + if (strchr(f, ':') == NULL) + str_tolower(f); /* lowercase scheme */ + str_tolower(p + 3); /* lowercase hostname */ - if (port == -1) - { + if (port == -1) { int i; - for (i=0; defports[i].scheme != NULL; i++) - if (strcmp(defports[i].scheme, r) == 0) break; + for (i = 0; defports[i].scheme != NULL; i++) + if (strcmp(defports[i].scheme, r) == 0) + break; port = defports[i].port; } - new = push_array (conf->proxies); + new = push_array(conf->proxies); new->scheme = f; new->protocol = r; new->hostname = p + 3; @@ -433,41 +437,39 @@ } static const char * -add_pass(cmd_parms *cmd, void *dummy, char *f, char *r) + add_pass(cmd_parms *cmd, void *dummy, char *f, char *r) { server_rec *s = cmd->server; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(s->module_config,&proxy_module); + (proxy_server_conf *) get_module_config(s->module_config, &proxy_module); struct proxy_alias *new; - new = push_array (conf->aliases); + new = push_array(conf->aliases); new->fake = f; new->real = r; return NULL; } static const char * -set_proxy_exclude(cmd_parms *parms, void *dummy, char *arg) + set_proxy_exclude(cmd_parms *parms, void *dummy, char *arg) { server_rec *s = parms->server; proxy_server_conf *conf = - get_module_config (s->module_config, &proxy_module); + get_module_config(s->module_config, &proxy_module); struct noproxy_entry *new; - struct noproxy_entry *list=(struct noproxy_entry*)conf->noproxies->elts; + struct noproxy_entry *list = (struct noproxy_entry *) conf->noproxies->elts; struct hostent hp; int found = 0; int i; /* Don't duplicate entries */ - for (i=0; i < conf->noproxies->nelts; i++) - { + for (i = 0; i < conf->noproxies->nelts; i++) { if (strcmp(arg, list[i].name) == 0) found = 1; } - if (!found) - { - new = push_array (conf->noproxies); + if (!found) { + 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) == NULL) @@ -482,54 +484,48 @@ * which should never be accessed via the configured ProxyRemote servers */ static const char * -set_proxy_dirconn(cmd_parms *parms, void *dummy, char *arg) + set_proxy_dirconn(cmd_parms *parms, void *dummy, char *arg) { server_rec *s = parms->server; proxy_server_conf *conf = - get_module_config (s->module_config, &proxy_module); + get_module_config(s->module_config, &proxy_module); struct dirconn_entry *New; - struct dirconn_entry *list=(struct dirconn_entry*)conf->dirconn->elts; + struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; int found = 0; int i; /* Don't duplicate entries */ - for (i=0; i < conf->dirconn->nelts; i++) - { + for (i = 0; i < conf->dirconn->nelts; i++) { if (strcasecmp(arg, list[i].name) == 0) found = 1; } - if (!found) - { - New = push_array (conf->dirconn); + if (!found) { + New = push_array(conf->dirconn); New->name = arg; - if (proxy_is_ipaddr(New)) - { + if (proxy_is_ipaddr(New)) { #if DEBUGGING - fprintf(stderr,"Parsed addr %s\n", inet_ntoa(New->addr)); - fprintf(stderr,"Parsed mask %s\n", inet_ntoa(New->mask)); + fprintf(stderr, "Parsed addr %s\n", inet_ntoa(New->addr)); + fprintf(stderr, "Parsed mask %s\n", inet_ntoa(New->mask)); #endif } - else if (proxy_is_domainname(New)) - { + else if (proxy_is_domainname(New)) { str_tolower(New->name); #if DEBUGGING - fprintf(stderr,"Parsed domain %s\n", New->name); + fprintf(stderr, "Parsed domain %s\n", New->name); #endif } - else if (proxy_is_hostname(New)) - { + else if (proxy_is_hostname(New)) { str_tolower(New->name); #if DEBUGGING - fprintf(stderr,"Parsed host %s\n", New->name); + fprintf(stderr, "Parsed host %s\n", New->name); #endif } - else - { + else { proxy_is_word(New); #if DEBUGGING - fprintf(stderr,"Parsed word %s\n", New->name); + fprintf(stderr, "Parsed word %s\n", New->name); #endif } } @@ -537,10 +533,10 @@ } static const char * -set_proxy_domain(cmd_parms *parms, void *dummy, char *arg) + set_proxy_domain(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); if (arg[0] != '.') return "Domain name must start with a dot."; @@ -550,10 +546,10 @@ } static const char * -set_proxy_req(cmd_parms *parms, void *dummy, int flag) + set_proxy_req(cmd_parms *parms, void *dummy, int flag) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); psf->req = flag; return NULL; @@ -561,22 +557,23 @@ static const char * -set_cache_size(cmd_parms *parms, char *struct_ptr, char *arg) + set_cache_size(cmd_parms *parms, char *struct_ptr, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); int val; - if (sscanf(arg, "%d", &val) != 1) return "Value must be an integer"; + if (sscanf(arg, "%d", &val) != 1) + return "Value must be an integer"; psf->cache.space = val; return NULL; } static const char * -set_cache_root(cmd_parms *parms, void *dummy, char *arg) + set_cache_root(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); psf->cache.root = arg; @@ -584,184 +581,190 @@ } static const char * -set_cache_factor(cmd_parms *parms, void *dummy, char *arg) + set_cache_factor(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); double val; - if (sscanf(arg, "%lg", &val) != 1) return "Value must be a float"; + if (sscanf(arg, "%lg", &val) != 1) + return "Value must be a float"; psf->cache.lmfactor = val; return NULL; } static const char * -set_cache_maxex(cmd_parms *parms, void *dummy, char *arg) + set_cache_maxex(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); double val; - if (sscanf(arg, "%lg", &val) != 1) return "Value must be a float"; - psf->cache.maxexpire = (int)(val * (double)SEC_ONE_HR); + if (sscanf(arg, "%lg", &val) != 1) + return "Value must be a float"; + psf->cache.maxexpire = (int) (val * (double) SEC_ONE_HR); return NULL; } static const char * -set_cache_defex(cmd_parms *parms, void *dummy, char *arg) + set_cache_defex(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); double val; - if (sscanf(arg, "%lg", &val) != 1) return "Value must be a float"; - psf->cache.defaultexpire = (int)(val * (double)SEC_ONE_HR); + if (sscanf(arg, "%lg", &val) != 1) + return "Value must be a float"; + psf->cache.defaultexpire = (int) (val * (double) SEC_ONE_HR); return NULL; } static const char * -set_cache_gcint(cmd_parms *parms, void *dummy, char *arg) + set_cache_gcint(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); double val; - if (sscanf(arg, "%lg", &val) != 1) return "Value must be a float"; - psf->cache.gcinterval = (int)(val * (double)SEC_ONE_HR); + if (sscanf(arg, "%lg", &val) != 1) + return "Value must be a float"; + psf->cache.gcinterval = (int) (val * (double) SEC_ONE_HR); return NULL; } static const char * -set_cache_dirlevels(cmd_parms *parms, char *struct_ptr, char *arg) + set_cache_dirlevels(cmd_parms *parms, char *struct_ptr, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); int val; - if (sscanf(arg, "%d", &val) != 1) return "Value must be an integer"; + if (sscanf(arg, "%d", &val) != 1) + return "Value must be an integer"; psf->cache.dirlevels = val; return NULL; } static const char * -set_cache_dirlength(cmd_parms *parms, char *struct_ptr, char *arg) + set_cache_dirlength(cmd_parms *parms, char *struct_ptr, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); + get_module_config(parms->server->module_config, &proxy_module); int val; - if (sscanf(arg, "%d", &val) != 1) return "Value must be an integer"; + if (sscanf(arg, "%d", &val) != 1) + return "Value must be an integer"; psf->cache.dirlength = val; return NULL; } static const char * -set_cache_exclude(cmd_parms *parms, void *dummy, char *arg) + set_cache_exclude(cmd_parms *parms, void *dummy, char *arg) { server_rec *s = parms->server; proxy_server_conf *conf = - get_module_config (s->module_config, &proxy_module); + get_module_config(s->module_config, &proxy_module); struct nocache_entry *new; - struct nocache_entry *list=(struct nocache_entry*)conf->nocaches->elts; + struct nocache_entry *list = (struct nocache_entry *) conf->nocaches->elts; struct hostent hp; int found = 0; int i; /* Don't duplicate entries */ - for (i=0; i < conf->nocaches->nelts; i++) - { + for (i = 0; i < conf->nocaches->nelts; i++) { if (strcmp(arg, list[i].name) == 0) found = 1; } - if (!found) - { - new = push_array (conf->nocaches); + if (!found) { + 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) == NULL) memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr)); else - new->addr.s_addr= 0; + new->addr.s_addr = 0; } return NULL; } static const char * -set_recv_buffer_size (cmd_parms *parms, void *dummy, char *arg) + set_recv_buffer_size(cmd_parms *parms, void *dummy, char *arg) { proxy_server_conf *psf = - get_module_config (parms->server->module_config, &proxy_module); - int s = atoi (arg); - if (s < 512 && s != 0) - { - return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default."; + get_module_config(parms->server->module_config, &proxy_module); + int s = atoi(arg); + if (s < 512 && s != 0) { + return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default."; } psf->recv_buffer_size = s; return NULL; } -static handler_rec proxy_handlers[] = { -{ "proxy-server", proxy_handler }, -{ NULL } -}; - -static command_rec proxy_cmds[] = { -{ "ProxyRequests", set_proxy_req, NULL, RSRC_CONF, FLAG, - "on if the true proxy requests should be accepted"}, -{ "ProxyRemote", add_proxy, NULL, RSRC_CONF, TAKE2, - "a scheme, partial URL or '*' and a proxy server"}, -{ "ProxyPass", add_pass, NULL, RSRC_CONF, TAKE2, - "a virtual path and a URL"}, -{ "ProxyBlock", set_proxy_exclude, NULL, RSRC_CONF, ITERATE, - "A list of names, hosts or domains to which the proxy will not connect" }, -{ "NoProxy", set_proxy_dirconn, NULL, RSRC_CONF, ITERATE, - "A list of domains, hosts, or subnets to which the proxy will connect directly" }, -{ "ProxyDomain", set_proxy_domain, NULL, RSRC_CONF, TAKE1, - "The default intranet domain name (in absence of a domain in the URL)" }, -{ "CacheRoot", set_cache_root, NULL, RSRC_CONF, TAKE1, - "The directory to store cache files"}, -{ "CacheSize", set_cache_size, NULL, RSRC_CONF, TAKE1, - "The maximum disk space used by the cache in Kb"}, -{ "CacheMaxExpire", set_cache_maxex, NULL, RSRC_CONF, TAKE1, - "The maximum time in hours to cache a document"}, -{ "CacheDefaultExpire", set_cache_defex, NULL, RSRC_CONF, TAKE1, - "The default time in hours to cache a document"}, -{ "CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF, TAKE1, - "The factor used to estimate Expires date from LastModified date"}, -{ "CacheGcInterval", set_cache_gcint, NULL, RSRC_CONF, TAKE1, - "The interval between garbage collections, in hours"}, -{ "CacheDirLevels", set_cache_dirlevels, NULL, RSRC_CONF, TAKE1, - "The number of levels of subdirectories in the cache" }, -{ "CacheDirLength", set_cache_dirlength, NULL, RSRC_CONF, TAKE1, - "The number of characters in subdirectory names" }, -{ "NoCache", set_cache_exclude, NULL, RSRC_CONF, ITERATE, - "A list of names, hosts or domains for which caching is *not* provided" }, -{ "ReceiveBufferSize", set_recv_buffer_size, NULL, RSRC_CONF, TAKE1, - "Receive buffer size in bytes" }, -{ NULL } +static handler_rec proxy_handlers[] = +{ + {"proxy-server", proxy_handler}, + {NULL} +}; + +static command_rec proxy_cmds[] = +{ + {"ProxyRequests", set_proxy_req, NULL, RSRC_CONF, FLAG, + "on if the true proxy requests should be accepted"}, + {"ProxyRemote", add_proxy, NULL, RSRC_CONF, TAKE2, + "a scheme, partial URL or '*' and a proxy server"}, + {"ProxyPass", add_pass, NULL, RSRC_CONF, TAKE2, + "a virtual path and a URL"}, + {"ProxyBlock", set_proxy_exclude, NULL, RSRC_CONF, ITERATE, + "A list of names, hosts or domains to which the proxy will not connect"}, + {"NoProxy", set_proxy_dirconn, NULL, RSRC_CONF, ITERATE, + "A list of domains, hosts, or subnets to which the proxy will connect directly"}, + {"ProxyDomain", set_proxy_domain, NULL, RSRC_CONF, TAKE1, + "The default intranet domain name (in absence of a domain in the URL)"}, + {"CacheRoot", set_cache_root, NULL, RSRC_CONF, TAKE1, + "The directory to store cache files"}, + {"CacheSize", set_cache_size, NULL, RSRC_CONF, TAKE1, + "The maximum disk space used by the cache in Kb"}, + {"CacheMaxExpire", set_cache_maxex, NULL, RSRC_CONF, TAKE1, + "The maximum time in hours to cache a document"}, + {"CacheDefaultExpire", set_cache_defex, NULL, RSRC_CONF, TAKE1, + "The default time in hours to cache a document"}, + {"CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF, TAKE1, + "The factor used to estimate Expires date from LastModified date"}, + {"CacheGcInterval", set_cache_gcint, NULL, RSRC_CONF, TAKE1, + "The interval between garbage collections, in hours"}, + {"CacheDirLevels", set_cache_dirlevels, NULL, RSRC_CONF, TAKE1, + "The number of levels of subdirectories in the cache"}, + {"CacheDirLength", set_cache_dirlength, NULL, RSRC_CONF, TAKE1, + "The number of characters in subdirectory names"}, + {"NoCache", set_cache_exclude, NULL, RSRC_CONF, ITERATE, + "A list of names, hosts or domains for which caching is *not* provided"}, + {"ReceiveBufferSize", set_recv_buffer_size, NULL, RSRC_CONF, TAKE1, + "Receive buffer size in bytes"}, + {NULL} }; -module MODULE_VAR_EXPORT proxy_module = { - STANDARD_MODULE_STUFF, - proxy_init, /* initializer */ - NULL, /* create per-directory config structure */ - NULL, /* merge per-directory config structures */ - create_proxy_config, /* create per-server config structure */ - NULL, /* merge per-server config structures */ - proxy_cmds, /* command table */ - proxy_handlers, /* handlers */ - proxy_trans, /* translate_handler */ - NULL, /* check_user_id */ - NULL, /* check auth */ - NULL, /* check access */ - NULL, /* type_checker */ - proxy_fixup, /* pre-run fixups */ - NULL, /* logger */ - NULL, /* header parser */ - NULL, /* child_init */ - NULL, /* child_exit */ - NULL /* post read-request */ +module MODULE_VAR_EXPORT proxy_module = +{ + STANDARD_MODULE_STUFF, + proxy_init, /* initializer */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + create_proxy_config, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + proxy_cmds, /* command table */ + proxy_handlers, /* handlers */ + proxy_trans, /* translate_handler */ + NULL, /* check_user_id */ + NULL, /* check auth */ + NULL, /* check access */ + NULL, /* type_checker */ + proxy_fixup, /* pre-run fixups */ + NULL, /* logger */ + NULL, /* header parser */ + NULL, /* child_init */ + NULL, /* child_exit */ + NULL /* post read-request */ }; 1.23 +83 -88 apachen/src/modules/proxy/mod_proxy.h Index: mod_proxy.h =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/mod_proxy.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- mod_proxy.h 1997/09/06 14:16:56 1.22 +++ mod_proxy.h 1997/09/16 00:59:39 1.23 @@ -56,43 +56,43 @@ /* -Note that the Explain() stuff is not yet complete. -Also note numerous FIXMEs and CHECKMEs which should be eliminated. + Note that the Explain() stuff is not yet complete. + Also note numerous FIXMEs and CHECKMEs which should be eliminated. -If TESTING is set, then garbage collection doesn't delete ... probably a good -idea when hacking. + If TESTING is set, then garbage collection doesn't delete ... probably a good + idea when hacking. -This code is still experimental! + This code is still experimental! -Things to do: + Things to do: -1. Make it garbage collect in the background, not while someone is waiting for -a response! + 1. Make it garbage collect in the background, not while someone is waiting for + a response! -2. Check the logic thoroughly. + 2. Check the logic thoroughly. -3. Empty directories are only removed the next time round (but this does avoid -two passes). Consider doing them the first time round. + 3. Empty directories are only removed the next time round (but this does avoid + two passes). Consider doing them the first time round. -Ben Laurie <[EMAIL PROTECTED]> 30 Mar 96 + Ben Laurie <[EMAIL PROTECTED]> 30 Mar 96 -More things to do: + More things to do: -0. Code cleanup (ongoing) + 0. Code cleanup (ongoing) -1. add 230 response output for ftp now that it works + 1. add 230 response output for ftp now that it works -2. Make the ftp proxy transparent, also same with (future) gopher & wais + 2. Make the ftp proxy transparent, also same with (future) gopher & wais -3. Use protocol handler struct a la Apache module handlers (Dirk van Gulik) - -4. Use a cache expiry database for more efficient GC (Jeremy Wohl) + 3. Use protocol handler struct a la Apache module handlers (Dirk van Gulik) -5. Bulletproof GC against SIGALRM + 4. Use a cache expiry database for more efficient GC (Jeremy Wohl) -Chuck Murcko <[EMAIL PROTECTED]> 15 April 1997 + 5. Bulletproof GC against SIGALRM -*/ + Chuck Murcko <[EMAIL PROTECTED]> 15 April 1997 + + */ #define TESTING 0 #undef EXPLAIN @@ -100,17 +100,19 @@ #include "httpd.h" #include "http_config.h" #include "http_protocol.h" - + #include "explain.h" extern module MODULE_VAR_EXPORT proxy_module; /* for proxy_canonenc() */ -enum enctype { enc_path, enc_search, enc_user, enc_fpath, enc_parm }; - -#define HDR_APP (0) /* append header, for proxy_add_header() */ -#define HDR_REP (1) /* replace header, for proxy_add_header() */ +enum enctype { + enc_path, enc_search, enc_user, enc_fpath, enc_parm +}; + +#define HDR_APP (0) /* append header, for proxy_add_header() */ +#define HDR_REP (1) /* replace header, for proxy_add_header() */ /* number of characters in the hash */ #define HASH_LEN (22*2) @@ -128,19 +130,17 @@ #define DEFAULT_PROSPERO_PORT 1525 /* WARNING: conflict w/Oracle */ /* Some WWW schemes and their default ports; this is basically /etc/services */ -struct proxy_services -{ +struct proxy_services { const char *scheme; int port; }; /* static information about a remote proxy */ -struct proxy_remote -{ - const char *scheme; /* the schemes handled by this proxy, or '*' */ - const char *protocol; /* the scheme used to talk to this proxy */ - const char *hostname; /* the hostname of this proxy */ - int port; /* the port for this proxy */ +struct proxy_remote { + const char *scheme; /* the schemes handled by this proxy, or '*' */ + const char *protocol; /* the scheme used to talk to this proxy */ + const char *hostname; /* the hostname of this proxy */ + int port; /* the port for this proxy */ }; struct proxy_alias { @@ -150,9 +150,9 @@ struct dirconn_entry { char *name; - struct in_addr addr,mask; + struct in_addr addr, mask; struct hostent hostlist; - int (*matcher)(struct dirconn_entry *This, request_rec *r); + int (*matcher) (struct dirconn_entry * This, request_rec *r); }; struct noproxy_entry { @@ -171,74 +171,70 @@ #define DEFAULT_CACHE_LMFACTOR (0.1) /* static information about the local cache */ -struct cache_conf -{ - const char *root; /* the location of the cache directory */ - int space; /* Maximum cache size (in 1024 bytes) */ - int maxexpire; /* Maximum time to keep cached files in secs */ - int defaultexpire; /* default time to keep cached file in secs */ - double lmfactor; /* factor for estimating expires date */ - int gcinterval; /* garbage collection interval, in seconds */ - int dirlevels; /* Number of levels of subdirectories */ - int dirlength; /* Length of subdirectory names */ +struct cache_conf { + const char *root; /* the location of the cache directory */ + int space; /* Maximum cache size (in 1024 bytes) */ + int maxexpire; /* Maximum time to keep cached files in secs */ + int defaultexpire; /* default time to keep cached file in secs */ + double lmfactor; /* factor for estimating expires date */ + int gcinterval; /* garbage collection interval, in seconds */ + int dirlevels; /* Number of levels of subdirectories */ + int dirlength; /* Length of subdirectory names */ }; -typedef struct -{ - struct cache_conf cache; /* cache configuration */ +typedef struct { + struct cache_conf cache; /* cache configuration */ array_header *proxies; array_header *aliases; array_header *noproxies; array_header *dirconn; 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 */ + char *domain; /* domain name to use in absence of a domain name in the request */ + int req; /* true if proxy requests are enabled */ int recv_buffer_size; } proxy_server_conf; -struct hdr_entry -{ +struct hdr_entry { char *field; char *value; }; /* caching information about a request */ -struct cache_req -{ - request_rec *req; /* the request */ - char *url; /* the URL requested */ - char *filename; /* name of the cache file, or NULL if no cache */ - char *tempfile; /* name of the temporary file, of NULL if not caching */ - time_t ims; /* if-modified-since date of request; -1 if no header */ - BUFF *fp; /* the cache file descriptor if the file is cached - and may be returned, or NULL if the file is - not cached (or must be reloaded) */ - time_t expire; /* calculated expire date of cached entity */ - time_t lmod; /* last-modified date of cached entity */ - time_t date; /* the date the cached file was last touched */ - int version; /* update count of the file */ - unsigned int len; /* content length */ - char *protocol; /* Protocol, and major/minor number, e.g. HTTP/1.1 */ - int status; /* the status of the cached file */ - char *resp_line; /* the whole status like (protocol, code + message) */ - array_header *hdrs; /* the HTTP headers of the file */ +struct cache_req { + request_rec *req; /* the request */ + char *url; /* the URL requested */ + char *filename; /* name of the cache file, or NULL if no cache */ + char *tempfile; /* name of the temporary file, of NULL if not caching */ + time_t ims; /* if-modified-since date of request; -1 if no header */ + BUFF *fp; /* the cache file descriptor if the file is cached + and may be returned, or NULL if the file is + not cached (or must be reloaded) */ + time_t expire; /* calculated expire date of cached entity */ + time_t lmod; /* last-modified date of cached entity */ + time_t date; /* the date the cached file was last touched */ + int version; /* update count of the file */ + unsigned int len; /* content length */ + char *protocol; /* Protocol, and major/minor number, e.g. HTTP/1.1 */ + int status; /* the status of the cached file */ + char *resp_line; /* the whole status like (protocol, code + message) */ + array_header *hdrs; /* the HTTP headers of the file */ }; - + /* Function prototypes */ /* proxy_cache.c */ void proxy_cache_tidy(struct cache_req *c); int proxy_cache_check(request_rec *r, char *url, struct cache_conf *conf, - struct cache_req **cr); + struct cache_req **cr); int proxy_cache_update(struct cache_req *c, array_header *resp_hdrs, - const int is_HTTP1, int nocache); + const int is_HTTP1, int nocache); void proxy_garbage_coll(request_rec *r); /* proxy_connect.c */ -int proxy_connect_handler(request_rec *r, struct cache_req *c, char *url, - const char *proxyhost, int proxyport); +int proxy_connect_handler(request_rec *r, struct cache_req *c, char *url, + const char *proxyhost, int proxyport); /* proxy_ftp.c */ @@ -248,33 +244,33 @@ /* proxy_http.c */ int proxy_http_canon(request_rec *r, char *url, const char *scheme, - int def_port); + int def_port); int proxy_http_handler(request_rec *r, struct cache_req *c, char *url, - const char *proxyhost, int proxyport); + const char *proxyhost, int proxyport); /* proxy_util.c */ int proxy_hex2c(const char *x); void proxy_c2hex(int ch, char *x); char *proxy_canonenc(pool *p, const char *x, int len, enum enctype t, - int isenc); + int isenc); char *proxy_canon_netloc(pool *p, char **const urlp, char **userp, - char **passwordp, char **hostp, int *port); + char **passwordp, char **hostp, int *port); char *proxy_date_canon(pool *p, char *x); array_header *proxy_read_headers(pool *p, char *buffer, int size, BUFF *f); long int proxy_send_fb(BUFF *f, request_rec *r, BUFF *f2, struct cache_req *c); struct hdr_entry *proxy_get_header(array_header *hdrs_arr, const char *name); struct hdr_entry *proxy_add_header(array_header *hdrs_arr, char *field, - char *value, int rep); + char *value, int rep); void proxy_del_header(array_header *hdrs_arr, const char *field); -void proxy_send_headers(request_rec *r, const char *respline, - array_header *hdrs_arr); +void proxy_send_headers(request_rec *r, const char *respline, + array_header *hdrs_arr); int proxy_liststr(const char *list, const char *val); -void proxy_hash(const char *it, char *val,int ndepth,int nlength); +void proxy_hash(const char *it, char *val, int ndepth, int nlength); int proxy_hex2sec(const char *x); void proxy_sec2hex(int t, char *y); void proxy_log_uerror(const char *routine, const char *file, const char *err, - server_rec *s); + 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); @@ -284,4 +280,3 @@ int proxy_is_word(struct dirconn_entry *This); int proxy_doconnect(int sock, struct sockaddr_in *addr, request_rec *r); int proxy_garbage_init(server_rec *, pool *); - 1.27 +274 -307 apachen/src/modules/proxy/proxy_cache.c Index: proxy_cache.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_cache.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- proxy_cache.c 1997/09/06 14:16:56 1.26 +++ proxy_cache.c 1997/09/16 00:59:39 1.27 @@ -68,23 +68,24 @@ #define abs(c) ((c) >= 0 ? (c) : -(c)) -struct gc_ent -{ +struct gc_ent { unsigned long int len; time_t expire; - char file[HASH_LEN+1]; + char file[HASH_LEN + 1]; }; -static int -gcdiff(const void *ap, const void *bp) +static int gcdiff(const void *ap, const void *bp) { - const struct gc_ent *a=*(const struct gc_ent * const *)ap; - const struct gc_ent *b=*(const struct gc_ent * const *)bp; + const struct gc_ent *a = *(const struct gc_ent * const *) ap; + const struct gc_ent *b = *(const struct gc_ent * const *) bp; - if (a->expire > b->expire) return 1; - else if (a->expire < b->expire) return -1; - else return 0; + if (a->expire > b->expire) + return 1; + else if (a->expire < b->expire) + return -1; + else + return 0; } static int curbytes, cachesize, every; @@ -94,91 +95,87 @@ static mutex *garbage_mutex = NULL; -int -proxy_garbage_init(server_rec *r, pool *p) +int proxy_garbage_init(server_rec *r, pool *p) { - if(!garbage_mutex) - garbage_mutex = create_mutex(NULL); + if (!garbage_mutex) + garbage_mutex = create_mutex(NULL); - return(0); + return (0); } -static int sub_garbage_coll(request_rec *r,array_header *files, - const char *cachedir,const char *cachesubdir); +static int sub_garbage_coll(request_rec *r, array_header *files, + const char *cachedir, const char *cachesubdir); static void help_proxy_garbage_coll(request_rec *r); void proxy_garbage_coll(request_rec *r) { static int inside = 0; - (void)acquire_mutex(garbage_mutex); - if(inside == 1) - { - (void)release_mutex(garbage_mutex); - return; + (void) acquire_mutex(garbage_mutex); + if (inside == 1) { + (void) release_mutex(garbage_mutex); + return; } else - inside = 1; - (void)release_mutex(garbage_mutex); + inside = 1; + (void) release_mutex(garbage_mutex); help_proxy_garbage_coll(r); - (void)acquire_mutex(garbage_mutex); + (void) acquire_mutex(garbage_mutex); inside = 0; - (void)release_mutex(garbage_mutex); + (void) release_mutex(garbage_mutex); } void help_proxy_garbage_coll(request_rec *r) - { +{ const char *cachedir; void *sconf = r->server->module_config; proxy_server_conf *pconf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); - const struct cache_conf *conf=&pconf->cache; + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + const struct cache_conf *conf = &pconf->cache; array_header *files; struct stat buf; - struct gc_ent *fent,**elts; + struct gc_ent *fent, **elts; int i, timefd; - static time_t lastcheck=BAD_DATE; /* static data!!! */ + static time_t lastcheck = BAD_DATE; /* static data!!! */ cachedir = conf->root; cachesize = conf->space; every = conf->gcinterval; - if (cachedir == NULL || every == -1) return; + if (cachedir == NULL || every == -1) + return; now = time(NULL); - if (now != -1 && lastcheck != BAD_DATE && now < lastcheck + every) return; + if (now != -1 && lastcheck != BAD_DATE && now < lastcheck + every) + return; - block_alarms(); /* avoid SIGALRM on big cache cleanup */ + block_alarms(); /* avoid SIGALRM on big cache cleanup */ filename = palloc(r->pool, strlen(cachedir) + HASH_LEN + 2); strcpy(filename, cachedir); strcat(filename, "/.time"); - if (stat(filename, &buf) == -1) /* does not exist */ - { - if (errno != ENOENT) - { + if (stat(filename, &buf) == -1) { /* does not exist */ + if (errno != ENOENT) { proxy_log_uerror("stat", filename, NULL, r->server); unblock_alarms(); return; } - if ((timefd = creat(filename, 0666)) == -1) - { + if ((timefd = creat(filename, 0666)) == -1) { if (errno != EEXIST) proxy_log_uerror("creat", filename, NULL, r->server); else - lastcheck = abs(now); /* someone else got in there */ + lastcheck = abs(now); /* someone else got in there */ unblock_alarms(); return; } close(timefd); - } else - { - lastcheck = buf.st_mtime; /* save the time */ - if (now < lastcheck + every) - { + } + else { + lastcheck = buf.st_mtime; /* save the time */ + if (now < lastcheck + every) { unblock_alarms(); return; } @@ -189,27 +186,24 @@ curblocks = 0; curbytes = 0; - sub_garbage_coll(r,files,cachedir,"/"); + sub_garbage_coll(r, files, cachedir, "/"); - if (curblocks < cachesize || curblocks + curbytes <= cachesize) - { + if (curblocks < cachesize || curblocks + curbytes <= cachesize) { unblock_alarms(); return; } qsort(files->elts, files->nelts, sizeof(struct gc_ent *), gcdiff); - elts = (struct gc_ent **)files->elts; - for (i=0; i < files->nelts; i++) - { + elts = (struct gc_ent **) files->elts; + for (i = 0; i < files->nelts; i++) { fent = elts[i]; sprintf(filename, "%s%s", cachedir, fent->file); - Explain3("GC Unlinking %s (expiry %ld, now %ld)",filename,fent->expire,now); + Explain3("GC Unlinking %s (expiry %ld, now %ld)", filename, fent->expire, now); #if TESTING - fprintf(stderr,"Would unlink %s\n",filename); + fprintf(stderr, "Would unlink %s\n", filename); #else - if (unlink(filename) == -1) - { + if (unlink(filename) == -1) { if (errno != ENOENT) proxy_log_uerror("unlink", filename, NULL, r->server); } @@ -218,8 +212,7 @@ { curblocks -= fent->len >> 10; curbytes -= fent->len & 0x3FF; - if (curbytes < 0) - { + if (curbytes < 0) { curbytes += 1024; curblocks--; } @@ -230,13 +223,13 @@ unblock_alarms(); } -static int sub_garbage_coll(request_rec *r,array_header *files, - const char *cachebasedir,const char *cachesubdir) +static int sub_garbage_coll(request_rec *r, array_header *files, + const char *cachebasedir, const char *cachesubdir) { char line[27]; char cachedir[HUGE_STRING_LEN]; struct stat buf; - int fd,i; + int fd, i; DIR *dir; #if defined(NEXT) || defined(WIN32) struct DIR_TYPE *ent; @@ -244,101 +237,92 @@ struct dirent *ent; #endif struct gc_ent *fent; - int nfiles=0; + int nfiles = 0; - ap_snprintf(cachedir, sizeof(cachedir), "%s%s",cachebasedir,cachesubdir); - Explain1("GC Examining directory %s",cachedir); + ap_snprintf(cachedir, sizeof(cachedir), "%s%s", cachebasedir, cachesubdir); + Explain1("GC Examining directory %s", cachedir); dir = opendir(cachedir); - if (dir == NULL) - { + if (dir == NULL) { proxy_log_uerror("opendir", cachedir, NULL, r->server); return 0; } - while ((ent = readdir(dir)) != NULL) - { - if (ent->d_name[0] == '.') continue; + while ((ent = readdir(dir)) != NULL) { + if (ent->d_name[0] == '.') + continue; sprintf(filename, "%s%s", cachedir, ent->d_name); - Explain1("GC Examining file %s",filename); + Explain1("GC Examining file %s", filename); /* is it a temporary file? */ - if (strncmp(ent->d_name, "tmp", 3) == 0) - { + if (strncmp(ent->d_name, "tmp", 3) == 0) { /* then stat it to see how old it is; delete temporary files > 1 day old */ - if (stat(filename, &buf) == -1) - { + if (stat(filename, &buf) == -1) { if (errno != ENOENT) proxy_log_uerror("stat", filename, NULL, r->server); - } else if (now != -1 && buf.st_atime < now - SEC_ONE_DAY && - buf.st_mtime < now - SEC_ONE_DAY) - { - Explain1("GC unlink %s",filename); + } + else if (now != -1 && buf.st_atime < now - SEC_ONE_DAY && + buf.st_mtime < now - SEC_ONE_DAY) { + Explain1("GC unlink %s", filename); #if TESTING - fprintf(stderr,"Would unlink %s\n",filename); + fprintf(stderr, "Would unlink %s\n", filename); #else unlink(filename); #endif - } + } continue; } ++nfiles; /* is it another file? */ /* FIXME: Shouldn't any unexpected files be deleted? */ - /* if (strlen(ent->d_name) != HASH_LEN) continue; */ + /* if (strlen(ent->d_name) != HASH_LEN) continue; */ /* read the file */ fd = open(filename, O_RDONLY | O_BINARY); - if (fd == -1) - { - if (errno != ENOENT) proxy_log_uerror("open", filename,NULL, - r->server); + if (fd == -1) { + if (errno != ENOENT) + proxy_log_uerror("open", filename, NULL, + r->server); continue; } - if (fstat(fd, &buf) == -1) - { + if (fstat(fd, &buf) == -1) { proxy_log_uerror("fstat", filename, NULL, r->server); close(fd); continue; } - if(S_ISDIR(buf.st_mode)) - { + if (S_ISDIR(buf.st_mode)) { char newcachedir[HUGE_STRING_LEN]; close(fd); ap_snprintf(newcachedir, sizeof(newcachedir), - "%s%s/",cachesubdir,ent->d_name); - if(!sub_garbage_coll(r,files,cachebasedir,newcachedir)) - { - ap_snprintf(newcachedir, sizeof(newcachedir), - "%s%s",cachedir,ent->d_name); + "%s%s/", cachesubdir, ent->d_name); + if (!sub_garbage_coll(r, files, cachebasedir, newcachedir)) { + ap_snprintf(newcachedir, sizeof(newcachedir), + "%s%s", cachedir, ent->d_name); #if TESTING - fprintf(stderr,"Would remove directory %s\n",newcachedir); + fprintf(stderr, "Would remove directory %s\n", newcachedir); #else rmdir(newcachedir); #endif --nfiles; - } - continue; } - + continue; + } + i = read(fd, line, 26); - if (i == -1) - { + if (i == -1) { proxy_log_uerror("read", filename, NULL, r->server); close(fd); continue; } close(fd); line[i] = '\0'; - expire = proxy_hex2sec(line+18); + expire = proxy_hex2sec(line + 18); if (!checkmask(line, "&&&&&&&& &&&&&&&& &&&&&&&&") || - expire == BAD_DATE) - { + expire == BAD_DATE) { /* bad file */ if (now != -1 && buf.st_atime > now + SEC_ONE_DAY && - buf.st_mtime > now + SEC_ONE_DAY) - { + buf.st_mtime > now + SEC_ONE_DAY) { log_error("proxy: deleting bad cache file", r->server); #if TESTING - fprintf(stderr,"Would unlink bad file %s\n",filename); + fprintf(stderr, "Would unlink bad file %s\n", filename); #else unlink(filename); #endif @@ -357,15 +341,14 @@ fent = palloc(r->pool, sizeof(struct gc_ent)); fent->len = buf.st_size; fent->expire = expire; - strcpy(fent->file,cachesubdir); + strcpy(fent->file, cachesubdir); strcat(fent->file, ent->d_name); - *(struct gc_ent **)push_array(files) = fent; + *(struct gc_ent **) push_array(files) = fent; /* accumulate in blocks, to cope with directories > 4Gb */ - curblocks += buf.st_size >> 10; /* Kbytes */ + curblocks += buf.st_size >> 10; /* Kbytes */ curbytes += buf.st_size & 0x3FF; - if (curbytes >= 1024) - { + if (curbytes >= 1024) { curbytes -= 1024; curblocks++; } @@ -383,8 +366,7 @@ * 0 on failure (bad file or wrong URL) * -1 on UNIX error */ -static int -rdcache(pool *p, BUFF *cachefp, struct cache_req *c) +static int rdcache(pool *p, BUFF *cachefp, struct cache_req *c) { char urlbuff[1034], *strp; int len; @@ -394,48 +376,54 @@ * dates are stored as hex seconds since 1970 */ len = bgets(urlbuff, 1034, cachefp); - if (len == -1) return -1; - if (len == 0 || urlbuff[len-1] != '\n') return 0; - urlbuff[len-1] = '\0'; + if (len == -1) + return -1; + if (len == 0 || urlbuff[len - 1] != '\n') + return 0; + urlbuff[len - 1] = '\0'; if (!checkmask(urlbuff, - "&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&")) + "&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&")) return 0; c->date = proxy_hex2sec(urlbuff); - c->lmod = proxy_hex2sec(urlbuff+9); - c->expire = proxy_hex2sec(urlbuff+18); - c->version = proxy_hex2sec(urlbuff+27); - c->len = proxy_hex2sec(urlbuff+36); + c->lmod = proxy_hex2sec(urlbuff + 9); + c->expire = proxy_hex2sec(urlbuff + 18); + c->version = proxy_hex2sec(urlbuff + 27); + c->len = proxy_hex2sec(urlbuff + 36); /* check that we have the same URL */ len = bgets(urlbuff, 1034, cachefp); - if (len == -1) return -1; + if (len == -1) + return -1; if (len == 0 || strncmp(urlbuff, "X-URL: ", 7) != 0 || - urlbuff[len-1] != '\n') + urlbuff[len - 1] != '\n') + return 0; + urlbuff[len - 1] = '\0'; + if (strcmp(urlbuff + 7, c->url) != 0) return 0; - urlbuff[len-1] = '\0'; - if (strcmp(urlbuff+7, c->url) != 0) return 0; /* What follows is the message */ len = bgets(urlbuff, 1034, cachefp); - if (len == -1) return -1; - if (len == 0 || urlbuff[len-1] != '\n') return 0; + if (len == -1) + return -1; + if (len == 0 || urlbuff[len - 1] != '\n') + return 0; urlbuff[--len] = '\0'; c->resp_line = pstrdup(p, urlbuff); strp = strchr(urlbuff, ' '); - if (strp == NULL) return 0; + if (strp == NULL) + return 0; c->status = atoi(strp); c->hdrs = proxy_read_headers(p, urlbuff, 1034, cachefp); - if (c->hdrs == NULL) return -1; - if (c->len != -1) /* add a content-length header */ - { + if (c->hdrs == NULL) + return -1; + if (c->len != -1) { /* add a content-length header */ struct hdr_entry *q; q = proxy_get_header(c->hdrs, "Content-Length"); - if (q == NULL) - { + if (q == NULL) { strp = palloc(p, 15); ap_snprintf(strp, 15, "%u", c->len); proxy_add_header(c->hdrs, "Content-Length", strp, HDR_REP); @@ -459,19 +447,18 @@ * if last modified after if-modified-since then add * last modified date to request */ -int -proxy_cache_check(request_rec *r, char *url, struct cache_conf *conf, - struct cache_req **cr) +int proxy_cache_check(request_rec *r, char *url, struct cache_conf *conf, + struct cache_req **cr) { char hashfile[66], *imstr, *pragma, *p, *auth; struct cache_req *c; time_t now; BUFF *cachefp; int cfd, i; - const long int zero=0L; + const long int zero = 0L; void *sconf = r->server->module_config; proxy_server_conf *pconf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); + (proxy_server_conf *) get_module_config(sconf, &proxy_module); c = pcalloc(r->pool, sizeof(struct cache_req)); *cr = c; @@ -481,17 +468,16 @@ /* get the If-Modified-Since date of the request */ c->ims = BAD_DATE; imstr = table_get(r->headers_in, "If-Modified-Since"); - if (imstr != NULL) - { + if (imstr != NULL) { /* this may modify the value in the original table */ imstr = proxy_date_canon(r->pool, imstr); c->ims = parseHTTPdate(imstr); - if (c->ims == BAD_DATE) /* bad or out of range date; remove it */ + if (c->ims == BAD_DATE) /* bad or out of range date; remove it */ table_set(r->headers_in, "If-Modified-Since", NULL); } /* find the filename for this cache entry */ - proxy_hash(url, hashfile,pconf->cache.dirlevels,pconf->cache.dirlength); + proxy_hash(url, hashfile, pconf->cache.dirlevels, pconf->cache.dirlength); if (conf->root != NULL) c->filename = pstrcat(r->pool, conf->root, "/", hashfile, NULL); else @@ -501,38 +487,35 @@ /* find out about whether the request can access the cache */ pragma = table_get(r->headers_in, "Pragma"); auth = table_get(r->headers_in, "Authorization"); - Explain5("Request for %s, pragma=%s, auth=%s, ims=%ld, imstr=%s",url, - pragma,auth,c->ims,imstr); + Explain5("Request for %s, pragma=%s, auth=%s, ims=%ld, imstr=%s", url, + pragma, auth, c->ims, imstr); if (c->filename != NULL && r->method_number == M_GET && strlen(url) < 1024 && !proxy_liststr(pragma, "no-cache") && - auth == NULL) - { - Explain1("Check file %s",c->filename); + auth == NULL) { + Explain1("Check file %s", c->filename); cfd = open(c->filename, O_RDWR | O_BINARY); - if (cfd != -1) - { + if (cfd != -1) { note_cleanups_for_fd(r->pool, cfd); cachefp = bcreate(r->pool, B_RD | B_WR); bpushfd(cachefp, cfd, cfd); - } else if (errno != ENOENT) + } + else if (errno != ENOENT) proxy_log_uerror("open", c->filename, - "proxy: error opening cache file", r->server); + "proxy: error opening cache file", r->server); #ifdef EXPLAIN else - Explain1("File %s not found",c->filename); + Explain1("File %s not found", c->filename); #endif } - - if (cachefp != NULL) - { + + if (cachefp != NULL) { i = rdcache(r->pool, cachefp, c); if (i == -1) proxy_log_uerror("read", c->filename, - "proxy: error reading cache file", r->server); + "proxy: error reading cache file", r->server); else if (i == 0) log_error("proxy: bad cache file", r->server); - if (i != 1) - { + if (i != 1) { pclosef(r->pool, cachefp->fd); cachefp = NULL; } @@ -542,23 +525,21 @@ /* FIXME: Shouldn't we check the URL somewhere? */ now = time(NULL); /* Ok, have we got some un-expired data? */ - if (cachefp != NULL && c->expire != BAD_DATE && now < c->expire) - { - Explain0("Unexpired data available"); + if (cachefp != NULL && c->expire != BAD_DATE && now < c->expire) { + Explain0("Unexpired data available"); /* check IMS */ - if (c->lmod != BAD_DATE && c->ims != BAD_DATE && c->ims >= c->lmod) - { + if (c->lmod != BAD_DATE && c->ims != BAD_DATE && c->ims >= c->lmod) { /* has the cached file changed since this request? */ - if (c->date == BAD_DATE || c->date > c->ims) - { + if (c->date == BAD_DATE || c->date > c->ims) { /* No, but these header values may have changed, so we send them with the * 304 response */ - /* CHECKME: surely this was wrong? (Ben) - p = table_get(r->headers_in, "Expires"); - */ + /* CHECKME: surely this was wrong? (Ben) + p = table_get(r->headers_in, "Expires"); + */ p = table_get(c->hdrs, "Expires"); - if (p != NULL) table_set(r->headers_out, "Expires", p); + if (p != NULL) + table_set(r->headers_out, "Expires", p); } pclosef(r->pool, cachefp->fd); Explain0("Use local copy, cached file hasn't changed"); @@ -576,7 +557,8 @@ } bsetopt(r->connection->client, BO_BYTECT, &zero); r->sent_bodyct = 1; - if (!r->header_only) proxy_send_fb (cachefp, r, NULL, NULL); + if (!r->header_only) + proxy_send_fb(cachefp, r, NULL, NULL); pclosef(r->pool, cachefp->fd); return OK; } @@ -585,21 +567,19 @@ * request, then add an If-Modified-Since */ - if (cachefp != NULL && c->lmod != BAD_DATE && !r->header_only) - { + if (cachefp != NULL && c->lmod != BAD_DATE && !r->header_only) { /* * use the later of the one from the request and the last-modified date * from the cache */ - if (c->ims == BAD_DATE || c->ims < c->lmod) - { + if (c->ims == BAD_DATE || c->ims < c->lmod) { struct hdr_entry *q; q = proxy_get_header(c->hdrs, "Last-Modified"); if (q != NULL && q->value != NULL) table_set(r->headers_in, "If-Modified-Since", - (char *)q->value); + (char *) q->value); } } c->fp = cachefp; @@ -621,11 +601,10 @@ * from the cache, maybe updating the header line * otherwise, delete the old cached file and open a new temporary file */ -int -proxy_cache_update(struct cache_req *c, array_header *resp_hdrs, - const int is_HTTP1, int nocache) +int proxy_cache_update(struct cache_req *c, array_header *resp_hdrs, + const int is_HTTP1, int nocache) { - request_rec *r=c->req; + request_rec *r = c->req; char *p; int i; struct hdr_entry *expire, *dates, *lmods, *clen; @@ -633,8 +612,8 @@ char buff[46]; void *sconf = r->server->module_config; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); - const long int zero=0L; + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + const long int zero = 0L; c->tempfile = NULL; @@ -643,23 +622,24 @@ * read it */ expire = proxy_get_header(resp_hdrs, "Expires"); - if (expire != NULL) expc = parseHTTPdate(expire->value); - else expc = BAD_DATE; + if (expire != NULL) + expc = parseHTTPdate(expire->value); + else + expc = BAD_DATE; /* * read the last-modified date; if the date is bad, then delete it */ lmods = proxy_get_header(resp_hdrs, "Last-Modified"); - if (lmods != NULL) - { + if (lmods != NULL) { lmod = parseHTTPdate(lmods->value); - if (lmod == BAD_DATE) - { + if (lmod == BAD_DATE) { /* kill last modified date */ lmods->value = NULL; lmods = NULL; } - } else + } + else lmod = BAD_DATE; /* @@ -677,18 +657,16 @@ (r->status == 200 && lmods == NULL && is_HTTP1) || r->header_only || table_get(r->headers_in, "Authorization") != NULL || - nocache) - { - Explain1("Response is not cacheable, unlinking %s",c->filename); + nocache) { + Explain1("Response is not cacheable, unlinking %s", c->filename); /* close the file */ - if (c->fp != NULL) - { + if (c->fp != NULL) { pclosef(r->pool, c->fp->fd); c->fp = NULL; } /* delete the previously cached file */ unlink(c->filename); - return DECLINED; /* send data to client but not cache */ + return DECLINED; /* send data to client but not cache */ } /* otherwise, we are going to cache the response */ @@ -696,13 +674,14 @@ * Read the date. Generate one if one is not supplied */ dates = proxy_get_header(resp_hdrs, "Date"); - if (dates != NULL) date = parseHTTPdate(dates->value); - else date = BAD_DATE; - + if (dates != NULL) + date = parseHTTPdate(dates->value); + else + date = BAD_DATE; + now = time(NULL); - if (date == BAD_DATE) /* No, or bad date */ - { + if (date == BAD_DATE) { /* No, or bad date */ /* no date header! */ /* add one; N.B. use the time _now_ rather than when we were checking the cache */ @@ -721,17 +700,16 @@ Explain0("Last modified is in the future, replacing with now"); } /* if the response did not contain the header, then use the cached version */ - if (lmod == BAD_DATE && c->fp != NULL) - { + if (lmod == BAD_DATE && c->fp != NULL) { lmod = c->lmod; Explain0("Reusing cached last modified"); - } + } /* we now need to calculate the expire data for the object. */ - if (expire == NULL && c->fp != NULL) /* no expiry data sent in response */ - { + if (expire == NULL && c->fp != NULL) { /* no expiry data sent in response */ expire = proxy_get_header(c->hdrs, "Expires"); - if (expire != NULL) expc = parseHTTPdate(expire->value); + if (expire != NULL) + expc = parseHTTPdate(expire->value); } /* so we now have the expiry date */ /* if no expiry date then @@ -740,60 +718,59 @@ * else * expire date = now + defaultexpire */ - Explain1("Expiry date is %ld",expc); - if (expc == BAD_DATE) - { - if (lmod != BAD_DATE) - { - double x = (double)(date - lmod)*conf->cache.lmfactor; - double maxex=conf->cache.maxexpire; - if (x > maxex) x = maxex; - expc = abs(now) + (int)x; - } else + Explain1("Expiry date is %ld", expc); + if (expc == BAD_DATE) { + if (lmod != BAD_DATE) { + double x = (double) (date - lmod) * conf->cache.lmfactor; + double maxex = conf->cache.maxexpire; + if (x > maxex) + x = maxex; + expc = abs(now) + (int) x; + } + else expc = abs(now) + conf->cache.defaultexpire; - Explain1("Expiry date calculated %ld",expc); + Explain1("Expiry date calculated %ld", expc); } /* get the content-length header */ clen = proxy_get_header(c->hdrs, "Content-Length"); - if (clen == NULL) c->len = -1; - else c->len = atoi(clen->value); + if (clen == NULL) + c->len = -1; + else + c->len = atoi(clen->value); proxy_sec2hex(date, buff); buff[8] = ' '; - proxy_sec2hex(lmod, buff+9); + proxy_sec2hex(lmod, buff + 9); buff[17] = ' '; - proxy_sec2hex(expc, buff+18); + proxy_sec2hex(expc, buff + 18); buff[26] = ' '; - proxy_sec2hex(c->version++, buff+27); + proxy_sec2hex(c->version++, buff + 27); buff[35] = ' '; - proxy_sec2hex(c->len, buff+36); + proxy_sec2hex(c->len, buff + 36); buff[44] = '\n'; buff[45] = '\0'; /* if file not modified */ - if (r->status == 304) - { - if (c->ims != BAD_DATE && lmod != BAD_DATE && lmod <= c->ims) - { + if (r->status == 304) { + if (c->ims != BAD_DATE && lmod != BAD_DATE && lmod <= c->ims) { /* set any changed headers somehow */ /* update dates and version, but not content-length */ - if (lmod != c->lmod || expc != c->expire || date != c->date) - { - off_t curpos=lseek(c->fp->fd, 0, SEEK_SET); + if (lmod != c->lmod || expc != c->expire || date != c->date) { + off_t curpos = lseek(c->fp->fd, 0, SEEK_SET); if (curpos == -1) proxy_log_uerror("lseek", c->filename, - "proxy: error seeking on cache file",r->server); + "proxy: error seeking on cache file", r->server); else if (write(c->fp->fd, buff, 35) == -1) proxy_log_uerror("write", c->filename, - "proxy: error updating cache file", r->server); + "proxy: error updating cache file", r->server); } pclosef(r->pool, c->fp->fd); Explain0("Remote document not modified, use local copy"); /* CHECKME: Is this right? Shouldn't we check IMS again here? */ return USE_LOCAL_COPY; - } else - { + } + else { /* return the whole document */ Explain0("Remote document updated, sending"); r->status_line = strchr(c->resp_line, ' ') + 1; @@ -805,63 +782,60 @@ } bsetopt(r->connection->client, BO_BYTECT, &zero); r->sent_bodyct = 1; - if (!r->header_only) proxy_send_fb (c->fp, r, NULL, NULL); + if (!r->header_only) + proxy_send_fb(c->fp, r, NULL, NULL); /* set any changed headers somehow */ /* update dates and version, but not content-length */ - if (lmod != c->lmod || expc != c->expire || date != c->date) - { - off_t curpos=lseek(c->fp->fd, 0, SEEK_SET); + if (lmod != c->lmod || expc != c->expire || date != c->date) { + off_t curpos = lseek(c->fp->fd, 0, SEEK_SET); if (curpos == -1) proxy_log_uerror("lseek", c->filename, - "proxy: error seeking on cache file",r->server); + "proxy: error seeking on cache file", r->server); else if (write(c->fp->fd, buff, 35) == -1) proxy_log_uerror("write", c->filename, - "proxy: error updating cache file", r->server); + "proxy: error updating cache file", r->server); } pclosef(r->pool, c->fp->fd); return OK; } } -/* new or modified file */ - if (c->fp != NULL) - { +/* new or modified file */ + if (c->fp != NULL) { pclosef(r->pool, c->fp->fd); c->fp->fd = -1; } c->version = 0; - proxy_sec2hex(0, buff+27); + proxy_sec2hex(0, buff + 27); buff[35] = ' '; /* open temporary file */ #define TMPFILESTR "/tmpXXXXXX" if (conf->cache.root == NULL) - return DECLINED; - c->tempfile=palloc(r->pool,strlen(conf->cache.root)+sizeof(TMPFILESTR)); - strcpy(c->tempfile,conf->cache.root); - strcat(c->tempfile,TMPFILESTR); + return DECLINED; + c->tempfile = palloc(r->pool, strlen(conf->cache.root) + sizeof(TMPFILESTR)); + strcpy(c->tempfile, conf->cache.root); + strcat(c->tempfile, TMPFILESTR); #undef TMPFILESTR p = mktemp(c->tempfile); if (p == NULL) - return DECLINED; + return DECLINED; - Explain1("Create temporary file %s",c->tempfile); + Explain1("Create temporary file %s", c->tempfile); i = open(c->tempfile, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0622); - if (i == -1) - { + if (i == -1) { proxy_log_uerror("open", c->tempfile, - "proxy: error creating cache file", r->server); + "proxy: error creating cache file", r->server); return DECLINED; } note_cleanups_for_fd(r->pool, i); c->fp = bcreate(r->pool, B_WR); bpushfd(c->fp, -1, i); - if (bvputs(c->fp, buff, "X-URL: ", c->url, "\n", NULL) == -1) - { + if (bvputs(c->fp, buff, "X-URL: ", c->url, "\n", NULL) == -1) { proxy_log_uerror("write", c->tempfile, - "proxy: error writing cache file", r->server); + "proxy: error writing cache file", r->server); pclosef(r->pool, c->fp->fd); unlink(c->tempfile); c->fp = NULL; @@ -869,32 +843,30 @@ return DECLINED; } -void -proxy_cache_tidy(struct cache_req *c) +void proxy_cache_tidy(struct cache_req *c) { - server_rec *s=c->req->server; + server_rec *s = c->req->server; long int bc; - if (c->fp == NULL) return; + if (c->fp == NULL) + return; bgetopt(c->req->connection->client, BO_BYTECT, &bc); - if (c->len != -1) - { + if (c->len != -1) { /* file lengths don't match; don't cache it */ - if (bc != c->len) - { - pclosef(c->req->pool, c->fp->fd); /* no need to flush */ + if (bc != c->len) { + pclosef(c->req->pool, c->fp->fd); /* no need to flush */ unlink(c->tempfile); return; } - } else - if (c->req->connection->aborted) { - pclosef(c->req->pool, c->fp->fd); /* no need to flush */ - unlink(c->tempfile); - return; - } else - { + } + else if (c->req->connection->aborted) { + pclosef(c->req->pool, c->fp->fd); /* no need to flush */ + unlink(c->tempfile); + return; + } + else { /* update content-length of file */ char buff[9]; off_t curpos; @@ -905,72 +877,67 @@ curpos = lseek(c->fp->fd, 36, SEEK_SET); if (curpos == -1) proxy_log_uerror("lseek", c->tempfile, - "proxy: error seeking on cache file", s); + "proxy: error seeking on cache file", s); else if (write(c->fp->fd, buff, 8) == -1) proxy_log_uerror("write", c->tempfile, - "proxy: error updating cache file", s); + "proxy: error updating cache file", s); } - if (bflush(c->fp) == -1) - { + if (bflush(c->fp) == -1) { proxy_log_uerror("write", c->tempfile, - "proxy: error writing to cache file", s); + "proxy: error writing to cache file", s); pclosef(c->req->pool, c->fp->fd); unlink(c->tempfile); return; } - if (pclosef(c->req->pool, c->fp->fd) == -1) - { + if (pclosef(c->req->pool, c->fp->fd) == -1) { proxy_log_uerror("close", c->tempfile, - "proxy: error closing cache file", s); + "proxy: error closing cache file", s); unlink(c->tempfile); return; } - if (unlink(c->filename) == -1 && errno != ENOENT) - { + if (unlink(c->filename) == -1 && errno != ENOENT) { proxy_log_uerror("unlink", c->filename, - "proxy: error deleting old cache file", s); - } else - { + "proxy: error deleting old cache file", s); + } + else { char *p; - proxy_server_conf *conf= - (proxy_server_conf *)get_module_config(s->module_config,&proxy_module); + proxy_server_conf *conf = + (proxy_server_conf *) get_module_config(s->module_config, &proxy_module); - for(p=c->filename+strlen(conf->cache.root)+1 ; ; ) - { - p=strchr(p,'/'); - if(!p) + for (p = c->filename + strlen(conf->cache.root) + 1;;) { + p = strchr(p, '/'); + if (!p) break; - *p='\0'; + *p = '\0'; #ifdef WIN32 - if(mkdir(c->filename) < 0 && errno != EEXIST) + if (mkdir(c->filename) < 0 && errno != EEXIST) #else - if(mkdir(c->filename,S_IREAD|S_IWRITE|S_IEXEC) < 0 && errno != EEXIST) + if (mkdir(c->filename, S_IREAD | S_IWRITE | S_IEXEC) < 0 && errno != EEXIST) #endif /* WIN32 */ - proxy_log_uerror("mkdir",c->filename, - "proxy: error creating cache directory",s); - *p='/'; + proxy_log_uerror("mkdir", c->filename, + "proxy: error creating cache directory", s); + *p = '/'; ++p; - } + } #if defined(__EMX__) || defined(WIN32) - /* Under OS/2 use rename. */ - if (rename(c->tempfile, c->filename) == -1) - proxy_log_uerror("rename", c->filename, - "proxy: error renaming cache file", s); -} -#else + /* Under OS/2 use rename. */ + if (rename(c->tempfile, c->filename) == -1) + proxy_log_uerror("rename", c->filename, + "proxy: error renaming cache file", s); + } +#else if (link(c->tempfile, c->filename) == -1) proxy_log_uerror("link", c->filename, - "proxy: error linking cache file", s); - } + "proxy: error linking cache file", s); + } if (unlink(c->tempfile) == -1) proxy_log_uerror("unlink", c->tempfile, - "proxy: error deleting temp file",s); + "proxy: error deleting temp file", s); #endif } - 1.18 +94 -100 apachen/src/modules/proxy/proxy_connect.c Index: proxy_connect.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_connect.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- proxy_connect.c 1997/09/06 14:16:56 1.17 +++ proxy_connect.c 1997/09/16 00:59:39 1.18 @@ -57,7 +57,7 @@ #include "http_main.h" #ifdef HAVE_BSTRING_H -#include <bstring.h> /* for IRIX, FD_SET calls bzero() */ +#include <bstring.h> /* for IRIX, FD_SET calls bzero() */ #endif DEF_Explain @@ -84,61 +84,57 @@ * FIXME: this doesn't log the number of bytes sent, but * that may be okay, since the data is supposed to * be transparent. In fact, this doesn't log at all - * yet. 8^) + * yet. 8^) * FIXME: doesn't check any headers initally sent from the * client. * FIXME: should allow authentication, but hopefully the * generic proxy authentication is good enough. * FIXME: no check for r->assbackwards, whatever that is. - */ - -int -proxy_connect_handler(request_rec *r, struct cache_req *c, char *url, - const char *proxyhost, int proxyport) + */ + +int proxy_connect_handler(request_rec *r, struct cache_req *c, char *url, + const char *proxyhost, int proxyport) { struct sockaddr_in server; struct in_addr destaddr; struct hostent server_hp; const char *host, *err; char *p; - int port, sock; + int port, sock; char buffer[HUGE_STRING_LEN]; - int nbytes, i, j; + int nbytes, i, j; fd_set fds; void *sconf = r->server->module_config; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); - struct noproxy_entry *npent=(struct noproxy_entry *)conf->noproxies->elts; + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; memset(&server, '\0', sizeof(server)); - server.sin_family=AF_INET; - + server.sin_family = AF_INET; + /* Break the URL into host:port pairs */ host = url; p = strchr(url, ':'); - if (p==NULL) + if (p == NULL) port = DEFAULT_HTTPS_PORT; - else - { - port = atoi(p+1); - *p='\0'; + else { + port = atoi(p + 1); + *p = '\0'; } - + /* check if ProxyBlock directive on this host */ destaddr.s_addr = ap_inet_addr(host); - for (i=0; i < conf->noproxies->nelts; i++) - { - if ((npent[i].name != NULL && strstr(host, npent[i].name) != NULL) - || destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*') - return proxyerror(r, "Connect to remote machine blocked"); + for (i = 0; i < conf->noproxies->nelts; i++) { + if ((npent[i].name != NULL && strstr(host, npent[i].name) != NULL) + || destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*') + return proxyerror(r, "Connect to remote machine blocked"); } - switch (port) - { + switch (port) { case DEFAULT_HTTPS_PORT: - case DEFAULT_SNEWS_PORT: + case DEFAULT_SNEWS_PORT: break; default: return HTTP_SERVICE_UNAVAILABLE; @@ -146,38 +142,38 @@ if (proxyhost) { Explain2("CONNECT to remote proxy %s on port %d", proxyhost, proxyport); - } else { - Explain2("CONNECT to %s on port %d", host, port); } - + else { + Explain2("CONNECT to %s on port %d", host, port); + } + server.sin_port = (proxyport ? htons(proxyport) : htons(port)); err = proxy_host2addr(proxyhost ? proxyhost : host, &server_hp); if (err != NULL) - return proxyerror(r, err); /* give up */ - - sock = psocket(r->pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock == -1) - { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, + return proxyerror(r, err); /* give up */ + + sock = psocket(r->pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sock == -1) { + aplog_error(APLOG_MARK, APLOG_ERR, r->server, "proxy: error creating socket"); - return SERVER_ERROR; - } - + 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++; - } + 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) { pclosesocket(r->pool, sock); - return proxyerror(r, "Could not connect to remote machine"); + return proxyerror(r, "Could not connect to remote machine"); } - + /* If we are connecting through a remote proxy, we need to pass * the CONNECT request on to it. */ @@ -187,67 +183,65 @@ * a HTTP/1.0 request to keep things simple. */ Explain0("Sending the CONNECT request to the remote proxy"); - ap_snprintf(buffer, sizeof(buffer), "CONNECT %s HTTP/1.0\015\012", - r->uri); + ap_snprintf(buffer, sizeof(buffer), "CONNECT %s HTTP/1.0\015\012", + r->uri); write(sock, buffer, strlen(buffer)); ap_snprintf(buffer, sizeof(buffer), - "Proxy-agent: %s\015\012\015\012", SERVER_VERSION); + "Proxy-agent: %s\015\012\015\012", SERVER_VERSION); write(sock, buffer, strlen(buffer)); - } else { + } + else { Explain0("Returning 200 OK Status"); rvputs(r, "HTTP/1.0 200 Connection established\015\012", NULL); rvputs(r, "Proxy-agent: ", SERVER_VERSION, "\015\012\015\012", NULL); bflush(r->connection->client); } - while (1) /* Infinite loop until error (one side closes the connection) */ - { - FD_ZERO(&fds); - FD_SET(sock, &fds); - FD_SET(r->connection->client->fd, &fds); - - Explain0("Going to sleep (select)"); - i = ap_select((r->connection->client->fd > sock ? - r->connection->client->fd+1 : - sock+1), &fds, NULL, NULL, NULL); - Explain1("Woke from select(), i=%d",i); - - if (i) - { - if (FD_ISSET(sock, &fds)) - { - Explain0("sock was set"); - if((nbytes=read(sock,buffer,HUGE_STRING_LEN))!=0) - { - if (nbytes==-1) - break; - if (write(r->connection->client->fd, buffer, nbytes)==EOF) - break; - Explain1("Wrote %d bytes to client", nbytes); - } - else break; - } - else if (FD_ISSET(r->connection->client->fd, &fds)) - { - Explain0("client->fd was set"); - if((nbytes=read(r->connection->client->fd,buffer, - HUGE_STRING_LEN))!=0) - { - if (nbytes==-1) - break; - if (write(sock,buffer,nbytes)==EOF) - break; - Explain1("Wrote %d bytes to server", nbytes); - } - else break; - } - else break; /* Must be done waiting */ - } - else break; + while (1) { /* Infinite loop until error (one side closes the connection) */ + FD_ZERO(&fds); + FD_SET(sock, &fds); + FD_SET(r->connection->client->fd, &fds); + + Explain0("Going to sleep (select)"); + i = ap_select((r->connection->client->fd > sock ? + r->connection->client->fd + 1 : + sock + 1), &fds, NULL, NULL, NULL); + Explain1("Woke from select(), i=%d", i); + + if (i) { + if (FD_ISSET(sock, &fds)) { + Explain0("sock was set"); + if ((nbytes = read(sock, buffer, HUGE_STRING_LEN)) != 0) { + if (nbytes == -1) + break; + if (write(r->connection->client->fd, buffer, nbytes) == EOF) + break; + Explain1("Wrote %d bytes to client", nbytes); + } + else + break; + } + else if (FD_ISSET(r->connection->client->fd, &fds)) { + Explain0("client->fd was set"); + if ((nbytes = read(r->connection->client->fd, buffer, + HUGE_STRING_LEN)) != 0) { + if (nbytes == -1) + break; + if (write(sock, buffer, nbytes) == EOF) + break; + Explain1("Wrote %d bytes to server", nbytes); + } + else + break; + } + else + break; /* Must be done waiting */ + } + else + break; } - pclosesocket(r->pool,sock); - - return OK; -} + pclosesocket(r->pool, sock); + return OK; +} 1.38 +415 -424 apachen/src/modules/proxy/proxy_ftp.c Index: proxy_ftp.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_ftp.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- proxy_ftp.c 1997/09/06 14:16:57 1.37 +++ proxy_ftp.c 1997/09/16 00:59:40 1.38 @@ -61,19 +61,17 @@ /* * Decodes a '%' escaped string, and returns the number of characters */ -static int -decodeenc(char *x) +static int decodeenc(char *x) { int i, j, ch; - if (x[0] == '\0') return 0; /* special case for no characters */ - for (i=0, j=0; x[i] != '\0'; i++, j++) - { + if (x[0] == '\0') + return 0; /* special case for no characters */ + for (i = 0, j = 0; x[i] != '\0'; i++, j++) { /* decode it if not already done */ ch = x[i]; - if ( ch == '%' && isxdigit(x[i+1]) && isxdigit(x[i+2])) - { - ch = proxy_hex2c(&x[i+1]); + if (ch == '%' && isxdigit(x[i + 1]) && isxdigit(x[i + 2])) { + ch = proxy_hex2c(&x[i + 1]); i += 2; } x[j] = ch; @@ -86,20 +84,18 @@ * checks an encoded ftp string for bad characters, namely, CR, LF or * non-ascii character */ -static int -ftp_check_string(const char *x) +static int ftp_check_string(const char *x) { int i, ch; - for (i=0; x[i] != '\0'; i++) - { + for (i = 0; x[i] != '\0'; i++) { ch = x[i]; - if ( ch == '%' && isxdigit(x[i+1]) && isxdigit(x[i+2])) - { - ch = proxy_hex2c(&x[i+1]); + if (ch == '%' && isxdigit(x[i + 1]) && isxdigit(x[i + 2])) { + ch = proxy_hex2c(&x[i + 1]); i += 2; } - if (ch == '\015' || ch == '\012' || (ch & 0x80)) return 0; + if (ch == '\015' || ch == '\012' || (ch & 0x80)) + return 0; } return 1; } @@ -107,19 +103,21 @@ /* * Canonicalise ftp URLs. */ -int -proxy_ftp_canon(request_rec *r, char *url) +int proxy_ftp_canon(request_rec *r, char *url) { char *user, *password, *host, *path, *parms, *p, sport[7]; - pool *pool=r->pool; + pool *pool = r->pool; const char *err; int port; port = DEFAULT_FTP_PORT; err = proxy_canon_netloc(pool, &url, &user, &password, &host, &port); - if (err) return BAD_REQUEST; - if (user != NULL && !ftp_check_string(user)) return BAD_REQUEST; - if (password != NULL && !ftp_check_string(password)) return BAD_REQUEST; + if (err) + return BAD_REQUEST; + if (user != NULL && !ftp_check_string(user)) + return BAD_REQUEST; + if (password != NULL && !ftp_check_string(password)) + return BAD_REQUEST; /* now parse path/parameters args, according to rfc1738 */ /* N.B. if this isn't a true proxy request, then the URL path @@ -128,30 +126,32 @@ * path. */ p = strchr(url, ';'); - if (p != NULL) - { + if (p != NULL) { *(p++) = '\0'; parms = proxy_canonenc(pool, p, strlen(p), enc_parm, r->proxyreq); - if (parms == NULL) return BAD_REQUEST; - } else + if (parms == NULL) + return BAD_REQUEST; + } + else parms = ""; path = proxy_canonenc(pool, url, strlen(url), enc_path, r->proxyreq); - if (path == NULL) return BAD_REQUEST; - if (!ftp_check_string(path)) return BAD_REQUEST; + if (path == NULL) + return BAD_REQUEST; + if (!ftp_check_string(path)) + return BAD_REQUEST; - if (!r->proxyreq && r->args != NULL) - { - if (p != NULL) - { + if (!r->proxyreq && r->args != NULL) { + if (p != NULL) { p = proxy_canonenc(pool, r->args, strlen(r->args), enc_parm, 1); - if (p == NULL) return BAD_REQUEST; + if (p == NULL) + return BAD_REQUEST; parms = pstrcat(pool, parms, "?", p, NULL); } - else - { + else { p = proxy_canonenc(pool, r->args, strlen(r->args), enc_fpath, 1); - if (p == NULL) return BAD_REQUEST; + if (p == NULL) + return BAD_REQUEST; path = pstrcat(pool, path, "?", p, NULL); } r->args = NULL; @@ -159,14 +159,16 @@ /* now, rebuild URL */ - if (port != DEFAULT_FTP_PORT) ap_snprintf(sport, sizeof(sport), ":%d", port); - else sport[0] = '\0'; + if (port != DEFAULT_FTP_PORT) + ap_snprintf(sport, sizeof(sport), ":%d", port); + else + sport[0] = '\0'; r->filename = pstrcat(pool, "proxy:ftp://", (user != NULL) ? user : "", - (password != NULL) ? ":" : "", - (password != NULL) ? password : "", - (user != NULL) ? "@" : "", host, sport, "/", path, - (parms[0] != '\0') ? ";" : "", parms, NULL); + (password != NULL) ? ":" : "", + (password != NULL) ? password : "", + (user != NULL) ? "@" : "", host, sport, "/", path, + (parms[0] != '\0') ? ";" : "", parms, NULL); return OK; } @@ -175,14 +177,14 @@ * Returns the ftp status code; * or -1 on I/O error, 0 on data error */ -static int -ftp_getrc(BUFF *f) +static int ftp_getrc(BUFF *f) { int i, len, status; char linebuff[100], buff[5]; len = bgets(linebuff, 100, f); - if (len == -1) return -1; + if (len == -1) + return -1; /* check format */ if (len < 5 || !isdigit(linebuff[0]) || !isdigit(linebuff[1]) || !isdigit(linebuff[2]) || (linebuff[3] != ' ' && linebuff[3] != '-')) @@ -190,22 +192,19 @@ else status = 100 * linebuff[0] + 10 * linebuff[1] + linebuff[2] - 111 * '0'; - if (linebuff[len-1] != '\n') - { + if (linebuff[len - 1] != '\n') { i = bskiplf(f); } -/* skip continuation lines */ - if (linebuff[3] == '-') - { +/* skip continuation lines */ + if (linebuff[3] == '-') { memcpy(buff, linebuff, 3); buff[3] = ' '; - do - { + do { len = bgets(linebuff, 100, f); - if (len == -1) return -1; - if (linebuff[len-1] != '\n') - { + if (len == -1) + return -1; + if (linebuff[len - 1] != '\n') { i = bskiplf(f); } } while (memcmp(linebuff, buff, 4) != 0); @@ -215,15 +214,15 @@ } static char * -encode_space(request_rec *r, char *path) + encode_space(request_rec *r, char *path) { - pool *pool=r->pool; + pool *pool = r->pool; char *newpath; int i, j, len; len = strlen(path); newpath = palloc(pool, 3 * len + 1); - for (i=0, j=0; i < len; i++, j++) { + for (i = 0, j = 0; i < len; i++, j++) { if (path[i] != ' ') newpath[j] = path[i]; else { @@ -235,8 +234,7 @@ return newpath; } -static long int -send_dir(BUFF *f, request_rec *r, BUFF *f2, struct cache_req *c, char *url) +static long int send_dir(BUFF *f, request_rec *r, BUFF *f2, struct cache_req *c, char *url) { char buf[IOBUFSIZE]; char buf2[IOBUFSIZE]; @@ -252,8 +250,7 @@ conn_rec *con = r->connection; tempurl = pstrdup(r->pool, url); - if ((n = strcspn(tempurl, "@")) != strlen(tempurl)) /* hide user/passwd */ - { + if ((n = strcspn(tempurl, "@")) != strlen(tempurl)) { /* hide user/passwd */ memmove(tempurl + (n - 5), tempurl, 6); tempurl += n - 5; /* leave room for ftp:// */ } @@ -261,124 +258,131 @@ n = decodeenc(tempurl); ap_snprintf(buf, sizeof(buf), "<HTML><HEAD><TITLE>%s</TITLE></HEAD><BODY><H1>Directory %s</H1><HR><PRE>", tempurl, tempurl); bwrite(con->client, buf, strlen(buf)); - if (f2 != NULL) bwrite(f2, buf, strlen(buf)); - total_bytes_sent=strlen(buf); - while(!con->aborted) - { - n = bgets(buf, IOBUFSIZE, f); - if (n == -1) /* input error */ - { - if (f2 != NULL) f2 = proxy_cache_error(c); - break; - } - if (n == 0) break; /* EOF */ - if(buf[0]=='l') - { - char *link; - - link=strstr(buf, " -> "); - filename=link; - do filename--; while (filename[0]!=' '); - *(filename++)=0; - *(link++)=0; - ap_snprintf(urlptr, sizeof(urlptr), "%s%s%s",url,(url[strlen(url)-1]=='/' ? "" : "/"), filename); - ap_snprintf(buf2, sizeof(urlptr), "%s <A HREF=\"%s\">%s %s</A>\015\012", buf, urlptr, filename, link); - strncpy(buf, buf2, sizeof(buf)-1); - buf[sizeof(buf)-1] = '\0'; - n=strlen(buf); - } - else if(buf[0]=='d' || buf[0]=='-' || buf[0]=='l' || isdigit(buf[0])) - { - if(isdigit(buf[0])) { /* handle DOS dir */ - searchptr = strchr(buf, '<'); - if(searchptr != NULL) + if (f2 != NULL) + bwrite(f2, buf, strlen(buf)); + total_bytes_sent = strlen(buf); + while (!con->aborted) { + n = bgets(buf, IOBUFSIZE, f); + if (n == -1) { /* input error */ + if (f2 != NULL) + f2 = proxy_cache_error(c); + break; + } + if (n == 0) + break; /* EOF */ + if (buf[0] == 'l') { + char *link; + + link = strstr(buf, " -> "); + filename = link; + do + filename--; + while (filename[0] != ' '); + *(filename++) = 0; + *(link++) = 0; + ap_snprintf(urlptr, sizeof(urlptr), "%s%s%s", url, (url[strlen(url) - 1] == '/' ? "" : "/"), filename); + ap_snprintf(buf2, sizeof(urlptr), "%s <A HREF=\"%s\">%s %s</A>\015\012", buf, urlptr, filename, link); + strncpy(buf, buf2, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; + n = strlen(buf); + } + else if (buf[0] == 'd' || buf[0] == '-' || buf[0] == 'l' || isdigit(buf[0])) { + if (isdigit(buf[0])) { /* handle DOS dir */ + searchptr = strchr(buf, '<'); + if (searchptr != NULL) *searchptr = '['; - searchptr = strchr(buf, '>'); - if(searchptr != NULL) + searchptr = strchr(buf, '>'); + if (searchptr != NULL) *searchptr = ']'; } - - filename=strrchr(buf, ' '); - *(filename++)=0; - filename[strlen(filename)-1]=0; - /* handle filenames with spaces in 'em */ - if(!strcmp(filename, ".") || !strcmp(filename, "..") || firstfile) { + filename = strrchr(buf, ' '); + *(filename++) = 0; + filename[strlen(filename) - 1] = 0; + + /* handle filenames with spaces in 'em */ + if (!strcmp(filename, ".") || !strcmp(filename, "..") || firstfile) { firstfile = 0; - searchidx = filename - buf; - } - else if (searchidx != 0 && buf[searchidx] != 0) { - *(--filename) = ' '; - buf[searchidx - 1] = 0; - filename = &buf[searchidx]; - } - - /* Special handling for '.' and '..' */ - if (!strcmp(filename, ".")) - { - ap_snprintf(urlptr, sizeof(urlptr), "%s",url); - ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\015\012", buf, urlptr, filename); - } - else if (!strcmp(filename, "..")) - { - char temp[200]; - char newpath[200]; - char *method, *host, *path, *newfile; - - strncpy(temp, url, sizeof(temp)-1); - temp[sizeof(temp)-1] = '\0'; - method=temp; - - host=strchr(method,':'); - if (host == NULL) host=""; - else *(host++)=0; - host++; host++; - - path=strchr(host,'/'); - if (path == NULL) path=""; - else *(path++)=0; - - strncpy(newpath, path, sizeof(newpath)-1); - newpath[sizeof(newpath)-1] = '\0'; - newfile=strrchr(newpath,'/'); - if (newfile) *(newfile)=0; - else newpath[0]=0; - - ap_snprintf(urlptr, sizeof(urlptr), "%s://%s/%s",method,host,newpath); - ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\015\012", buf, urlptr, filename); - } - else - { - ap_snprintf(urlptr, sizeof(urlptr), "%s%s%s",url,(url[strlen(url)-1]=='/' ? "" : "/"), filename); + searchidx = filename - buf; + } + else if (searchidx != 0 && buf[searchidx] != 0) { + *(--filename) = ' '; + buf[searchidx - 1] = 0; + filename = &buf[searchidx]; + } + + /* Special handling for '.' and '..' */ + if (!strcmp(filename, ".")) { + ap_snprintf(urlptr, sizeof(urlptr), "%s", url); + ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\015\012", buf, urlptr, filename); + } + else if (!strcmp(filename, "..")) { + char temp[200]; + char newpath[200]; + char *method, *host, *path, *newfile; + + strncpy(temp, url, sizeof(temp) - 1); + temp[sizeof(temp) - 1] = '\0'; + method = temp; + + host = strchr(method, ':'); + if (host == NULL) + host = ""; + else + *(host++) = 0; + host++; + host++; + + path = strchr(host, '/'); + if (path == NULL) + path = ""; + else + *(path++) = 0; + + strncpy(newpath, path, sizeof(newpath) - 1); + newpath[sizeof(newpath) - 1] = '\0'; + newfile = strrchr(newpath, '/'); + if (newfile) + *(newfile) = 0; + else + newpath[0] = 0; + + ap_snprintf(urlptr, sizeof(urlptr), "%s://%s/%s", method, host, newpath); + ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\015\012", buf, urlptr, filename); + } + else { + ap_snprintf(urlptr, sizeof(urlptr), "%s%s%s", url, (url[strlen(url) - 1] == '/' ? "" : "/"), filename); newurlptr = encode_space(r, urlptr); - ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\015\012", buf, newurlptr, filename); - } - strncpy(buf, buf2, sizeof(buf)); - buf[sizeof(buf)-1] = '\0'; - n=strlen(buf); - } + ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s</A>\015\012", buf, newurlptr, filename); + } + strncpy(buf, buf2, sizeof(buf)); + buf[sizeof(buf) - 1] = '\0'; + n = strlen(buf); + } - o=0; + o = 0; total_bytes_sent += n; if (f2 != NULL) - if (bwrite(f2, buf, n) != n) f2 = proxy_cache_error(c); - - while(n && !r->connection->aborted) { - w = bwrite(con->client, &buf[o], n); + if (bwrite(f2, buf, n) != n) + f2 = proxy_cache_error(c); + + while (n && !r->connection->aborted) { + w = bwrite(con->client, &buf[o], n); if (w <= 0) break; - reset_timeout(r); /* reset timeout after successfule write */ - n-=w; - o+=w; - } + reset_timeout(r); /* reset timeout after successfule write */ + n -= w; + o += w; + } } ap_snprintf(buf, sizeof(buf), "</PRE><HR><I><A HREF=\"http://www.apache.org\">%s</A></I></BODY></HTML>", SERVER_VERSION); bwrite(con->client, buf, strlen(buf)); - if (f2 != NULL) bwrite(f2, buf, strlen(buf)); - total_bytes_sent+=strlen(buf); + if (f2 != NULL) + bwrite(f2, buf, strlen(buf)); + total_bytes_sent += strlen(buf); bflush(con->client); - + return total_bytes_sent; } @@ -388,8 +392,7 @@ * Troy Morrison <[EMAIL PROTECTED]> * PASV added by Chuck */ -int -proxy_ftp_handler(request_rec *r, struct cache_req *c, char *url) +int proxy_ftp_handler(request_rec *r, struct cache_req *c, char *url) { char *host, *path, *p, *user, *password, *parms; const char *err; @@ -403,16 +406,16 @@ array_header *resp_hdrs; BUFF *f, *cache; BUFF *data = NULL; - pool *pool=r->pool; - int one=1; - const long int zero=0L; + pool *pool = r->pool; + int one = 1; + const long int zero = 0L; NET_SIZE_T clen; void *sconf = r->server->module_config; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); - struct noproxy_entry *npent=(struct noproxy_entry *)conf->noproxies->elts; - struct nocache_entry *ncent=(struct nocache_entry *)conf->nocaches->elts; + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; + struct nocache_entry *ncent = (struct nocache_entry *) conf->nocaches->elts; /* stuff for PASV mode */ unsigned int presult, h0, h1, h2, h3, p0, p1; @@ -422,10 +425,11 @@ int pasvmode = 0; char pasv[64]; char *pstr; - + /* we only support GET and HEAD */ - if (r->method_number != M_GET) return NOT_IMPLEMENTED; + if (r->method_number != M_GET) + return NOT_IMPLEMENTED; /* We break the URL into host, port, path-search */ @@ -440,23 +444,21 @@ user = password = NULL; nocache = 0; p = strchr(host, '@'); - if (p != NULL) - { + if (p != NULL) { (*p++) = '\0'; user = host; host = p; /* find password */ p = strchr(user, ':'); - if (p != NULL) - { + if (p != NULL) { *(p++) = '\0'; password = p; passlen = decodeenc(password); } userlen = decodeenc(user); - nocache = 1; /* don't cache when a username is supplied */ - } else - { + nocache = 1; /* don't cache when a username is supplied */ + } + else { user = "anonymous"; userlen = 9; @@ -465,8 +467,7 @@ } p = strchr(host, ':'); - if (p != NULL) - { + if (p != NULL) { *(p++) = '\0'; if (isdigit(*p)) port = atoi(p); @@ -474,55 +475,55 @@ /* check if ProxyBlock directive on this host */ destaddr.s_addr = ap_inet_addr(host); - for (i=0; i < conf->noproxies->nelts; i++) - { - if ((npent[i].name != NULL && strstr(host, npent[i].name) != NULL) - || destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*') - return proxyerror(r, "Connect to remote machine blocked"); + for (i = 0; i < conf->noproxies->nelts; i++) { + if ((npent[i].name != NULL && strstr(host, npent[i].name) != NULL) + || destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*') + return proxyerror(r, "Connect to remote machine blocked"); } - Explain2("FTP: connect to %s:%d",host,port); + Explain2("FTP: connect to %s:%d", host, port); parms = strchr(path, ';'); - if (parms != NULL) *(parms++) = '\0'; + if (parms != NULL) + *(parms++) = '\0'; 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 */ + if (err != NULL) + return proxyerror(r, err); /* give up */ sock = psocket(pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock == -1) - { + if (sock == -1) { proxy_log_uerror("socket", NULL, "proxy: error creating socket", - r->server); + r->server); return SERVER_ERROR; } if (conf->recv_buffer_size) { - if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, - (const char *) &conf->recv_buffer_size, sizeof(int)) - == -1) { - proxy_log_uerror("setsockopt", "(SO_RCVBUF)", - "Failed to set RecvBufferSize, using default", - r->server); - } + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, + (const char *) &conf->recv_buffer_size, sizeof(int)) + == -1) { + proxy_log_uerror("setsockopt", "(SO_RCVBUF)", + "Failed to set RecvBufferSize, using default", + r->server); + } } - if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, - sizeof(one)) == -1) - { + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &one, + sizeof(one)) == -1) { proxy_log_uerror("setsockopt", NULL, - "proxy: error setting reuseaddr option", r->server); + "proxy: error setting reuseaddr option", r->server); pclosesocket(pool, sock); return SERVER_ERROR; } #ifdef SINIX_D_RESOLVER_BUG - { struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list; + { + struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list; - for ( ; ip_addr->s_addr != 0; ++ip_addr) { + for (; ip_addr->s_addr != 0; ++ip_addr) { memcpy(&server.sin_addr, ip_addr, sizeof(struct in_addr)); i = proxy_doconnect(sock, &server, r); if (i == 0) @@ -532,16 +533,16 @@ #else 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++; - } + 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++; + } #endif if (i == -1) { - pclosesocket (pool, sock); + pclosesocket(pool, sock); return proxyerror(r, "Could not connect to remote machine"); } @@ -550,7 +551,7 @@ /* shouldn't we implement telnet control options here? */ /* possible results: 120, 220, 421 */ - hard_timeout ("proxy ftp", r); + hard_timeout("proxy ftp", r); i = ftp_getrc(f); Explain1("FTP: returned status %d", i); if (i == -1) { @@ -567,13 +568,13 @@ bputs("USER ", f); bwrite(f, user, userlen); bputs("\015\012", f); - bflush(f); /* capture any errors */ - Explain1("FTP: USER %s",user); - + bflush(f); /* capture any errors */ + Explain1("FTP: USER %s", user); + /* possible results; 230, 331, 332, 421, 500, 501, 530 */ /* states: 1 - error, 2 - success; 3 - send password, 4,5 fail */ i = ftp_getrc(f); - Explain1("FTP: returned status %d",i); + Explain1("FTP: returned status %d", i); if (i == -1) { kill_timeout(r); return proxyerror(r, "Error sending to remote server"); @@ -586,18 +587,18 @@ kill_timeout(r); return BAD_GATEWAY; } - - if (i == 331) /* send password */ - { - if (password == NULL) return FORBIDDEN; + + if (i == 331) { /* send password */ + if (password == NULL) + return FORBIDDEN; bputs("PASS ", f); bwrite(f, password, passlen); bputs("\015\012", f); bflush(f); - Explain1("FTP: PASS %s",password); + Explain1("FTP: PASS %s", password); /* possible results 202, 230, 332, 421, 500, 501, 503, 530 */ i = ftp_getrc(f); - Explain1("FTP: returned status %d",i); + Explain1("FTP: returned status %d", i); if (i == -1) { kill_timeout(r); return proxyerror(r, "Error sending to remote server"); @@ -614,28 +615,28 @@ kill_timeout(r); return BAD_GATEWAY; } - } + } /* set the directory */ /* this is what we must do if we don't know the OS type of the remote * machine */ - for (;;) - { + for (;;) { p = strchr(path, '/'); - if (p == NULL) break; + if (p == NULL) + break; *p = '\0'; len = decodeenc(path); bputs("CWD ", f); bwrite(f, path, len); bputs("\015\012", f); - bflush(f); - Explain1("FTP: CWD %s",path); + bflush(f); + Explain1("FTP: CWD %s", path); /* responses: 250, 421, 500, 501, 502, 530, 550 */ /* 1,3 error, 2 success, 4,5 failure */ i = ftp_getrc(f); - Explain1("FTP: returned status %d",i); + Explain1("FTP: returned status %d", i); if (i == -1) { kill_timeout(r); return proxyerror(r, "Error sending to remote server"); @@ -652,27 +653,27 @@ path = p + 1; } - if (parms != NULL && strncmp(parms, "type=", 5) == 0) - { + if (parms != NULL && strncmp(parms, "type=", 5) == 0) { parms += 5; if ((parms[0] != 'd' && parms[0] != 'a' && parms[0] != 'i') || - parms[1] != '\0') parms = ""; + parms[1] != '\0') + parms = ""; } - else parms = ""; + else + parms = ""; /* changed to make binary transfers the default */ - if (parms[0] != 'a') - { + if (parms[0] != 'a') { /* set type to image */ - /* TM - Added \015\012 to the end of TYPE I, otherwise it hangs the - connection */ + /* TM - Added \015\012 to the end of TYPE I, otherwise it hangs the + connection */ bputs("TYPE I\015\012", f); bflush(f); - Explain0("FTP: TYPE I"); + Explain0("FTP: TYPE I"); /* responses: 200, 421, 500, 501, 504, 530 */ i = ftp_getrc(f); - Explain1("FTP: returned status %d",i); + Explain1("FTP: returned status %d", i); if (i == -1) { kill_timeout(r); return proxyerror(r, "Error sending to remote server"); @@ -688,20 +689,19 @@ /* try to set up PASV data connection first */ dsock = psocket(pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (dsock == -1) - { + if (dsock == -1) { proxy_log_uerror("socket", NULL, "proxy: error creating PASV socket", - r->server); + r->server); bclose(f); kill_timeout(r); - return SERVER_ERROR; + return SERVER_ERROR; } if (conf->recv_buffer_size) { - if (setsockopt(dsock, SOL_SOCKET, SO_RCVBUF, - (const char *)&conf->recv_buffer_size, sizeof(int)) == -1) { + if (setsockopt(dsock, SOL_SOCKET, SO_RCVBUF, + (const char *) &conf->recv_buffer_size, sizeof(int)) == -1) { proxy_log_uerror("setsockopt", "(SO_RCVBUF)", - "Failed to set RecvBufferSize, using default", r->server); + "Failed to set RecvBufferSize, using default", r->server); } } @@ -709,22 +709,20 @@ bflush(f); Explain0("FTP: PASV command issued"); /* possible results: 227, 421, 500, 501, 502, 530 */ - i = bgets(pasv, sizeof(pasv), f); + i = bgets(pasv, sizeof(pasv), f); - if (i == -1) - { + if (i == -1) { proxy_log_uerror("command", NULL, "PASV: control connection is toast", - r->server); + r->server); pclosesocket(pool, dsock); bclose(f); kill_timeout(r); return SERVER_ERROR; - } else - { - pasv[i-1] = '\0'; + } + else { + pasv[i - 1] = '\0'; pstr = strtok(pasv, " "); /* separate result code */ - if (pstr != NULL) - { + if (pstr != NULL) { presult = atoi(pstr); pstr = strtok(NULL, "("); /* separate address & port params */ if (pstr != NULL) @@ -736,16 +734,15 @@ Explain1("FTP: returned status %d", presult); if (presult == 227 && pstr != NULL && (sscanf(pstr, - "%d,%d,%d,%d,%d,%d", &h3, &h2, &h1, &h0, &p1, &p0) == 6)) - { + "%d,%d,%d,%d,%d,%d", &h3, &h2, &h1, &h0, &p1, &p0) == 6)) { /* pardon the parens, but it makes gcc happy */ - paddr = (((((h3 << 8) + h2) << 8) + h1) << 8) + h0; - pport = (p1 << 8) + p0; + paddr = (((((h3 << 8) + h2) << 8) + h1) << 8) + h0; + pport = (p1 << 8) + p0; Explain5("FTP: contacting host %d.%d.%d.%d:%d", - h3, h2, h1, h0, pport); - data_addr.sin_family = AF_INET; - data_addr.sin_addr.s_addr = htonl(paddr); - data_addr.sin_port = htons(pport); + h3, h2, h1, h0, pport); + data_addr.sin_family = AF_INET; + data_addr.sin_addr.s_addr = htonl(paddr); + data_addr.sin_port = htons(pport); i = proxy_doconnect(dsock, &data_addr, r); if (i == -1) { @@ -753,58 +750,54 @@ return proxyerror(r, "Could not connect to remote machine"); } else { - pasvmode = 1; + pasvmode = 1; } - } else + } + else pclosesocket(pool, dsock); /* and try the regular way */ } - if (!pasvmode) /* set up data connection */ - { - clen = sizeof(struct sockaddr_in); - if (getsockname(sock, (struct sockaddr *)&server, &clen) < 0) - { + if (!pasvmode) { /* set up data connection */ + clen = sizeof(struct sockaddr_in); + if (getsockname(sock, (struct sockaddr *) &server, &clen) < 0) { proxy_log_uerror("getsockname", NULL, - "proxy: error getting socket address", r->server); + "proxy: error getting socket address", r->server); bclose(f); kill_timeout(r); return SERVER_ERROR; - } + } - dsock = psocket(pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (dsock == -1) - { + dsock = psocket(pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (dsock == -1) { proxy_log_uerror("socket", NULL, "proxy: error creating socket", - r->server); + r->server); bclose(f); kill_timeout(r); return SERVER_ERROR; - } + } - if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, - sizeof(one)) == -1) - { + if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *) &one, + sizeof(one)) == -1) { proxy_log_uerror("setsockopt", NULL, - "proxy: error setting reuseaddr option", r->server); + "proxy: error setting reuseaddr option", r->server); pclosesocket(pool, dsock); bclose(f); kill_timeout(r); return SERVER_ERROR; - } + } - if (bind(dsock, (struct sockaddr *)&server, - sizeof(struct sockaddr_in)) == -1) - { + if (bind(dsock, (struct sockaddr *) &server, + sizeof(struct sockaddr_in)) == -1) { char buff[22]; ap_snprintf(buff, sizeof(buff), "%s:%d", inet_ntoa(server.sin_addr), server.sin_port); proxy_log_uerror("bind", buff, - "proxy: error binding to ftp data socket", r->server); - bclose(f); - pclosesocket(pool, dsock); + "proxy: error binding to ftp data socket", r->server); + bclose(f); + pclosesocket(pool, dsock); return SERVER_ERROR; - } - listen(dsock, 2); /* only need a short queue */ + } + listen(dsock, 2); /* only need a short queue */ } /* set request */ @@ -812,58 +805,56 @@ /* TM - if len == 0 then it must be a directory (you can't RETR nothing) */ - if(len==0) - { - parms="d"; - } else - { - bputs("SIZE ", f); - bwrite(f, path, len); - bputs("\015\012", f); - bflush(f); - Explain1("FTP: SIZE %s",path); - i = ftp_getrc(f); - Explain1("FTP: returned status %d", i); - if (i != 500) /* Size command not recognized */ - { - if (i==550) /* Not a regular file */ - { - Explain0("FTP: SIZE shows this is a directory"); - parms="d"; - bputs("CWD ", f); - bwrite(f, path, len); - bputs("\015\012", f); - bflush(f); - Explain1("FTP: CWD %s",path); - i = ftp_getrc(f); - Explain1("FTP: returned status %d", i); - if (i == -1) { + if (len == 0) { + parms = "d"; + } + else { + bputs("SIZE ", f); + bwrite(f, path, len); + bputs("\015\012", f); + bflush(f); + Explain1("FTP: SIZE %s", path); + i = ftp_getrc(f); + Explain1("FTP: returned status %d", i); + if (i != 500) { /* Size command not recognized */ + if (i == 550) { /* Not a regular file */ + Explain0("FTP: SIZE shows this is a directory"); + parms = "d"; + bputs("CWD ", f); + bwrite(f, path, len); + bputs("\015\012", f); + bflush(f); + Explain1("FTP: CWD %s", path); + i = ftp_getrc(f); + Explain1("FTP: returned status %d", i); + if (i == -1) { kill_timeout(r); return proxyerror(r, "Error sending to remote server"); - } - if (i == 550) { + } + if (i == 550) { kill_timeout(r); return NOT_FOUND; - } - if (i != 250) { + } + if (i != 250) { kill_timeout(r); return BAD_GATEWAY; - } - path=""; len=0; - } - } + } + path = ""; + len = 0; + } + } } - - if (parms[0] == 'd') - { - if (len != 0) bputs("LIST ", f); - else bputs("LIST -lag", f); - Explain1("FTP: LIST %s",(len==0 ? "" : path)); + + if (parms[0] == 'd') { + if (len != 0) + bputs("LIST ", f); + else + bputs("LIST -lag", f); + Explain1("FTP: LIST %s", (len == 0 ? "" : path)); } - else - { - bputs("RETR ", f); - Explain1("FTP: RETR %s",path); + else { + bputs("RETR ", f); + Explain1("FTP: RETR %s", path); } bwrite(f, path, len); bputs("\015\012", f); @@ -871,44 +862,45 @@ /* RETR: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 530, 550 NLST: 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 502, 530 */ rc = ftp_getrc(f); - Explain1("FTP: returned status %d",rc); + Explain1("FTP: returned status %d", rc); if (rc == -1) { kill_timeout(r); return proxyerror(r, "Error sending to remote server"); } - if (rc == 550) - { - Explain0("FTP: RETR failed, trying LIST instead"); - parms="d"; - bputs("CWD ", f); - bwrite(f, path, len); - bputs("\015\012", f); - bflush(f); - Explain1("FTP: CWD %s", path); - rc = ftp_getrc(f); - Explain1("FTP: returned status %d", rc); - if (rc == -1) { - kill_timeout(r); - return proxyerror(r, "Error sending to remote server"); - } - if (rc == 550) { - kill_timeout(r); - return NOT_FOUND; - } - if (rc != 250) { - kill_timeout(r); - return BAD_GATEWAY; - } - - bputs("LIST -lag\015\012", f); - bflush(f); - Explain0("FTP: LIST -lag"); - rc = ftp_getrc(f); - Explain1("FTP: returned status %d", rc); - if (rc == -1) return proxyerror(r, "Error sending to remote server"); - } + if (rc == 550) { + Explain0("FTP: RETR failed, trying LIST instead"); + parms = "d"; + bputs("CWD ", f); + bwrite(f, path, len); + bputs("\015\012", f); + bflush(f); + Explain1("FTP: CWD %s", path); + rc = ftp_getrc(f); + Explain1("FTP: returned status %d", rc); + if (rc == -1) { + kill_timeout(r); + return proxyerror(r, "Error sending to remote server"); + } + if (rc == 550) { + kill_timeout(r); + return NOT_FOUND; + } + if (rc != 250) { + kill_timeout(r); + return BAD_GATEWAY; + } + + bputs("LIST -lag\015\012", f); + bflush(f); + Explain0("FTP: LIST -lag"); + rc = ftp_getrc(f); + Explain1("FTP: returned status %d", rc); + if (rc == -1) + return proxyerror(r, "Error sending to remote server"); + } kill_timeout(r); - if (rc != 125 && rc != 150 && rc != 226 && rc != 250) return BAD_GATEWAY; + if (rc != 125 && rc != 150 && rc != 226 && rc != 250) + return BAD_GATEWAY; r->status = 200; r->status_line = "200 OK"; @@ -916,64 +908,60 @@ resp_hdrs = make_array(pool, 2, sizeof(struct hdr_entry)); if (parms[0] == 'd') proxy_add_header(resp_hdrs, "Content-Type", "text/html", HDR_REP); - else - { - mime_find_ct(r); - if(r->content_type != NULL) - { - proxy_add_header(resp_hdrs, "Content-Type", r->content_type, - HDR_REP); - Explain1("FTP: Content-Type set to %s",r->content_type); - } else - { + else { + mime_find_ct(r); + if (r->content_type != NULL) { + proxy_add_header(resp_hdrs, "Content-Type", r->content_type, + HDR_REP); + Explain1("FTP: Content-Type set to %s", r->content_type); + } + else { proxy_add_header(resp_hdrs, "Content-Type", "text/plain", HDR_REP); } } -/* check if NoCache directive on this host */ - for (i=0; i < conf->nocaches->nelts; i++) - { - if ((ncent[i].name != NULL && strstr(host, ncent[i].name) != NULL) - || destaddr.s_addr == ncent[i].addr.s_addr || ncent[i].name[0] == '*') - nocache = 1; +/* check if NoCache directive on this host */ + for (i = 0; i < conf->nocaches->nelts; i++) { + if ((ncent[i].name != NULL && strstr(host, ncent[i].name) != NULL) + || destaddr.s_addr == ncent[i].addr.s_addr || ncent[i].name[0] == '*') + nocache = 1; } i = proxy_cache_update(c, resp_hdrs, 0, nocache); - if (i != DECLINED) - { + if (i != DECLINED) { pclosesocket(pool, dsock); bclose(f); return i; } cache = c->fp; - if (!pasvmode) /* wait for connection */ - { - hard_timeout ("proxy ftp data connect", r); - clen = sizeof(struct sockaddr_in); - do csd = accept(dsock, (struct sockaddr *)&server, &clen); - while (csd == -1 && errno == EINTR); - if (csd == -1) - { + if (!pasvmode) { /* wait for connection */ + hard_timeout("proxy ftp data connect", r); + clen = sizeof(struct sockaddr_in); + do + csd = accept(dsock, (struct sockaddr *) &server, &clen); + while (csd == -1 && errno == EINTR); + if (csd == -1) { proxy_log_uerror("accept", NULL, - "proxy: failed to accept data connection", r->server); + "proxy: failed to accept data connection", r->server); pclosesocket(pool, dsock); bclose(f); kill_timeout(r); proxy_cache_error(c); return BAD_GATEWAY; - } - note_cleanups_for_socket(pool, csd); - data = bcreate(pool, B_RDWR | B_SOCKET); - bpushfd(data, csd, -1); + } + note_cleanups_for_socket(pool, csd); + data = bcreate(pool, B_RDWR | B_SOCKET); + bpushfd(data, csd, -1); kill_timeout(r); - } else { - data = bcreate(pool, B_RDWR | B_SOCKET); + } + else { + data = bcreate(pool, B_RDWR | B_SOCKET); bpushfd(data, dsock, dsock); } - hard_timeout ("proxy receive", r); + hard_timeout("proxy receive", r); /* send response */ /* write status line */ if (!r->assbackwards) @@ -985,11 +973,11 @@ /* send headers */ len = resp_hdrs->nelts; - hdr = (struct hdr_entry *)resp_hdrs->elts; - for (i=0; i < len; i++) - { + hdr = (struct hdr_entry *) resp_hdrs->elts; + for (i = 0; i < len; i++) { if (hdr[i].field == NULL || hdr[i].value == NULL || - hdr[i].value[0] == '\0') continue; + hdr[i].value[0] == '\0') + continue; if (!r->assbackwards) rvputs(r, hdr[i].field, ": ", hdr[i].value, "\015\012", NULL); if (cache != NULL) @@ -998,32 +986,36 @@ cache = proxy_cache_error(c); } - if (!r->assbackwards) rputs("\015\012", r); + if (!r->assbackwards) + rputs("\015\012", r); if (cache != NULL) - if (bputs("\015\012", cache) == -1) cache = proxy_cache_error(c); + if (bputs("\015\012", cache) == -1) + cache = proxy_cache_error(c); bsetopt(r->connection->client, BO_BYTECT, &zero); r->sent_bodyct = 1; /* send body */ - if (!r->header_only) - { - if (parms[0] != 'd') proxy_send_fb(data, r, cache, c); - else send_dir(data, r, cache, c, url); + if (!r->header_only) { + if (parms[0] != 'd') + proxy_send_fb(data, r, cache, c); + else + send_dir(data, r, cache, c, url); - if (rc == 125 || rc == 150) rc = ftp_getrc(f); - if (rc != 226 && rc != 250) proxy_cache_error(c); + if (rc == 125 || rc == 150) + rc = ftp_getrc(f); + if (rc != 226 && rc != 250) + proxy_cache_error(c); } - else - { + else { /* abort the transfer */ bputs("ABOR\015\012", f); bflush(f); if (!pasvmode) - bclose(data); - Explain0("FTP: ABOR"); + bclose(data); + Explain0("FTP: ABOR"); /* responses: 225, 226, 421, 500, 501, 502 */ i = ftp_getrc(f); - Explain1("FTP: returned status %d",i); + Explain1("FTP: returned status %d", i); } kill_timeout(r); @@ -1033,7 +1025,7 @@ bputs("QUIT\015\012", f); bflush(f); Explain0("FTP: QUIT"); -/* responses: 221, 500 */ +/* responses: 221, 500 */ if (pasvmode) bclose(data); @@ -1043,4 +1035,3 @@ return OK; } - 1.33 +127 -128 apachen/src/modules/proxy/proxy_http.c Index: proxy_http.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_http.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- proxy_http.c 1997/09/06 14:16:57 1.32 +++ proxy_http.c 1997/09/16 00:59:40 1.33 @@ -63,8 +63,7 @@ * url is the URL starting with the first '/' * def_port is the default port for this scheme. */ -int -proxy_http_canon(request_rec *r, char *url, const char *scheme, int def_port) +int proxy_http_canon(request_rec *r, char *url, const char *scheme, int def_port) { char *host, *path, *search, *p, sport[7]; const char *err; @@ -75,55 +74,63 @@ */ port = def_port; err = proxy_canon_netloc(r->pool, &url, NULL, NULL, &host, &port); - if (err) return BAD_REQUEST; + if (err) + return BAD_REQUEST; /* now parse path/search args, according to rfc1738 */ /* N.B. if this isn't a true proxy request, then the URL _path_ * has already been decoded */ - if (r->proxyreq) - { + if (r->proxyreq) { p = strchr(url, '?'); - if (p != NULL) *(p++) = '\0'; - } else + if (p != NULL) + *(p++) = '\0'; + } + else p = r->args; /* process path */ path = proxy_canonenc(r->pool, url, strlen(url), enc_path, r->proxyreq); - if (path == NULL) return BAD_REQUEST; + if (path == NULL) + return BAD_REQUEST; /* process search */ - if (p != NULL) - { + if (p != NULL) { search = p; - if (search == NULL) return BAD_REQUEST; - } else + if (search == NULL) + return BAD_REQUEST; + } + else search = NULL; - if (port != def_port) ap_snprintf(sport, sizeof(sport), ":%d", port); - else sport[0] = '\0'; + if (port != def_port) + ap_snprintf(sport, sizeof(sport), ":%d", port); + else + sport[0] = '\0'; r->filename = pstrcat(r->pool, "proxy:", scheme, "://", host, sport, "/", - path, (search) ? "?" : "", (search) ? search : "", NULL); + path, (search) ? "?" : "", (search) ? search : "", NULL); return OK; } /* Clear all connection-based headers from the incoming headers table */ -static void clear_connection (table *headers) +static void clear_connection(table *headers) { char *name; char *next = table_get(headers, "Connection"); - if (!next) return; + if (!next) + return; while (*next) { - name = next; - while (*next && !isspace(*next) && (*next != ',')) ++next; - while (*next && (isspace(*next) || (*next == ','))) { - *next = '\0'; - ++next; - } - table_unset(headers, name); + name = next; + while (*next && !isspace(*next) && (*next != ',')) + ++next; + while (*next && (isspace(*next) || (*next == ','))) { + *next = '\0'; + ++next; + } + table_unset(headers, name); } table_unset(headers, "Connection"); } @@ -137,9 +144,8 @@ * we return DECLINED so that we can try another proxy. (Or the direct * route.) */ -int -proxy_http_handler(request_rec *r, struct cache_req *c, char *url, - const char *proxyhost, int proxyport) +int proxy_http_handler(request_rec *r, struct cache_req *c, char *url, + const char *proxyhost, int proxyport) { char *p; const char *err, *desthost; @@ -152,17 +158,17 @@ BUFF *f, *cache; struct hdr_entry *hdr; char buffer[HUGE_STRING_LEN]; - pool *pool=r->pool; - const long int zero=0L; + pool *pool = r->pool; + const long int zero = 0L; int destport = 0; char *destportstr = NULL; char *urlptr = NULL; void *sconf = r->server->module_config; proxy_server_conf *conf = - (proxy_server_conf *)get_module_config(sconf, &proxy_module); - struct noproxy_entry *npent=(struct noproxy_entry *)conf->noproxies->elts; - struct nocache_entry *ncent=(struct nocache_entry *)conf->nocaches->elts; + (proxy_server_conf *) get_module_config(sconf, &proxy_module); + struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; + struct nocache_entry *ncent = (struct nocache_entry *) conf->nocaches->elts; int nocache = 0; memset(&server, '\0', sizeof(server)); @@ -170,78 +176,76 @@ /* We break the URL into host, port, path-search */ - urlptr = strstr(url,"://"); - if (urlptr == NULL) return BAD_REQUEST; + urlptr = strstr(url, "://"); + if (urlptr == NULL) + return BAD_REQUEST; urlptr += 3; destport = DEFAULT_PORT; p = strchr(urlptr, '/'); - if (p == NULL) - { - desthost = pstrdup(pool, urlptr); - urlptr = "/"; - } else - { - char *q = palloc(pool, p-urlptr+1); - memcpy(q, urlptr, p-urlptr); - q[p-urlptr] = '\0'; - urlptr = p; - desthost = q; + if (p == NULL) { + desthost = pstrdup(pool, urlptr); + urlptr = "/"; + } + else { + char *q = palloc(pool, p - urlptr + 1); + memcpy(q, urlptr, p - urlptr); + q[p - urlptr] = '\0'; + urlptr = p; + desthost = q; } p = strchr(desthost, ':'); - if (p != NULL) - { - *(p++) = '\0'; - if (isdigit(*p)) - { - destport = atoi(p); - destportstr = p; + if (p != NULL) { + *(p++) = '\0'; + if (isdigit(*p)) { + destport = atoi(p); + destportstr = p; } } /* check if ProxyBlock directive on this host */ destaddr.s_addr = ap_inet_addr(desthost); - for (i=0; i < conf->noproxies->nelts; i++) - { - if ((npent[i].name != NULL && strstr(desthost, npent[i].name) != NULL) - || destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*') + for (i = 0; i < conf->noproxies->nelts; i++) { + if ((npent[i].name != NULL && strstr(desthost, npent[i].name) != NULL) + || destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*') return proxyerror(r, "Connect to remote machine blocked"); } - if (proxyhost != NULL) - { + if (proxyhost != NULL) { server.sin_port = htons(proxyport); err = proxy_host2addr(proxyhost, &server_hp); - if (err != NULL) return DECLINED; /* try another */ - } else - { + 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 */ + if (err != NULL) + return proxyerror(r, err); /* give up */ } sock = psocket(pool, PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock == -1) - { + if (sock == -1) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, "proxy: error creating socket"); return SERVER_ERROR; } - + if (conf->recv_buffer_size) { - if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, - (const char *)&conf->recv_buffer_size, sizeof(int)) - == -1) { - proxy_log_uerror("setsockopt", "(SO_RCVBUF)", - "Failed to set RecvBufferSize, using default", - r->server); - } + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, + (const char *) &conf->recv_buffer_size, sizeof(int)) + == -1) { + proxy_log_uerror("setsockopt", "(SO_RCVBUF)", + "Failed to set RecvBufferSize, using default", + r->server); + } } #ifdef SINIX_D_RESOLVER_BUG - { struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list; + { + struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list; - for ( ; ip_addr->s_addr != 0; ++ip_addr) { + for (; ip_addr->s_addr != 0; ++ip_addr) { memcpy(&server.sin_addr, ip_addr, sizeof(struct in_addr)); i = proxy_doconnect(sock, &server, r); if (i == 0) @@ -252,17 +256,18 @@ 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); + sizeof(struct in_addr)); + i = proxy_doconnect(sock, &server, r); if (i == 0) break; j++; } #endif - if (i == -1) - { - if (proxyhost != NULL) return DECLINED; /* try again another way */ - else return proxyerror(r, "Could not connect to remote machine"); + if (i == -1) { + if (proxyhost != NULL) + return DECLINED; /* try again another way */ + else + return proxyerror(r, "Could not connect to remote machine"); } clear_connection(r->headers_in); /* Strip connection-based headers */ @@ -270,23 +275,22 @@ f = bcreate(pool, B_RDWR | B_SOCKET); bpushfd(f, sock, sock); - hard_timeout ("proxy send", r); + hard_timeout("proxy send", r); bvputs(f, r->method, " ", proxyhost ? url : urlptr, " HTTP/1.0\015\012", - NULL); + NULL); bvputs(f, "Host: ", desthost, NULL); if (destportstr != NULL && destport != DEFAULT_PORT) bvputs(f, ":", destportstr, "\015\012", NULL); else bputs("\015\012", f); - reqhdrs_arr = table_elts (r->headers_in); - reqhdrs = (table_entry *)reqhdrs_arr->elts; - for (i=0; i < reqhdrs_arr->nelts; i++) - { + reqhdrs_arr = 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 */ - || !strcasecmp(reqhdrs[i].key, "Proxy-Authorization")) + /* Clear out headers not to send */ + || !strcasecmp(reqhdrs[i].key, "Host") /* Already sent */ + ||!strcasecmp(reqhdrs[i].key, "Proxy-Authorization")) continue; bvputs(f, reqhdrs[i].key, ": ", reqhdrs[i].val, "\015\012", NULL); } @@ -294,30 +298,26 @@ bputs("\015\012", f); /* send the request data, if any. N.B. should we trap SIGPIPE ? */ - if (should_client_block(r)) - { + if (should_client_block(r)) { while ((i = get_client_block(r, buffer, HUGE_STRING_LEN)) > 0) - bwrite(f, buffer, i); + bwrite(f, buffer, i); } bflush(f); kill_timeout(r); - hard_timeout ("proxy receive", r); - - len = bgets(buffer, HUGE_STRING_LEN-1, f); - if (len == -1 || len == 0) - { + hard_timeout("proxy receive", r); + + len = bgets(buffer, HUGE_STRING_LEN - 1, f); + if (len == -1 || len == 0) { bclose(f); kill_timeout(r); return proxyerror(r, "Error reading from remote server"); } /* Is it an HTTP/1 response? This is buggy if we ever see an HTTP/1.10 */ - if (checkmask(buffer, "HTTP/#.# ###*")) - { + if (checkmask(buffer, "HTTP/#.# ###*")) { /* If not an HTTP/1 messsage or if the status line was > 8192 bytes */ - if (buffer[5] != '1' || buffer[len-1] != '\n') - { + if (buffer[5] != '1' || buffer[len - 1] != '\n') { bclose(f); kill_timeout(r); return BAD_GATEWAY; @@ -336,10 +336,9 @@ resp_hdrs = proxy_read_headers(pool, buffer, HUGE_STRING_LEN, f); - clear_connection((table *)resp_hdrs); /* Strip Connection hdrs */ + clear_connection((table *) resp_hdrs); /* Strip Connection hdrs */ } - else - { + else { /* an http/0.9 response */ backasswards = 1; r->status = 200; @@ -355,11 +354,11 @@ * HTTP/1.0 requires us to accept 3 types of dates, but only generate * one type */ - - hdr = (struct hdr_entry *)resp_hdrs->elts; - for (i=0; i < resp_hdrs->nelts; i++) - { - if (hdr[i].value[0] == '\0') continue; + + hdr = (struct hdr_entry *) resp_hdrs->elts; + for (i = 0; i < resp_hdrs->nelts; i++) { + if (hdr[i].value[0] == '\0') + continue; p = hdr[i].field; if (strcasecmp(p, "Date") == 0 || strcasecmp(p, "Last-Modified") == 0 || @@ -368,36 +367,34 @@ } /* check if NoCache directive on this host */ - for (i=0; i < conf->nocaches->nelts; i++) - { - if ((ncent[i].name != NULL && strstr(desthost, ncent[i].name) != NULL) - || destaddr.s_addr == ncent[i].addr.s_addr || ncent[i].name[0] == '*') - nocache = 1; + for (i = 0; i < conf->nocaches->nelts; i++) { + if ((ncent[i].name != NULL && strstr(desthost, ncent[i].name) != NULL) + || destaddr.s_addr == ncent[i].addr.s_addr || ncent[i].name[0] == '*') + nocache = 1; } i = proxy_cache_update(c, resp_hdrs, !backasswards, nocache); - if (i != DECLINED) - { + if (i != DECLINED) { bclose(f); return i; } cache = c->fp; - hard_timeout ("proxy receive", r); + hard_timeout("proxy receive", r); /* write status line */ if (!r->assbackwards) - rvputs(r, "HTTP/1.0 ", r->status_line, "\015\012", NULL); + rvputs(r, "HTTP/1.0 ", r->status_line, "\015\012", NULL); if (cache != NULL) if (bvputs(cache, "HTTP/1.0 ", r->status_line, "\015\012", NULL) == -1) cache = proxy_cache_error(c); /* send headers */ - for (i=0; i < resp_hdrs->nelts; i++) - { + for (i = 0; i < resp_hdrs->nelts; i++) { if (hdr[i].field == NULL || hdr[i].value == NULL || - hdr[i].value[0] == '\0') continue; + hdr[i].value[0] == '\0') + continue; if (!r->assbackwards) { rvputs(r, hdr[i].field, ": ", hdr[i].value, "\015\012", NULL); table_set(r->headers_out, hdr[i].field, hdr[i].value); @@ -408,25 +405,28 @@ cache = proxy_cache_error(c); } - if (!r->assbackwards) rputs("\015\012", r); + if (!r->assbackwards) + rputs("\015\012", r); if (cache != NULL) - if (bputs("\015\012", cache) == -1) cache = proxy_cache_error(c); + if (bputs("\015\012", cache) == -1) + cache = proxy_cache_error(c); bsetopt(r->connection->client, BO_BYTECT, &zero); r->sent_bodyct = 1; /* Is it an HTTP/0.9 respose? If so, send the extra data */ - if (backasswards) - { + if (backasswards) { bwrite(r->connection->client, buffer, len); if (cache != NULL) - if (bwrite(f, buffer, len) != len) cache = proxy_cache_error(c); + if (bwrite(f, buffer, len) != len) + cache = proxy_cache_error(c); } kill_timeout(r); /* send body */ /* if header only, then cache will be NULL */ /* HTTP/1.0 tells us to read to EOF, rather than content-length bytes */ - if (!r->header_only) proxy_send_fb(f, r, cache, c); + if (!r->header_only) + proxy_send_fb(f, r, cache, c); proxy_cache_tidy(c); @@ -435,4 +435,3 @@ proxy_garbage_coll(r); return OK; } - 1.31 +369 -377 apachen/src/modules/proxy/proxy_util.c Index: proxy_util.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/proxy/proxy_util.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- proxy_util.c 1997/09/14 07:34:38 1.30 +++ proxy_util.c 1997/09/16 00:59:41 1.31 @@ -64,37 +64,45 @@ static int proxy_match_word(struct dirconn_entry *This, request_rec *r); /* already called in the knowledge that the characters are hex digits */ -int -proxy_hex2c(const char *x) +int proxy_hex2c(const char *x) { int i, ch; ch = x[0]; - if (isdigit(ch)) i = ch - '0'; - else if (isupper(ch)) i = ch - ('A' - 10); - else i = ch - ('a' - 10); + if (isdigit(ch)) + i = ch - '0'; + else if (isupper(ch)) + i = ch - ('A' - 10); + else + i = ch - ('a' - 10); i <<= 4; ch = x[1]; - if (isdigit(ch)) i += ch - '0'; - else if (isupper(ch)) i += ch - ('A' - 10); - else i += ch - ('a' - 10); + if (isdigit(ch)) + i += ch - '0'; + else if (isupper(ch)) + i += ch - ('A' - 10); + else + i += ch - ('a' - 10); return i; } -void -proxy_c2hex(int ch, char *x) +void proxy_c2hex(int ch, char *x) { int i; x[0] = '%'; i = (ch & 0xF0) >> 4; - if (i >= 10) x[1] = ('A' - 10) + i; - else x[1] = '0' + i; + if (i >= 10) + x[1] = ('A' - 10) + i; + else + x[1] = '0' + i; i = ch & 0x0F; - if (i >= 10) x[2] = ('A' - 10) + i; - else x[2] = '0' + i; + if (i >= 10) + x[2] = ('A' - 10) + i; + else + x[2] = '0' + i; } /* @@ -108,12 +116,12 @@ * those which must not be touched. */ char * -proxy_canonenc(pool *p, const char *x, int len, enum enctype t, int isenc) + proxy_canonenc(pool *p, const char *x, int len, enum enctype t, int isenc) { int i, j, ch; char *y; - const char *allowed; /* characters which should not be encoded */ - const char *reserved; /* characters which much not be en/de-coded */ + const char *allowed; /* characters which should not be encoded */ + const char *reserved; /* characters which much not be en/de-coded */ /* N.B. in addition to :@&=, this allows ';' in an http path * and '?' in an ftp path -- this may be revised @@ -122,47 +130,52 @@ * it may be form-encoded. (Although RFC 1738 doesn't allow this - * it only permits ; / ? : @ = & as reserved chars.) */ - if (t == enc_path) allowed = "$-_.+!*'(),;:@&="; - else if (t == enc_search) allowed = "$-_.!*'(),;:@&="; - else if (t == enc_user) allowed = "$-_.+!*'(),;@&="; - else if (t == enc_fpath) allowed = "$-_.+!*'(),?:@&="; - else /* if (t == enc_parm) */ allowed = "$-_.+!*'(),?/:@&="; - - if (t == enc_path) reserved = "/"; - else if (t == enc_search) reserved = "+"; - else reserved = ""; + if (t == enc_path) + allowed = "$-_.+!*'(),;:@&="; + else if (t == enc_search) + allowed = "$-_.!*'(),;:@&="; + else if (t == enc_user) + allowed = "$-_.+!*'(),;@&="; + else if (t == enc_fpath) + allowed = "$-_.+!*'(),?:@&="; + else /* if (t == enc_parm) */ + allowed = "$-_.+!*'(),?/:@&="; + + if (t == enc_path) + reserved = "/"; + else if (t == enc_search) + reserved = "+"; + else + reserved = ""; - y = palloc(p, 3*len+1); + y = palloc(p, 3 * len + 1); - for (i=0, j=0; i < len; i++, j++) - { + for (i = 0, j = 0; i < len; i++, j++) { /* always handle '/' first */ ch = x[i]; - if (ind(reserved, ch) != -1) - { + if (ind(reserved, ch) != -1) { y[j] = ch; continue; } /* decode it if not already done */ - if (isenc && ch == '%') - { - if (!isxdigit(x[i+1]) || !isxdigit(x[i+2])) + if (isenc && ch == '%') { + if (!isxdigit(x[i + 1]) || !isxdigit(x[i + 2])) return NULL; - ch = proxy_hex2c(&x[i+1]); + ch = proxy_hex2c(&x[i + 1]); i += 2; - if (ch != 0 && ind(reserved, ch) != -1) - { /* keep it encoded */ + if (ch != 0 && ind(reserved, ch) != -1) { /* keep it encoded */ proxy_c2hex(ch, &y[j]); j += 2; continue; } } /* recode it, if necessary */ - if (!isalnum(ch) && ind(allowed, ch) == -1) - { + if (!isalnum(ch) && ind(allowed, ch) == -1) { proxy_c2hex(ch, &y[j]); j += 2; - } else y[j] = ch; + } + else + y[j] = ch; } y[j] = '\0'; return y; @@ -179,91 +192,92 @@ * Returns an error string. */ char * -proxy_canon_netloc(pool *pool, char **const urlp, char **userp, - char **passwordp, char **hostp, int *port) + proxy_canon_netloc(pool *pool, char **const urlp, char **userp, + char **passwordp, char **hostp, int *port) { int i; - char *p, *host, *url=*urlp; + char *p, *host, *url = *urlp; - if (url[0] != '/' || url[1] != '/') return "Malformed URL"; + if (url[0] != '/' || url[1] != '/') + return "Malformed URL"; host = url + 2; url = strchr(host, '/'); if (url == NULL) url = ""; else - *(url++) = '\0'; /* skip seperating '/' */ + *(url++) = '\0'; /* skip seperating '/' */ - if (userp != NULL) - { - char *user=NULL, *password = NULL; + if (userp != NULL) { + char *user = NULL, *password = NULL; p = strchr(host, '@'); - if (p != NULL) - { + if (p != NULL) { *p = '\0'; user = host; host = p + 1; /* find password */ p = strchr(user, ':'); - if (p != NULL) - { + if (p != NULL) { *p = '\0'; - password = proxy_canonenc(pool, p+1, strlen(p+1), enc_user, 1); + password = proxy_canonenc(pool, p + 1, strlen(p + 1), enc_user, 1); if (password == NULL) return "Bad %-escape in URL (password)"; } user = proxy_canonenc(pool, user, strlen(user), enc_user, 1); - if (user == NULL) return "Bad %-escape in URL (username)"; + if (user == NULL) + return "Bad %-escape in URL (username)"; } *userp = user; *passwordp = password; } p = strchr(host, ':'); - if (p != NULL) - { + if (p != NULL) { *(p++) = '\0'; - - for (i=0; p[i] != '\0'; i++) - if (!isdigit(p[i])) break; + + for (i = 0; p[i] != '\0'; i++) + if (!isdigit(p[i])) + break; if (i == 0 || p[i] != '\0') return "Bad port number in URL"; *port = atoi(p); - if (*port > 65535) return "Port number in URL > 65535"; + if (*port > 65535) + return "Port number in URL > 65535"; } - str_tolower(host); /* DNS names are case-insensitive */ - if (*host == '\0') return "Missing host in URL"; + str_tolower(host); /* DNS names are case-insensitive */ + if (*host == '\0') + return "Missing host in URL"; /* check hostname syntax */ - for (i=0; host[i] != '\0'; i++) + for (i = 0; host[i] != '\0'; i++) if (!isdigit(host[i]) && host[i] != '.') break; - /* must be an IP address */ + /* must be an IP address */ #ifdef WIN32 if (host[i] == '\0' && (inet_addr(host) == -1)) #else if (host[i] == '\0' && (ap_inet_addr(host) == -1 || inet_network(host) == -1)) #endif { - return "Bad IP address in URL"; + return "Bad IP address in URL"; } /* if (strchr(host,'.') == NULL && domain != NULL) - host = pstrcat(pool, host, domain, NULL); -*/ + host = pstrcat(pool, host, domain, NULL); + */ *urlp = url; *hostp = host; return NULL; } -static const char *lwday[7]= +static const char *lwday[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; -static const char *wday[7]= +static const char *wday[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; -static const char *months[12]= +static const char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; @@ -275,45 +289,58 @@ * formatted, then it exits very quickly. */ char * -proxy_date_canon(pool *p, char *x) + proxy_date_canon(pool *p, char *x) { int wk, mday, year, hour, min, sec, mon; char *q, month[4], zone[4], week[4]; - + q = strchr(x, ','); /* check for RFC 850 date */ - if (q != NULL && q - x > 3 && q[1] == ' ') - { + if (q != NULL && q - x > 3 && q[1] == ' ') { *q = '\0'; - for (wk=0; wk < 7; wk++) - if (strcmp(x, lwday[wk]) == 0) break; + for (wk = 0; wk < 7; wk++) + if (strcmp(x, lwday[wk]) == 0) + break; *q = ','; - if (wk == 7) return x; /* not a valid date */ + if (wk == 7) + return x; /* not a valid date */ if (q[4] != '-' || q[8] != '-' || q[11] != ' ' || q[14] != ':' || - q[17] != ':' || strcmp(&q[20], " GMT") != 0) return x; - if (sscanf(q+2, "%u-%3s-%u %u:%u:%u %3s", &mday, month, &year, - &hour, &min, &sec, zone) != 7) return x; - if (year < 70) year += 2000; - else year += 1900; - } else - { + q[17] != ':' || strcmp(&q[20], " GMT") != 0) + return x; + if (sscanf(q + 2, "%u-%3s-%u %u:%u:%u %3s", &mday, month, &year, + &hour, &min, &sec, zone) != 7) + return x; + if (year < 70) + year += 2000; + else + year += 1900; + } + else { /* check for acstime() date */ if (x[3] != ' ' || x[7] != ' ' || x[10] != ' ' || x[13] != ':' || - x[16] != ':' || x[19] != ' ' || x[24] != '\0') return x; + x[16] != ':' || x[19] != ' ' || x[24] != '\0') + return x; if (sscanf(x, "%3s %3s %u %u:%u:%u %u", week, month, &mday, &hour, - &min, &sec, &year) != 7) return x; - for (wk=0; wk < 7; wk++) - if (strcmp(week, wday[wk]) == 0) break; - if (wk == 7) return x; + &min, &sec, &year) != 7) + return x; + for (wk = 0; wk < 7; wk++) + if (strcmp(week, wday[wk]) == 0) + break; + if (wk == 7) + return x; } /* check date */ - for (mon=0; mon < 12; mon++) if (strcmp(month, months[mon]) == 0) break; - if (mon == 12) return x; + for (mon = 0; mon < 12; mon++) + if (strcmp(month, months[mon]) == 0) + break; + if (mon == 12) + return x; - if (strlen(x) < 31) x = palloc(p, 31); - ap_snprintf(x, strlen(x)+1, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", wday[wk], mday, - months[mon], year, hour, min, sec); + if (strlen(x) < 31) + x = palloc(p, 31); + ap_snprintf(x, strlen(x) + 1, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", wday[wk], mday, + months[mon], year, hour, min, sec); return x; } @@ -322,7 +349,7 @@ * Returns NULL on file error */ array_header * -proxy_read_headers(pool *pool, char *buffer, int size, BUFF *f) + proxy_read_headers(pool *pool, char *buffer, int size, BUFF *f) { int gotcr, len, i, j; array_header *resp_hdrs; @@ -333,45 +360,43 @@ hdr = NULL; gotcr = 1; - for (;;) - { + for (;;) { len = bgets(buffer, size, f); - if (len == -1) return NULL; - if (len == 0) break; - if (buffer[len-1] == '\n') - { + if (len == -1) + return NULL; + if (len == 0) + break; + if (buffer[len - 1] == '\n') { buffer[--len] = '\0'; i = 1; - } else + } + else i = 0; - if (!gotcr || buffer[0] == ' ' || buffer[0] == '\t') - { + if (!gotcr || buffer[0] == ' ' || buffer[0] == '\t') { /* a continuation header */ - if (hdr == NULL) - { + if (hdr == NULL) { /* error!! */ - if (!i) - { + if (!i) { i = bskiplf(f); - if (i == -1) return NULL; + if (i == -1) + return NULL; } gotcr = 1; continue; } hdr->value = pstrcat(pool, hdr->value, buffer, NULL); } - else if (gotcr && len == 0) break; - else - { + else if (gotcr && len == 0) + break; + else { p = strchr(buffer, ':'); - if (p == NULL) - { + if (p == NULL) { /* error!! */ - if (!gotcr) - { + if (!gotcr) { i = bskiplf(f); - if (i == -1) return NULL; + if (i == -1) + return NULL; } gotcr = 1; hdr = NULL; @@ -380,32 +405,32 @@ hdr = push_array(resp_hdrs); *(p++) = '\0'; hdr->field = pstrdup(pool, buffer); - while (*p == ' ' || *p == '\t') p++; + while (*p == ' ' || *p == '\t') + p++; hdr->value = pstrdup(pool, p); gotcr = i; } } - hdr = (struct hdr_entry *)resp_hdrs->elts; - for (i=0; i < resp_hdrs->nelts; i++) - { + hdr = (struct hdr_entry *) resp_hdrs->elts; + for (i = 0; i < resp_hdrs->nelts; i++) { p = hdr[i].value; j = strlen(p); - while (j > 0 && (p[j-1] == ' ' || p[j-1] == '\t')) j--; + while (j > 0 && (p[j - 1] == ' ' || p[j - 1] == '\t')) + j--; p[j] = '\0'; } return resp_hdrs; } -long int -proxy_send_fb(BUFF *f, request_rec *r, BUFF *f2, struct cache_req *c) +long int proxy_send_fb(BUFF *f, request_rec *r, BUFF *f2, struct cache_req *c) { char buf[IOBUFSIZE]; long total_bytes_sent; - register int n,o,w; + register int n, o, w; conn_rec *con = r->connection; - + total_bytes_sent = 0; /* Since we are reading from one buffer and writing to another, @@ -416,38 +441,40 @@ while (!con->aborted && f != NULL) { n = bread(f, buf, IOBUFSIZE); - if (n == -1) /* input error */ - { - if (f2 != NULL) f2 = proxy_cache_error(c); + if (n == -1) { /* input error */ + if (f2 != NULL) + f2 = proxy_cache_error(c); break; } - if (n == 0) break; /* EOF */ - o=0; + if (n == 0) + break; /* EOF */ + o = 0; total_bytes_sent += n; if (f2 != NULL) - if (bwrite(f2, buf, n) != n) f2 = proxy_cache_error(c); - - while(n && !con->aborted) { - w = bwrite(con->client, &buf[o], n); - if (w <= 0) { - if (f2 != NULL) { - pclosef(c->req->pool, c->fp->fd); - c->fp = NULL; - f2 = NULL; - con->aborted = 1; - unlink(c->tempfile); - } - break; - } - reset_timeout(r); /* reset timeout after successful write */ - n-=w; - o+=w; - } + if (bwrite(f2, buf, n) != n) + f2 = proxy_cache_error(c); + + while (n && !con->aborted) { + w = bwrite(con->client, &buf[o], n); + if (w <= 0) { + if (f2 != NULL) { + pclosef(c->req->pool, c->fp->fd); + c->fp = NULL; + f2 = NULL; + con->aborted = 1; + unlink(c->tempfile); + } + break; + } + reset_timeout(r); /* reset timeout after successful write */ + n -= w; + o += w; + } } if (!con->aborted) - bflush(con->client); - + bflush(con->client); + kill_timeout(r); return total_bytes_sent; } @@ -456,14 +483,14 @@ * Read a header from the array, returning the first entry */ struct hdr_entry * -proxy_get_header(array_header *hdrs_arr, const char *name) + proxy_get_header(array_header *hdrs_arr, const char *name) { struct hdr_entry *hdrs; int i; - hdrs = (struct hdr_entry *)hdrs_arr->elts; + hdrs = (struct hdr_entry *) hdrs_arr->elts; for (i = 0; i < hdrs_arr->nelts; i++) - if (hdrs[i].field != NULL && strcasecmp(name, hdrs[i].field) == 0) + if (hdrs[i].field != NULL && strcasecmp(name, hdrs[i].field) == 0) return &hdrs[i]; return NULL; @@ -475,21 +502,20 @@ * is not subsequently overwritten */ struct hdr_entry * -proxy_add_header(array_header *hdrs_arr, char *field, char *value, - int rep) + proxy_add_header(array_header *hdrs_arr, char *field, char *value, + int rep) { int i; struct hdr_entry *hdrs; - hdrs = (struct hdr_entry *)hdrs_arr->elts; + hdrs = (struct hdr_entry *) hdrs_arr->elts; if (rep) for (i = 0; i < hdrs_arr->nelts; i++) - if (hdrs[i].field != NULL && strcasecmp(field, hdrs[i].field) == 0) - { + if (hdrs[i].field != NULL && strcasecmp(field, hdrs[i].field) == 0) { hdrs[i].value = value; return hdrs; } - + hdrs = push_array(hdrs_arr); hdrs->field = field; hdrs->value = value; @@ -497,13 +523,12 @@ return hdrs; } -void -proxy_del_header(array_header *hdrs_arr, const char *field) +void proxy_del_header(array_header *hdrs_arr, const char *field) { int i; struct hdr_entry *hdrs; - hdrs = (struct hdr_entry *)hdrs_arr->elts; + hdrs = (struct hdr_entry *) hdrs_arr->elts; for (i = 0; i < hdrs_arr->nelts; i++) if (hdrs[i].field != NULL && strcasecmp(field, hdrs[i].field) == 0) @@ -517,20 +542,19 @@ * * A timeout should be set before calling this routine. */ -void -proxy_send_headers(request_rec *r, const char *respline, array_header *hdrs_arr) +void proxy_send_headers(request_rec *r, const char *respline, array_header *hdrs_arr) { struct hdr_entry *hdrs; int i; BUFF *fp = r->connection->client; - hdrs = (struct hdr_entry *)hdrs_arr->elts; + hdrs = (struct hdr_entry *) hdrs_arr->elts; bputs(respline, fp); bputs("\015\012", fp); - for (i = 0; i < hdrs_arr->nelts; i++) - { - if (hdrs[i].field == NULL) continue; + for (i = 0; i < hdrs_arr->nelts; i++) { + if (hdrs[i].field == NULL) + continue; bvputs(fp, hdrs[i].field, ": ", hdrs[i].value, "\015\012", NULL); table_set(r->headers_out, hdrs[i].field, hdrs[i].value); } @@ -545,27 +569,28 @@ * The return returns 1 if the token val is found in the list, or 0 * otherwise. */ -int -proxy_liststr(const char *list, const char *val) +int proxy_liststr(const char *list, const char *val) { int len, i; const char *p; len = strlen(val); - while (list != NULL) - { + while (list != NULL) { p = strchr(list, ','); - if (p != NULL) - { + if (p != NULL) { i = p - list; - do p++; while (isspace(*p)); - } + do + p++; + while (isspace(*p)); + } else i = strlen(list); - while (i > 0 && isspace(list[i-1])) i--; - if (i == len && strncasecmp(list, val, len) == 0) return 1; + while (i > 0 && isspace(list[i - 1])) + i--; + if (i == len && strncasecmp(list, val, len) == 0) + return 1; list = p; } return 0; @@ -577,78 +602,73 @@ * On NT, the file system is NOT case sensitive. So, a == A * need to map to smaller set of characters */ -void -proxy_hash(const char *it, char *val,int ndepth,int nlength) +void proxy_hash(const char *it, char *val, int ndepth, int nlength) { AP_MD5_CTX context; unsigned char digest[16]; char tmp[26]; int i, k, d; unsigned int x; - static const char table[32]= "abcdefghijklmnopqrstuvwxyz012345"; + static const char table[32] = "abcdefghijklmnopqrstuvwxyz012345"; MD5Init(&context); - MD5Update(&context, (const unsigned char *)it, strlen(it)); + MD5Update(&context, (const unsigned char *) it, strlen(it)); MD5Final(digest, &context); /* encode 128 bits as 26 characters, using a modified uuencoding */ /* the encoding is 5 bytes -> 8 characters * i.e. 128 bits is 3 x 5 bytes + 1 byte -> 3 * 8 characters + 2 characters */ - for (i=0, k=0; i < 15; i += 5) - { - x = (digest[i] << 24) | (digest[i+1] << 16) | (digest[i+2] << 8) | digest[i+3]; + for (i = 0, k = 0; i < 15; i += 5) { + x = (digest[i] << 24) | (digest[i + 1] << 16) | (digest[i + 2] << 8) | digest[i + 3]; tmp[k++] = table[x >> 27]; tmp[k++] = table[(x >> 22) & 0x1f]; tmp[k++] = table[(x >> 17) & 0x1f]; - tmp[k++] = table[(x >> 12) & 0x1f]; - tmp[k++] = table[(x >> 7) & 0x1f]; - tmp[k++] = table[(x >> 2) & 0x1f]; - x = ((x & 0x3) << 8) | digest[i+4]; - tmp[k++] = table[x >> 5]; + tmp[k++] = table[(x >> 12) & 0x1f]; + tmp[k++] = table[(x >> 7) & 0x1f]; + tmp[k++] = table[(x >> 2) & 0x1f]; + x = ((x & 0x3) << 8) | digest[i + 4]; + tmp[k++] = table[x >> 5]; tmp[k++] = table[x & 0x1f]; } /* one byte left */ x = digest[15]; - tmp[k++] = table[x >> 3]; /* use up 5 bits */ + tmp[k++] = table[x >> 3]; /* use up 5 bits */ tmp[k++] = table[x & 0x7]; /* now split into directory levels */ - for(i=k=d=0 ; d < ndepth ; ++d) - { - strncpy(&val[i],&tmp[k],nlength); - k+=nlength; - val[i+nlength]='/'; - i+=nlength+1; - } - memcpy(&val[i],&tmp[k],22-k); - val[i+22-k]='\0'; + for (i = k = d = 0; d < ndepth; ++d) { + strncpy(&val[i], &tmp[k], nlength); + k += nlength; + val[i + nlength] = '/'; + i += nlength + 1; + } + memcpy(&val[i], &tmp[k], 22 - k); + val[i + 22 - k] = '\0'; } #else -void -proxy_hash(const char *it, char *val,int ndepth,int nlength) +void proxy_hash(const char *it, char *val, int ndepth, int nlength) { AP_MD5_CTX context; unsigned char digest[16]; char tmp[22]; int i, k, d; unsigned int x; - static const char table[64]= -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@"; + static const char table[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@"; MD5Init(&context); - MD5Update(&context, (const unsigned char *)it, strlen(it)); + MD5Update(&context, (const unsigned char *) it, strlen(it)); MD5Final(digest, &context); /* encode 128 bits as 22 characters, using a modified uuencoding */ /* the encoding is 3 bytes -> 4 characters * i.e. 128 bits is 5 x 3 bytes + 1 byte -> 5 * 4 characters + 2 characters */ - for (i=0, k=0; i < 15; i += 3) - { - x = (digest[i] << 16) | (digest[i+1] << 8) | digest[i+2]; + for (i = 0, k = 0; i < 15; i += 3) { + x = (digest[i] << 16) | (digest[i + 1] << 8) | digest[i + 2]; tmp[k++] = table[x >> 18]; tmp[k++] = table[(x >> 12) & 0x3f]; tmp[k++] = table[(x >> 6) & 0x3f]; @@ -656,19 +676,18 @@ } /* one byte left */ x = digest[15]; - tmp[k++] = table[x >> 2]; /* use up 6 bits */ + tmp[k++] = table[x >> 2]; /* use up 6 bits */ tmp[k++] = table[(x << 4) & 0x3f]; /* now split into directory levels */ - for(i=k=d=0 ; d < ndepth ; ++d) - { - strncpy(&val[i],&tmp[k],nlength); - k+=nlength; - val[i+nlength]='/'; - i+=nlength+1; - } - memcpy(&val[i],&tmp[k],22-k); - val[i+22-k]='\0'; + for (i = k = d = 0; d < ndepth; ++d) { + strncpy(&val[i], &tmp[k], nlength); + k += nlength; + val[i + nlength] = '/'; + i += nlength + 1; + } + memcpy(&val[i], &tmp[k], 22 - k); + val[i + 22 - k] = '\0'; } #endif /* WIN32 */ @@ -676,61 +695,62 @@ /* * Converts 8 hex digits to a time integer */ -int -proxy_hex2sec(const char *x) +int proxy_hex2sec(const char *x) { int i, ch; unsigned int j; - for (i=0, j=0; i < 8; i++) - { + for (i = 0, j = 0; i < 8; i++) { ch = x[i]; j <<= 4; - if (isdigit(ch)) j |= ch - '0'; - else if (isupper(ch)) j |= ch - ('A' - 10); - else j |= ch - ('a' - 10); + if (isdigit(ch)) + j |= ch - '0'; + else if (isupper(ch)) + j |= ch - ('A' - 10); + else + j |= ch - ('a' - 10); } - if (j == 0xffffffff) return -1; /* so that it works with 8-byte ints */ - else return j; + if (j == 0xffffffff) + return -1; /* so that it works with 8-byte ints */ + else + return j; } /* * Converts a time integer to 8 hex digits */ -void -proxy_sec2hex(int t, char *y) +void proxy_sec2hex(int t, char *y) { int i, ch; - unsigned int j=t; + unsigned int j = t; - for (i=7; i >= 0; i--) - { + for (i = 7; i >= 0; i--) { ch = j & 0xF; j >>= 4; - if (ch >= 10) y[i] = ch + ('A' - 10); - else y[i] = ch + '0'; + if (ch >= 10) + y[i] = ch + ('A' - 10); + else + y[i] = ch + '0'; } y[8] = '\0'; } -void -proxy_log_uerror(const char *routine, const char *file, const char *err, - server_rec *s) +void proxy_log_uerror(const char *routine, const char *file, const char *err, + server_rec *s) { char *p, *q; q = get_time(); p = strerror(errno); - if (err != NULL) - { + if (err != NULL) { fprintf(s->error_log, "[%s] %s\n", q, err); if (file != NULL) fprintf(s->error_log, "- %s: %s: %s\n", routine, file, p); else fprintf(s->error_log, "- %s: %s\n", routine, p); - } else - { + } + else { if (file != NULL) fprintf(s->error_log, "[%s] %s: %s: %s\n", q, routine, file, p); else @@ -741,18 +761,17 @@ } BUFF * -proxy_cache_error(struct cache_req *c) + proxy_cache_error(struct cache_req *c) { proxy_log_uerror("write", c->tempfile, "proxy: error writing to cache file", - c->req->server); + c->req->server); pclosef(c->req->pool, c->fp->fd); - c->fp = NULL; + c->fp = NULL; unlink(c->tempfile); return NULL; } -int -proxyerror(request_rec *r, const char *message) +int proxyerror(request_rec *r, const char *message) { r->status = SERVER_ERROR; r->status_line = "500 Proxy Error"; @@ -775,34 +794,33 @@ * This routine returns its own error message */ const char * -proxy_host2addr(const char *host, struct hostent *reqhp) + proxy_host2addr(const char *host, struct hostent *reqhp) { int i; struct hostent *hp; static APACHE_TLS struct hostent hpbuf; static APACHE_TLS u_long ipaddr; - static APACHE_TLS char* charpbuf[2]; + static APACHE_TLS char *charpbuf[2]; - for (i=0; host[i] != '\0'; i++) + for (i = 0; host[i] != '\0'; i++) if (!isdigit(host[i]) && host[i] != '.') break; - if (host[i] != '\0') - { + if (host[i] != '\0') { hp = gethostbyname(host); if (hp == NULL) return "Host not found"; - } else - { + } + else { ipaddr = ap_inet_addr(host); - hp = gethostbyaddr((char *)&ipaddr, sizeof(u_long), AF_INET); + hp = gethostbyaddr((char *) &ipaddr, sizeof(u_long), AF_INET); if (hp == NULL) { memset(&hpbuf, 0, sizeof(hpbuf)); hpbuf.h_name = 0; hpbuf.h_addrtype = AF_INET; hpbuf.h_length = sizeof(u_long); hpbuf.h_addr_list = charpbuf; - hpbuf.h_addr_list[0] = (char*)&ipaddr; + hpbuf.h_addr_list[0] = (char *) &ipaddr; hpbuf.h_addr_list[1] = 0; hp = &hpbuf; } @@ -812,7 +830,7 @@ } static char * -proxy_get_host_of_request(request_rec *r) + proxy_get_host_of_request(request_rec *r) { char *url, *user = NULL, *password = NULL, *err, *host; int port = -1; @@ -821,11 +839,11 @@ return r->hostname; /* Set url to the first char after "scheme://" */ - if ((url = strchr(r->uri,':')) == NULL + if ((url = strchr(r->uri, ':')) == NULL || url[1] != '/' || url[2] != '/') return NULL; - url = pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */ + url = pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */ err = proxy_canon_netloc(r->pool, &url, &user, &password, &host, &port); @@ -834,16 +852,15 @@ r->hostname = host; - return host; /* ought to return the port, too */ + return host; /* ought to return the port, too */ } -/* Return TRUE if addr represents an IP address (or an IP network address)*/ -int -proxy_is_ipaddr(struct dirconn_entry *This) +/* Return TRUE if addr represents an IP address (or an IP network address) */ +int proxy_is_ipaddr(struct dirconn_entry *This) { const char *addr = This->name; unsigned long ip_addr[4]; - int i,quads; + int i, quads; unsigned long bits; /* if the address is given with an explicit netmask, use that */ @@ -851,68 +868,65 @@ /* "partial" addresses (with less than 4 quads) correctly, i.e. */ /* 192.168.123 is parsed as 192.168.0.123, which is not what I want. */ /* I therefore have to parse the IP address manually: */ - /*if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr) == 0)*/ - /* addr and mask were set by proxy_readmask() */ - /*return 1;*/ + /*if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr) == 0) */ + /* addr and mask were set by proxy_readmask() */ + /*return 1; */ /* Parse IP addr manually, optionally allowing */ /* abbreviated net addresses like 192.168. */ /* quads = sscanf(what, "%d.%d.%d.%d", &ip_addr[0], &ip_addr[1], - &ip_addr[2], &ip_addr[3]); - commented out: use of strtok() allows arbitrary base, like in: - 139.25.113.10 == 0x8b.0x19.0x71.0x0a - (yes, inet_addr() can parse that, too!) + &ip_addr[2], &ip_addr[3]); + commented out: use of strtok() allows arbitrary base, like in: + 139.25.113.10 == 0x8b.0x19.0x71.0x0a + (yes, inet_addr() can parse that, too!) */ /* Iterate over up to 4 (dotted) quads. */ - for (quads=0; quads<4 && *addr != '\0'; ++quads) - { + for (quads = 0; quads < 4 && *addr != '\0'; ++quads) { char *tmp; - if (*addr == '/' && quads > 0) /* netmask starts here. */ + if (*addr == '/' && quads > 0) /* netmask starts here. */ break; if (!isdigit(*addr)) - return 0; /* no digit at start of quad */ + return 0; /* no digit at start of quad */ ip_addr[quads] = strtoul(addr, &tmp, 0); - if (tmp == addr) /* expected a digit, found something else */ + if (tmp == addr) /* expected a digit, found something else */ return 0; addr = tmp; if (*addr == '.' && quads != 3) - ++addr; /* after the 4th quad, a dot would be illegal */ + ++addr; /* after the 4th quad, a dot would be illegal */ } - for (This->addr.s_addr = 0, i=0; i<quads; ++i) - This->addr.s_addr |= htonl(ip_addr[i] << (24 - 8*i)); + for (This->addr.s_addr = 0, i = 0; i < quads; ++i) + This->addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i)); - if (addr[0] == '/' && isdigit(addr[1])) /* net mask follows: */ - { + if (addr[0] == '/' && isdigit(addr[1])) { /* net mask follows: */ char *tmp; ++addr; bits = strtoul(addr, &tmp, 0); - if (tmp == addr) /* expected a digit, found something else */ + if (tmp == addr) /* expected a digit, found something else */ return 0; addr = tmp; - if (bits > 32) /* netmask must be between 0 and 32 */ + if (bits > 32) /* netmask must be between 0 and 32 */ return 0; } - else - { + else { /* Determine (i.e., "guess") netmask by counting the */ /* number of trailing .0's; reduce #quads appropriately */ /* (so that 192.168.0.0 is equivalent to 192.168.) */ - while (quads > 0 && ip_addr[quads-1] == 0) + while (quads > 0 && ip_addr[quads - 1] == 0) --quads; /* "IP Address should be given in dotted-quad form, optionally followed by a netmask (e.g., 192.168.111.0/24)"; */ @@ -920,36 +934,33 @@ return 0; /* every zero-byte counts as 8 zero-bits */ - bits = 8*quads; + bits = 8 * quads; - if (bits != 32) /* no warning for fully qualified IP address */ - fprintf(stderr,"Warning: NetMask not supplied with IP-Addr; guessing: %s/%ld\n", - inet_ntoa(This->addr), bits); + if (bits != 32) /* no warning for fully qualified IP address */ + fprintf(stderr, "Warning: NetMask not supplied with IP-Addr; guessing: %s/%ld\n", + inet_ntoa(This->addr), bits); } This->mask.s_addr = htonl(INADDR_NONE << (32 - bits)); - if (*addr == '\0' && (This->addr.s_addr & ~This->mask.s_addr) != 0) - { - fprintf(stderr,"Warning: NetMask and IP-Addr disagree in %s/%ld\n", - inet_ntoa(This->addr), bits); + if (*addr == '\0' && (This->addr.s_addr & ~This->mask.s_addr) != 0) { + fprintf(stderr, "Warning: NetMask and IP-Addr disagree in %s/%ld\n", + inet_ntoa(This->addr), bits); This->addr.s_addr &= This->mask.s_addr; - fprintf(stderr," Set to %s/%ld\n", - inet_ntoa(This->addr), bits); + fprintf(stderr, " Set to %s/%ld\n", + inet_ntoa(This->addr), bits); } - if (*addr == '\0') - { + if (*addr == '\0') { This->matcher = proxy_match_ipaddr; return 1; } else - return (*addr == '\0'); /* okay iff we've parsed the whole string */ + return (*addr == '\0'); /* okay iff we've parsed the whole string */ } -/* Return TRUE if addr represents an IP address (or an IP network address)*/ -static int -proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r) +/* Return TRUE if addr represents an IP address (or an IP network address) */ +static int proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r) { int i; int ip_addr[4]; @@ -959,43 +970,38 @@ const char *found; const char *host = proxy_get_host_of_request(r); - memset (&addr, '\0', sizeof addr); - memset (ip_addr, '\0', sizeof ip_addr); + memset(&addr, '\0', sizeof addr); + memset(ip_addr, '\0', sizeof ip_addr); - if ( 4 == sscanf(host, "%d.%d.%d.%d", &ip_addr[0], &ip_addr[1], &ip_addr[2], &ip_addr[3])) - { - for (addr.s_addr = 0, i=0; i<4; ++i) - addr.s_addr |= htonl(ip_addr[i] << (24 - 8*i)); + if (4 == sscanf(host, "%d.%d.%d.%d", &ip_addr[0], &ip_addr[1], &ip_addr[2], &ip_addr[3])) { + for (addr.s_addr = 0, i = 0; i < 4; ++i) + addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i)); - if (This->addr.s_addr == (addr.s_addr & This->mask.s_addr)) - { + if (This->addr.s_addr == (addr.s_addr & This->mask.s_addr)) { #if DEBUGGING - fprintf(stderr,"1)IP-Match: %s[%s] <-> ", host, inet_ntoa(addr)); - fprintf(stderr,"%s/", inet_ntoa(This->addr)); - fprintf(stderr,"%s\n", inet_ntoa(This->mask)); + fprintf(stderr, "1)IP-Match: %s[%s] <-> ", host, inet_ntoa(addr)); + fprintf(stderr, "%s/", inet_ntoa(This->addr)); + fprintf(stderr, "%s\n", inet_ntoa(This->mask)); #endif return 1; } #if DEBUGGING - else - { - fprintf(stderr,"1)IP-NoMatch: %s[%s] <-> ", host, inet_ntoa(addr)); - fprintf(stderr,"%s/", inet_ntoa(This->addr)); - fprintf(stderr,"%s\n", inet_ntoa(This->mask)); + else { + fprintf(stderr, "1)IP-NoMatch: %s[%s] <-> ", host, inet_ntoa(addr)); + fprintf(stderr, "%s/", inet_ntoa(This->addr)); + fprintf(stderr, "%s\n", inet_ntoa(This->mask)); } #endif } - else - { + else { struct hostent the_host; - memset (&the_host, '\0', sizeof the_host); + memset(&the_host, '\0', sizeof the_host); found = proxy_host2addr(host, &the_host); - if ( found != NULL ) - { + if (found != NULL) { #if DEBUGGING - fprintf(stderr,"2)IP-NoMatch: hostname=%s msg=%s\n", host, found); + fprintf(stderr, "2)IP-NoMatch: hostname=%s msg=%s\n", host, found); #endif return 0; } @@ -1006,37 +1012,33 @@ found = host; /* Try to deal with multiple IP addr's for a host */ - for (ip_listptr=the_host.h_addr_list; *ip_listptr; ++ip_listptr) - { + for (ip_listptr = the_host.h_addr_list; *ip_listptr; ++ip_listptr) { ip_list = (struct in_addr *) *ip_listptr; - if (This->addr.s_addr == (ip_list->s_addr & This->mask.s_addr)) - { + if (This->addr.s_addr == (ip_list->s_addr & This->mask.s_addr)) { #if DEBUGGING - fprintf(stderr,"3)IP-Match: %s[%s] <-> ", found, inet_ntoa(*ip_list)); - fprintf(stderr,"%s/", inet_ntoa(This->addr)); - fprintf(stderr,"%s\n", inet_ntoa(This->mask)); + fprintf(stderr, "3)IP-Match: %s[%s] <-> ", found, inet_ntoa(*ip_list)); + fprintf(stderr, "%s/", inet_ntoa(This->addr)); + fprintf(stderr, "%s\n", inet_ntoa(This->mask)); #endif return 1; } #if DEBUGGING - else - { - fprintf(stderr,"3)IP-NoMatch: %s[%s] <-> ", found, inet_ntoa(*ip_list)); - fprintf(stderr,"%s/", inet_ntoa(This->addr)); - fprintf(stderr,"%s\n", inet_ntoa(This->mask)); + else { + fprintf(stderr, "3)IP-NoMatch: %s[%s] <-> ", found, inet_ntoa(*ip_list)); + fprintf(stderr, "%s/", inet_ntoa(This->addr)); + fprintf(stderr, "%s\n", inet_ntoa(This->mask)); } #endif } } /* Use net math to determine if a host lies in a subnet */ - /*return This->addr.s_addr == (r->connection->remote_addr.sin_addr.s_addr & This->mask.s_addr);*/ + /*return This->addr.s_addr == (r->connection->remote_addr.sin_addr.s_addr & This->mask.s_addr); */ return 0; } /* Return TRUE if addr represents a domain name */ -int -proxy_is_domainname(struct dirconn_entry *This) +int proxy_is_domainname(struct dirconn_entry *This) { char *addr = This->name; int i; @@ -1046,12 +1048,10 @@ return 0; /* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */ - for (i=0; isalnum(addr[i]) || addr[i]=='-' || addr[i]=='.'; ++i) - ; + for (i = 0; isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i); - if (addr[i] == ':') - { - fprintf(stderr,"@@@@ handle optional port in proxy_is_domainname()\n"); + if (addr[i] == ':') { + fprintf(stderr, "@@@@ handle optional port in proxy_is_domainname()\n"); /* @@@@ handle optional port */ } @@ -1059,7 +1059,7 @@ return 0; /* Strip trailing dots */ - for (i=strlen(addr)-1; i>0 && addr[i] == '.'; --i) + for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i) addr[i] = '\0'; This->matcher = proxy_match_domainname; @@ -1067,30 +1067,28 @@ } /* Return TRUE if host "host" is in domain "domain" */ -static int -proxy_match_domainname(struct dirconn_entry *This, request_rec *r) +static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r) { const char *host = proxy_get_host_of_request(r); - int d_len=strlen(This->name), h_len; + int d_len = strlen(This->name), h_len; - if (host == NULL) /* some error was logged already */ + if (host == NULL) /* some error was logged already */ return 0; h_len = strlen(host); /* @@@ do this within the setup? */ /* Ignore trailing dots in domain comparison: */ - while (d_len > 0 && This->name[d_len-1] == '.') + while (d_len > 0 && This->name[d_len - 1] == '.') --d_len; - while (h_len > 0 && host[h_len-1] == '.') + while (h_len > 0 && host[h_len - 1] == '.') --h_len; return h_len > d_len - && strncasecmp(&host[h_len-d_len], This->name, d_len) == 0; + && strncasecmp(&host[h_len - d_len], This->name, d_len) == 0; } /* Return TRUE if addr represents a host name */ -int -proxy_is_hostname(struct dirconn_entry *This) +int proxy_is_hostname(struct dirconn_entry *This) { char *addr = This->name; int i; @@ -1100,12 +1098,10 @@ return 0; /* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */ - for (i=0; isalnum(addr[i]) || addr[i]=='-' || addr[i]=='.'; ++i) - ; + for (i = 0; isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i); - if (addr[i] == ':') - { - fprintf(stderr,"@@@@ handle optional port in proxy_is_hostname()\n"); + if (addr[i] == ':') { + fprintf(stderr, "@@@@ handle optional port in proxy_is_hostname()\n"); /* @@@@ handle optional port */ } @@ -1113,7 +1109,7 @@ return 0; /* Strip trailing dots */ - for (i=strlen(addr)-1; i>0 && addr[i] == '.'; --i) + for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i) addr[i] = '\0'; This->matcher = proxy_match_hostname; @@ -1121,59 +1117,55 @@ } /* Return TRUE if host "host" is equal to host2 "host2" */ -static int -proxy_match_hostname(struct dirconn_entry *This, request_rec *r) +static int proxy_match_hostname(struct dirconn_entry *This, request_rec *r) { char *host = This->name; char *host2 = proxy_get_host_of_request(r); - int h2_len=strlen(host2); - int h1_len=strlen(host); + int h2_len = strlen(host2); + int h1_len = strlen(host); #if 0 unsigned long *ip_list; /* Try to deal with multiple IP addr's for a host */ for (ip_list = *This->hostlist.h_addr_list; *ip_list != 0UL; ++ip_list) - if (*ip_list == ?????????????) + if (*ip_list == ? ? ? ? ? ? ? ? ? ? ? ? ?) return 1; #endif /* Ignore trailing dots in host2 comparison: */ - while (h2_len > 0 && host2[h2_len-1] == '.') + while (h2_len > 0 && host2[h2_len - 1] == '.') --h2_len; - while (h1_len > 0 && host[h1_len-1] == '.') + while (h1_len > 0 && host[h1_len - 1] == '.') --h1_len; return h1_len == h2_len && strncasecmp(host, host2, h1_len) == 0; } /* Return TRUE if addr is to be matched as a word */ -int -proxy_is_word(struct dirconn_entry *This) +int proxy_is_word(struct dirconn_entry *This) { This->matcher = proxy_match_word; return 1; } /* Return TRUE if string "str2" occurs literally in "str1" */ -static int -proxy_match_word(struct dirconn_entry *This, request_rec *r) +static int proxy_match_word(struct dirconn_entry *This, request_rec *r) { char *host = proxy_get_host_of_request(r); - return host != NULL && strstr(host, This->name) != NULL; + return host != NULL && strstr(host, This->name) != NULL; } -int -proxy_doconnect(int sock, struct sockaddr_in *addr, request_rec *r) +int proxy_doconnect(int sock, struct sockaddr_in *addr, request_rec *r) { int i; hard_timeout("proxy connect", r); do { - i = connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)); + i = connect(sock, (struct sockaddr *) addr, sizeof(struct sockaddr_in)); #ifdef WIN32 - if(i == SOCKET_ERROR) - errno = WSAGetLastError() - WSABASEERR; + if (i == SOCKET_ERROR) + errno = WSAGetLastError() - WSABASEERR; #endif /* WIN32 */ } while (i == -1 && errno == EINTR); if (i == -1) { 1.1 apachen/src/modules/proxy/.indent.pro Index: .indent.pro =================================================================== -i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 -TBUFF -TFILE -TTRANS -TUINT4 -T_trans -Tallow_options_t -Tapache_sfio -Tarray_header -Tbool_int -Tbuf_area -Tbuff_struct -Tbuffy -Tcmd_how -Tcmd_parms -Tcommand_rec -Tcommand_struct -Tconn_rec -Tcore_dir_config -Tcore_server_config -Tdir_maker_func -Tevent -Tglobals_s -Thandler_func -Thandler_rec -Tjoblist_s -Tlisten_rec -Tmerger_func -Tmode_t -Tmodule -Tmodule_struct -Tmutex -Tn_long -Tother_child_rec -Toverrides_t -Tparent_score -Tpid_t -Tpiped_log -Tpool -Trequest_rec -Trequire_line -Trlim_t -Tscoreboard -Tsemaphore -Tserver_addr_rec -Tserver_rec -Tserver_rec_chain -Tshort_score -Ttable -Ttable_entry -Tthread -Tu_wide_int -Tvtime_t -Twide_int -Tproxy_server_conf