1
0
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:
Chuck Murcko
2001-03-11 10:42:14 +00:00
parent 4ee1bd19ff
commit 1dcf2f7754
5 changed files with 4 additions and 275 deletions

View File

@@ -2,7 +2,7 @@ dnl modules enabled in this directory by default
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)

View File

@@ -64,6 +64,7 @@
#include "http_vhost.h"
#include "http_request.h"
#include "util_date.h"
#include "mod_core.h"
/* Some WWW schemes and their default ports; this is basically /etc/services */
/* 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_set = 0;
ap_cache_init(&ps->cache, "mod_proxy cache", s);
return ps;
}

View File

@@ -79,8 +79,6 @@
2. HTTP/1.1
3. Cache issues
Chuck Murcko <chuck@topsail.org> 02-06-01
*/
@@ -108,7 +106,6 @@
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "proxy_cache.h"
extern module AP_MODULE_DECLARE_DATA proxy_module;
@@ -195,7 +192,6 @@ typedef struct {
char viaopt_set;
size_t recv_buffer_size;
char recv_buffer_size_set;
ap_cache_handle_t *cache;
} proxy_server_conf;
struct per_thread_data {
@@ -219,8 +215,10 @@ int ap_proxy_connect_handler(request_rec *r, char *url,
/* proxy_ftp.c */
#if FTP
int ap_proxy_ftp_canon(request_rec *r, char *url);
int ap_proxy_ftp_handler(request_rec *r, ap_cache_el *c, char *url);
#endif
/* 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);
void ap_proxy_sec2hex(int t, char *y);
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_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_hostname(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);
int ap_proxy_garbage_init(server_rec *, apr_pool_t *);
/* 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);
unsigned ap_proxy_bputs2(const char *data, apr_socket_t *client, ap_cache_el *cache);
#endif /*MOD_PROXY_H*/

View File

@@ -459,38 +459,6 @@ int ap_proxy_http_handler(request_rec *r, char *url,
* 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)
ap_rputs(CRLF, r);

View File

@@ -465,115 +465,6 @@ apr_table_t *ap_proxy_read_headers(request_rec *r, char *buffer, int size, conn_
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
* 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';
}
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)
{
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 '.' */
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)
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 */
}
/* 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
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)
{
#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;
}
/* 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;
}