mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
Cache removed, with other spooge
PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88487 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -2,7 +2,7 @@ dnl modules enabled in this directory by default
|
|||||||
|
|
||||||
APACHE_MODPATH_INIT(proxy)
|
APACHE_MODPATH_INIT(proxy)
|
||||||
|
|
||||||
proxy_objs="mod_proxy.lo proxy_connect.lo proxy_cache.lo proxy_http.lo proxy_util.lo"
|
proxy_objs="mod_proxy.lo proxy_connect.lo proxy_http.lo proxy_util.lo"
|
||||||
|
|
||||||
APACHE_MODULE(proxy, Apache proxy module, $proxy_objs, , no)
|
APACHE_MODULE(proxy, Apache proxy module, $proxy_objs, , no)
|
||||||
|
|
||||||
|
@@ -64,6 +64,7 @@
|
|||||||
#include "http_vhost.h"
|
#include "http_vhost.h"
|
||||||
#include "http_request.h"
|
#include "http_request.h"
|
||||||
#include "util_date.h"
|
#include "util_date.h"
|
||||||
|
#include "mod_core.h"
|
||||||
|
|
||||||
/* Some WWW schemes and their default ports; this is basically /etc/services */
|
/* Some WWW schemes and their default ports; this is basically /etc/services */
|
||||||
/* This will become global when the protocol abstraction comes */
|
/* This will become global when the protocol abstraction comes */
|
||||||
@@ -427,7 +428,6 @@ static void * create_proxy_config(apr_pool_t *p, server_rec *s)
|
|||||||
ps->recv_buffer_size = 0; /* this default was left unset for some reason */
|
ps->recv_buffer_size = 0; /* this default was left unset for some reason */
|
||||||
ps->recv_buffer_size_set = 0;
|
ps->recv_buffer_size_set = 0;
|
||||||
|
|
||||||
ap_cache_init(&ps->cache, "mod_proxy cache", s);
|
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -79,8 +79,6 @@
|
|||||||
|
|
||||||
2. HTTP/1.1
|
2. HTTP/1.1
|
||||||
|
|
||||||
3. Cache issues
|
|
||||||
|
|
||||||
Chuck Murcko <chuck@topsail.org> 02-06-01
|
Chuck Murcko <chuck@topsail.org> 02-06-01
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@@ -108,7 +106,6 @@
|
|||||||
#include "httpd.h"
|
#include "httpd.h"
|
||||||
#include "http_config.h"
|
#include "http_config.h"
|
||||||
#include "http_protocol.h"
|
#include "http_protocol.h"
|
||||||
#include "proxy_cache.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern module AP_MODULE_DECLARE_DATA proxy_module;
|
extern module AP_MODULE_DECLARE_DATA proxy_module;
|
||||||
@@ -195,7 +192,6 @@ typedef struct {
|
|||||||
char viaopt_set;
|
char viaopt_set;
|
||||||
size_t recv_buffer_size;
|
size_t recv_buffer_size;
|
||||||
char recv_buffer_size_set;
|
char recv_buffer_size_set;
|
||||||
ap_cache_handle_t *cache;
|
|
||||||
} proxy_server_conf;
|
} proxy_server_conf;
|
||||||
|
|
||||||
struct per_thread_data {
|
struct per_thread_data {
|
||||||
@@ -219,8 +215,10 @@ int ap_proxy_connect_handler(request_rec *r, char *url,
|
|||||||
|
|
||||||
/* proxy_ftp.c */
|
/* proxy_ftp.c */
|
||||||
|
|
||||||
|
#if FTP
|
||||||
int ap_proxy_ftp_canon(request_rec *r, char *url);
|
int ap_proxy_ftp_canon(request_rec *r, char *url);
|
||||||
int ap_proxy_ftp_handler(request_rec *r, ap_cache_el *c, char *url);
|
int ap_proxy_ftp_handler(request_rec *r, ap_cache_el *c, char *url);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* proxy_http.c */
|
/* proxy_http.c */
|
||||||
|
|
||||||
@@ -245,20 +243,13 @@ void ap_proxy_hash(const char *it, char *val, int ndepth, int nlength);
|
|||||||
int ap_proxy_hex2sec(const char *x);
|
int ap_proxy_hex2sec(const char *x);
|
||||||
void ap_proxy_sec2hex(int t, char *y);
|
void ap_proxy_sec2hex(int t, char *y);
|
||||||
const char *ap_proxy_host2addr(const char *host, struct hostent *reqhp);
|
const char *ap_proxy_host2addr(const char *host, struct hostent *reqhp);
|
||||||
int ap_proxy_cache_send(request_rec *r, ap_cache_el *c);
|
|
||||||
int ap_proxy_cache_should_cache(request_rec *r, apr_table_t *resp_hdrs,
|
|
||||||
const int is_HTTP1);
|
|
||||||
int ap_proxy_cache_update(ap_cache_el *c);
|
|
||||||
void ap_proxy_cache_error(ap_cache_el **r);
|
|
||||||
int ap_proxyerror(request_rec *r, int statuscode, const char *message);
|
int ap_proxyerror(request_rec *r, int statuscode, const char *message);
|
||||||
int ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
|
int ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
|
||||||
int ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
|
int ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
|
||||||
int ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
|
int ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
|
||||||
int ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
|
int ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
|
||||||
apr_status_t ap_proxy_doconnect(apr_socket_t *sock, char *host, apr_uint32_t port, request_rec *r);
|
apr_status_t ap_proxy_doconnect(apr_socket_t *sock, char *host, apr_uint32_t port, request_rec *r);
|
||||||
int ap_proxy_garbage_init(server_rec *, apr_pool_t *);
|
|
||||||
/* This function is called by ap_table_do() for all header lines */
|
/* This function is called by ap_table_do() for all header lines */
|
||||||
int ap_proxy_send_hdr_line(void *p, const char *key, const char *value);
|
int ap_proxy_send_hdr_line(void *p, const char *key, const char *value);
|
||||||
unsigned ap_proxy_bputs2(const char *data, apr_socket_t *client, ap_cache_el *cache);
|
|
||||||
|
|
||||||
#endif /*MOD_PROXY_H*/
|
#endif /*MOD_PROXY_H*/
|
||||||
|
@@ -459,38 +459,6 @@ int ap_proxy_http_handler(request_rec *r, char *url,
|
|||||||
* one type
|
* one type
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (ap_cache_el_header(c, "Date", &datestr) == APR_SUCCESS)
|
|
||||||
ap_cache_el_header_set(c, "Date", ap_proxy_date_canon(p, datestr));
|
|
||||||
if (ap_cache_el_header(c, "Last-Modified", &datestr) == APR_SUCCESS)
|
|
||||||
ap_cache_el_header_set(c, "Last-Modified", ap_proxy_date_canon(p, datestr));
|
|
||||||
if (ap_cache_el_header(c, "Expires", &datestr) == APR_SUCCESS)
|
|
||||||
ap_cache_el_header_set(c, "Expires", ap_proxy_date_canon(p, datestr));
|
|
||||||
|
|
||||||
if (ap_cache_el_header(c, "Location", &datestr) == APR_SUCCESS)
|
|
||||||
ap_cache_el_header_set(c, "Location", proxy_location_reverse_map(r, datestr));
|
|
||||||
if (ap_cache_el_header(c, "URI", &datestr) == APR_SUCCESS)
|
|
||||||
ap_cache_el_header_set(c, "URI", proxy_location_reverse_map(r, datestr));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* write status line */
|
|
||||||
#if 0
|
|
||||||
if (!r->assbackwards)
|
|
||||||
ap_rvputs(r, "HTTP/1.0 ", r->status_line, CRLF, NULL);
|
|
||||||
|
|
||||||
if (cachefp && apr_file_puts(apr_pstrcat(r->pool, "HTTP/1.0 ",
|
|
||||||
r->status_line, CRLF, NULL), cachefp) != APR_SUCCESS) {
|
|
||||||
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
|
|
||||||
"proxy: error writing status line to cache");
|
|
||||||
ap_proxy_cache_error(&c);
|
|
||||||
cachefp = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* send headers */
|
|
||||||
ap_cache_el_header_walk(c, ap_proxy_send_hdr_line, r, NULL);
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
if (!r->assbackwards)
|
if (!r->assbackwards)
|
||||||
ap_rputs(CRLF, r);
|
ap_rputs(CRLF, r);
|
||||||
|
@@ -465,115 +465,6 @@ apr_table_t *ap_proxy_read_headers(request_rec *r, char *buffer, int size, conn_
|
|||||||
return resp_hdrs;
|
return resp_hdrs;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
long int ap_proxy_send_fb(proxy_completion *completion, BUFF *f, request_rec *r, ap_cache_el *c)
|
|
||||||
{
|
|
||||||
int ok;
|
|
||||||
char buf[IOBUFSIZE];
|
|
||||||
long total_bytes_rcvd, in_buffer;
|
|
||||||
apr_ssize_t cntr;
|
|
||||||
register int n, o;
|
|
||||||
conn_rec *con = r->connection;
|
|
||||||
int alternate_timeouts = 1; /* 1 if we alternate between soft & hard timeouts */
|
|
||||||
apr_file_t *cachefp = NULL;
|
|
||||||
int written = 0, wrote_to_cache;
|
|
||||||
|
|
||||||
total_bytes_rcvd = 0;
|
|
||||||
if (c) ap_cache_el_data(c, &cachefp);
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
/* The cache copy is ASCII, not EBCDIC, even for text/html) */
|
|
||||||
ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
|
|
||||||
if (c != NULL && c->fp != NULL)
|
|
||||||
ap_bsetflag(c->fp, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
|
|
||||||
ap_bsetflag(con->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Since we are reading from one buffer and writing to another,
|
|
||||||
* it is unsafe to do a soft_timeout here, at least until the proxy
|
|
||||||
* has its own timeout handler which can set both buffers to EOUT.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(WIN32) || defined(TPF) || defined(NETWARE)
|
|
||||||
/* works fine under win32, so leave it */
|
|
||||||
alternate_timeouts = 0;
|
|
||||||
#else
|
|
||||||
/* CHECKME! Since hard_timeout won't work in unix on sends with partial
|
|
||||||
* cache completion, we have to alternate between hard_timeout
|
|
||||||
* for reads, and soft_timeout for send. This is because we need
|
|
||||||
* to get a return from ap_bwrite to be able to continue caching.
|
|
||||||
* BUT, if we *can't* continue anyway, just use hard_timeout.
|
|
||||||
* (Also, if no cache file is written, use hard timeouts)
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!completion || completion->content_length > 0
|
|
||||||
|| completion->cache_completion == 1.0) {
|
|
||||||
alternate_timeouts = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Loop and ap_bread() while we can successfully read and write,
|
|
||||||
* or (after the client aborted) while we can successfully
|
|
||||||
* read and finish the configured cache_completion.
|
|
||||||
*/
|
|
||||||
for (ok = 1; ok; cntr = 0) {
|
|
||||||
/* Read block from server */
|
|
||||||
if (ap_bread(f, buf, IOBUFSIZE, &cntr) != APR_SUCCESS && !cntr)
|
|
||||||
{
|
|
||||||
if (c != NULL) {
|
|
||||||
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
|
|
||||||
"proxy: error reading from %s", c->name);
|
|
||||||
ap_proxy_cache_error(&c);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(cntr == 0) break;
|
|
||||||
|
|
||||||
/* Write to cache first. */
|
|
||||||
/*@@@ XXX FIXME: Assuming that writing the cache file won't time out?!!? */
|
|
||||||
wrote_to_cache = cntr;
|
|
||||||
if (cachefp && apr_file_write(cachefp, &buf[0], &wrote_to_cache) != APR_SUCCESS) {
|
|
||||||
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
|
|
||||||
"proxy: error writing to cache");
|
|
||||||
ap_proxy_cache_error(&c);
|
|
||||||
} else {
|
|
||||||
written += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
o = 0;
|
|
||||||
total_bytes_rcvd += cntr;
|
|
||||||
in_buffer = cntr;
|
|
||||||
|
|
||||||
/* Write the block to the client, detect aborted transfers */
|
|
||||||
while (!con->aborted && in_buffer > 0) {
|
|
||||||
if ((cntr = ap_rwrite(&buf[o], in_buffer, r))) {
|
|
||||||
if (completion) {
|
|
||||||
/* when a send failure occurs, we need to decide
|
|
||||||
* whether to continue loading and caching the
|
|
||||||
* document, or to abort the whole thing
|
|
||||||
*/
|
|
||||||
ok = (completion->content_length > 0) &&
|
|
||||||
(completion->cache_completion > 0) &&
|
|
||||||
(completion->content_length * completion->cache_completion < total_bytes_rcvd);
|
|
||||||
|
|
||||||
if (!ok)
|
|
||||||
ap_proxy_cache_error(&c);
|
|
||||||
}
|
|
||||||
con->aborted = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
in_buffer -= cntr;
|
|
||||||
o += cntr;
|
|
||||||
} /* while client alive and more data to send */
|
|
||||||
} /* loop and ap_bread while "ok" */
|
|
||||||
|
|
||||||
if (!con->aborted)
|
|
||||||
ap_rflush(r);
|
|
||||||
|
|
||||||
return total_bytes_rcvd;
|
|
||||||
}
|
|
||||||
#endif /* 0, ap_proxy_send_fb */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sends response line and headers. Uses the client fd and the
|
* Sends response line and headers. Uses the client fd and the
|
||||||
* headers_out array from the passed request_rec to talk to the client
|
* headers_out array from the passed request_rec to talk to the client
|
||||||
@@ -680,17 +571,6 @@ void ap_proxy_sec2hex(int t, char *y)
|
|||||||
y[8] = '\0';
|
y[8] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ap_proxy_cache_error(ap_cache_el **c)
|
|
||||||
{
|
|
||||||
if (c && *c) {
|
|
||||||
const char *name = (*c)->name;
|
|
||||||
ap_cache_el_finalize((*c));
|
|
||||||
ap_cache_remove((*c)->cache, name);
|
|
||||||
*c = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ap_proxyerror(request_rec *r, int statuscode, const char *message)
|
int ap_proxyerror(request_rec *r, int statuscode, const char *message)
|
||||||
{
|
{
|
||||||
apr_table_setn(r->notes, "error-notes",
|
apr_table_setn(r->notes, "error-notes",
|
||||||
@@ -1091,14 +971,6 @@ int ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p)
|
|||||||
/* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */
|
/* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */
|
||||||
for (i = 0; apr_isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i);
|
for (i = 0; apr_isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i);
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (addr[i] == ':') {
|
|
||||||
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
|
|
||||||
"@@@@ handle optional port in proxy_is_hostname()");
|
|
||||||
/* @@@@ handle optional port */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (addr[i] != '\0' || ap_proxy_host2addr(addr, &host) != NULL)
|
if (addr[i] != '\0' || ap_proxy_host2addr(addr, &host) != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -1187,19 +1059,6 @@ int ap_proxy_send_hdr_line(void *p, const char *key, const char *value)
|
|||||||
return 1; /* tell ap_table_do() to continue calling us for more headers */
|
return 1; /* tell ap_table_do() to continue calling us for more headers */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* send a text line to one or two BUFF's; return line length */
|
|
||||||
unsigned ap_proxy_bputs2(const char *data, apr_socket_t *client, ap_cache_el *cache)
|
|
||||||
{
|
|
||||||
unsigned len = strlen(data);
|
|
||||||
apr_file_t *cachefp = NULL;
|
|
||||||
|
|
||||||
apr_send(client, data, &len);
|
|
||||||
|
|
||||||
if (ap_cache_el_data(cache, &cachefp) == APR_SUCCESS)
|
|
||||||
apr_file_puts(data, cachefp);
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined WIN32
|
#if defined WIN32
|
||||||
|
|
||||||
static DWORD tls_index;
|
static DWORD tls_index;
|
||||||
@@ -1230,94 +1089,5 @@ BOOL WINAPI DllMain (HINSTANCE dllhandle, DWORD reason, LPVOID reserved)
|
|||||||
|
|
||||||
static struct per_thread_data *get_per_thread_data(void)
|
static struct per_thread_data *get_per_thread_data(void)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
#if defined(WIN32)
|
|
||||||
|
|
||||||
return (struct per_thread_data *) TlsGetValue (tls_index);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static APACHE_TLS struct per_thread_data sptd;
|
|
||||||
return &sptd;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function is completely bogus. This should become a part of the
|
|
||||||
* cache filter when it is finished. RBB
|
|
||||||
*/
|
|
||||||
int ap_proxy_cache_send(request_rec *r, ap_cache_el *c)
|
|
||||||
{
|
|
||||||
apr_file_t *cachefp = NULL;
|
|
||||||
apr_socket_t *fp = r->connection->client_socket;
|
|
||||||
char buffer[500];
|
|
||||||
apr_size_t len;
|
|
||||||
apr_off_t offset = 0;
|
|
||||||
apr_finfo_t finfo;
|
|
||||||
|
|
||||||
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, NULL,
|
|
||||||
"Sending cache file for %s", c->name);
|
|
||||||
if(ap_cache_el_data(c, &cachefp) != APR_SUCCESS)
|
|
||||||
return HTTP_INTERNAL_SERVER_ERROR;
|
|
||||||
/* send the response */
|
|
||||||
if(apr_file_gets(buffer, sizeof(buffer), cachefp)) {
|
|
||||||
len = strlen(buffer);
|
|
||||||
apr_send(fp, buffer, &len);
|
|
||||||
offset +=len;
|
|
||||||
}
|
|
||||||
/* send headers */
|
|
||||||
ap_cache_el_header_walk(c, ap_proxy_send_hdr_line, r, NULL);
|
|
||||||
len = 2;
|
|
||||||
apr_send(fp, CRLF, &len);
|
|
||||||
/* send data */
|
|
||||||
apr_file_info_get(&finfo, APR_FINFO_MIN, cachefp);
|
|
||||||
if(!r->header_only && ap_send_fd(cachefp, r, offset, finfo.size, &len))
|
|
||||||
return HTTP_INTERNAL_SERVER_ERROR;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ap_proxy_cache_should_cache(request_rec *r, apr_table_t *resp_hdrs, const int is_HTTP1)
|
|
||||||
{
|
|
||||||
const char *expire = apr_table_get(resp_hdrs, "Expires");
|
|
||||||
time_t expc;
|
|
||||||
if (expire != NULL)
|
|
||||||
expc = ap_parseHTTPdate(expire);
|
|
||||||
else
|
|
||||||
expc = BAD_DATE;
|
|
||||||
if((r->status != HTTP_OK && r->status != HTTP_MOVED_PERMANENTLY && r->status != HTTP_NOT_MODIFIED) ||
|
|
||||||
(r->status == HTTP_NOT_MODIFIED) ||
|
|
||||||
r->header_only ||
|
|
||||||
apr_table_get(r->headers_in, "Authorization") != NULL ||
|
|
||||||
(expire != NULL && expc == BAD_DATE) ||
|
|
||||||
(r->status == HTTP_OK && !apr_table_get(resp_hdrs, "Last-Modified") && is_HTTP1))
|
|
||||||
{
|
|
||||||
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, NULL,
|
|
||||||
"proxy: Response is not cacheable: %s", r->unparsed_uri);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* what responses should we not cache?
|
|
||||||
* Unknown status responses and those known to be uncacheable
|
|
||||||
* 304 HTTP_NOT_MODIFIED response when we have no valid cache file, or
|
|
||||||
* 200 HTTP_OK response from HTTP/1.0 and up without a Last-Modified header, or
|
|
||||||
* HEAD requests, or
|
|
||||||
* requests with an Authorization header, or
|
|
||||||
* protocol requests nocache (e.g. ftp with user/password)
|
|
||||||
*/
|
|
||||||
/* @@@ XXX FIXME: is the test "r->status != HTTP_MOVED_PERMANENTLY" correct?
|
|
||||||
* or shouldn't it be "ap_is_HTTP_REDIRECT(r->status)" ? -MnKr */
|
|
||||||
int ap_proxy_cache_update(ap_cache_el *c)
|
|
||||||
{
|
|
||||||
ap_cache_handle_t *h = c ? c->cache : NULL;
|
|
||||||
if(!h) return DECLINED;
|
|
||||||
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, NULL,
|
|
||||||
"proxy: Cache finalized: %s", c->name);
|
|
||||||
ap_cache_el_finalize(c);
|
|
||||||
ap_cache_garbage_collect(h);
|
|
||||||
return DECLINED;
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user