From: robertc <> Date: Tue, 28 Jan 2003 13:18:12 +0000 (+0000) Subject: Summary: Fix delay pools from aclCheck_t fix. Some code cleanps. X-Git-Tag: SQUID_3_0_PRE1~418 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8e2745f409e96a077ec715b8fbb7b2fdc06500bf;p=thirdparty%2Fsquid.git Summary: Fix delay pools from aclCheck_t fix. Some code cleanps. Keywords: Objectify ClientRequestContext. Delay pools needs ACLChecklist.h. --- diff --git a/src/client_side.cc b/src/client_side.cc index acfed42540..7930d0e4f8 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -1,6 +1,6 @@ /* - * $Id: client_side.cc,v 1.615 2003/01/28 01:29:33 robertc Exp $ + * $Id: client_side.cc,v 1.616 2003/01/28 06:18:12 robertc Exp $ * * DEBUG: section 33 Client-side Routines * AUTHOR: Duane Wessels @@ -1739,7 +1739,6 @@ clientAfterReadingRequests(int fd, ConnStateData *conn, int do_next_read) clientMaybeReadData (conn, do_next_read); } - static void clientProcessRequest(ConnStateData *conn, ClientSocketContext *context, method_t method, char *prefix, size_t req_line_sz) { diff --git a/src/client_side_request.cc b/src/client_side_request.cc index 2b6de0c076..27dd264c7f 100644 --- a/src/client_side_request.cc +++ b/src/client_side_request.cc @@ -1,6 +1,6 @@ /* - * $Id: client_side_request.cc,v 1.10 2003/01/28 01:29:34 robertc Exp $ + * $Id: client_side_request.cc,v 1.11 2003/01/28 06:18:13 robertc Exp $ * * DEBUG: section 85 Client-side Request Routines * AUTHOR: Robert Collins (Originally Duane Wessels in client_side.c) @@ -53,18 +53,57 @@ static const char *const crlf = "\r\n"; -typedef struct _clientRequestContext { +class ClientRequestContext { + public: + void *operator new(size_t); + void operator delete(void *); + void deleteSelf() const; + + ClientRequestContext(); + ClientRequestContext(ClientHttpRequest *); + ~ClientRequestContext(); + + void checkNoCache(); + ACLChecklist *acl_checklist; /* need ptr back so we can unreg if needed */ int redirect_state; clientHttpRequest *http; -} clientRequestContext; + private: + CBDATA_CLASS(ClientRequestContext); + static void CheckNoCacheDone(int answer, void *data); + void checkNoCacheDone(int answer); +}; -CBDATA_TYPE(clientRequestContext); +CBDATA_CLASS_INIT(ClientRequestContext); + +void * +ClientRequestContext::operator new (size_t size) +{ + assert (size == sizeof(ClientRequestContext)); + CBDATA_INIT_TYPE(ClientRequestContext); + ClientRequestContext *result = cbdataAlloc(ClientRequestContext); + /* Mark result as being owned - we want the refcounter to do the delete + * call */ + cbdataReference(result); + return result; +} + +void +ClientRequestContext::operator delete (void *address) +{ + ClientRequestContext *t = static_cast(address); + cbdataFree(address); + /* And allow the memory to be freed */ + cbdataReferenceDone (t); +} + +void +ClientRequestContext::deleteSelf() const +{ + delete this; +} /* Local functions */ -/* clientRequestContext */ -clientRequestContext *clientRequestContextNew(clientHttpRequest *); -FREE clientRequestContextFree; /* other */ static int checkAccelOnly(clientHttpRequest *); static void clientAccessCheckDone(int, void *); @@ -72,35 +111,30 @@ static int clientCachable(clientHttpRequest * http); static int clientHierarchical(clientHttpRequest * http); static void clientInterpretRequestHeaders(clientHttpRequest * http); static RH clientRedirectDone; -static void clientCheckNoCache(clientRequestContext * context); -static void clientCheckNoCacheDone(int answer, void *data); -void clientProcessRequest(clientHttpRequest *); extern "C" CSR clientGetMoreData; extern "C" CSS clientReplyStatus; extern "C" CSD clientReplyDetach; static void checkFailureRatio(err_type, hier_code); -void -clientRequestContextFree(void *data) +ClientRequestContext::~ClientRequestContext() +{ + if (http) + cbdataReferenceDone(http); + if (acl_checklist) + aclChecklistFree(acl_checklist); +} + +ClientRequestContext::ClientRequestContext() : acl_checklist (NULL), redirect_state (REDIRECT_NONE), http(NULL) { - clientRequestContext *context = (clientRequestContext *)data; - cbdataReferenceDone(context->http); - if (context->acl_checklist) - aclChecklistFree(context->acl_checklist); } -clientRequestContext * -clientRequestContextNew(clientHttpRequest * http) +ClientRequestContext::ClientRequestContext(ClientHttpRequest *newHttp) : acl_checklist (NULL), redirect_state (REDIRECT_NONE), http(cbdataReference(newHttp)) { - clientRequestContext *rv; - assert(http != NULL); - CBDATA_INIT_TYPE_FREECB(clientRequestContext, clientRequestContextFree); - rv = cbdataAlloc(clientRequestContext); - rv->http = cbdataReference(http); - return rv; + assert (newHttp != NULL); } CBDATA_CLASS_INIT(ClientHttpRequest); + void * ClientHttpRequest::operator new (size_t size) { @@ -298,10 +332,9 @@ checkAccelOnly(clientHttpRequest * http) /* This is the entry point for external users of the client_side routines */ void -clientAccessCheck(void *data) +clientAccessCheck(ClientHttpRequest *http) { - clientHttpRequest *http = (clientHttpRequest *)data; - clientRequestContext *context = clientRequestContextNew(http); + ClientRequestContext *context = new ClientRequestContext(http); if (checkAccelOnly(http)) { /* deny proxy requests in accel_only mode */ debug(85, @@ -317,7 +350,7 @@ clientAccessCheck(void *data) void clientAccessCheckDone(int answer, void *data) { - clientRequestContext *context = (clientRequestContext *)data; + ClientRequestContext *context = (ClientRequestContext *)data; clientHttpRequest *http = context->http; err_type page_id; http_status status; @@ -339,7 +372,7 @@ clientAccessCheckDone(int answer, void *data) } else { /* Send an error */ clientStreamNode *node = (clientStreamNode *)http->client_stream.tail->prev->data; - cbdataFree(context); + context->deleteSelf(); debug(85, 5) ("Access Denied: %s\n", http->uri); debug(85, 5) ("AclMatchedName = %s\n", AclMatchedName ? AclMatchedName : ""); @@ -584,7 +617,7 @@ clientInterpretRequestHeaders(clientHttpRequest * http) void clientRedirectDone(void *data, char *result) { - clientRequestContext *context = (clientRequestContext *)data; + ClientRequestContext *context = (ClientRequestContext *)data; clientHttpRequest *http = context->http; request_t *new_request = NULL; request_t *old_request = http->request; @@ -639,39 +672,44 @@ clientRedirectDone(void *data, char *result) if (http->conn) fd_note(http->conn->fd, http->uri); assert(http->uri); - clientCheckNoCache(context); + context->checkNoCache(); } void -clientCheckNoCache(clientRequestContext * context) +ClientRequestContext::checkNoCache() { - clientHttpRequest *http = context->http; if (Config.accessList.noCache && http->request->flags.cachable) { - context->acl_checklist = + acl_checklist = clientAclChecklistCreate(Config.accessList.noCache, http); - aclNBCheck(context->acl_checklist, clientCheckNoCacheDone, cbdataReference(context)); + aclNBCheck(acl_checklist, CheckNoCacheDone, cbdataReference(this)); } else { - clientCheckNoCacheDone(http->request->flags.cachable, cbdataReference(context)); + CheckNoCacheDone(http->request->flags.cachable, cbdataReference(this)); } } void -clientCheckNoCacheDone(int answer, void *data) +ClientRequestContext::CheckNoCacheDone(int answer, void *data) { void *temp; bool valid = cbdataReferenceValidDone(data, &temp); + /* acl NB calls cannot invalidate cbdata in the normal course of things */ assert (valid); - clientRequestContext *context = (clientRequestContext *)temp; - - context->acl_checklist = NULL; - clientHttpRequest *http = context->http; - cbdataFree(context); + ClientRequestContext *context = (ClientRequestContext *)temp; + context->checkNoCacheDone(answer); +} - if (!cbdataReferenceValid (http)) +void +ClientRequestContext::checkNoCacheDone(int answer) +{ + acl_checklist = NULL; + clientHttpRequest *http_ = http; + deleteSelf(); + + if (!cbdataReferenceValid (http_)) return; - http->request->flags.cachable = answer; - clientProcessRequest(http); + http_->request->flags.cachable = answer; + http_->processRequest(); } /* @@ -680,23 +718,27 @@ clientCheckNoCacheDone(int answer, void *data) * them. */ void -clientProcessRequest(clientHttpRequest * http) +ClientHttpRequest::processRequest() { - request_t *r = http->request; debug(85, 4) ("clientProcessRequest: %s '%s'\n", - RequestMethodStr[r->method], http->uri); - if (r->method == METHOD_CONNECT) { - http->logType = LOG_TCP_MISS; - sslStart(http, &http->out.size, &http->al.http.code); + RequestMethodStr[request->method], uri); + if (request->method == METHOD_CONNECT) { + logType = LOG_TCP_MISS; + sslStart(this, &out.size, &al.http.code); return; - } else { - http->logType = LOG_TAG_NONE; } - debug(85, 4) ("clientProcessRequest: %s for '%s'\n", - log_tags[http->logType], http->uri); + httpStart(); +} + +void +ClientHttpRequest::httpStart() +{ + logType = LOG_TAG_NONE; + debug(85, 4) ("ClientHttpRequest::httpStart: %s for '%s'\n", + log_tags[logType], uri); /* no one should have touched this */ - assert(http->out.offset == 0); + assert(out.offset == 0); /* Use the Stream Luke */ - clientStreamNode *node = (clientStreamNode *)http->client_stream.tail->data; - clientStreamRead(node, http, node->readBuffer); + clientStreamNode *node = (clientStreamNode *)client_stream.tail->data; + clientStreamRead(node, this, node->readBuffer); } diff --git a/src/client_side_request.h b/src/client_side_request.h index d0f04ded90..caceb6306d 100644 --- a/src/client_side_request.h +++ b/src/client_side_request.h @@ -1,6 +1,6 @@ /* - * $Id: client_side_request.h,v 1.4 2003/01/28 01:29:34 robertc Exp $ + * $Id: client_side_request.h,v 1.5 2003/01/28 06:18:13 robertc Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -61,6 +61,8 @@ public: void logRequest(); MemObject * memObject() const; bool multipartRangeRequest() const; + void processRequest(); + void httpStart(); ConnStateData *conn; request_t *request; /* Parsed URL ... */ char *uri; @@ -100,6 +102,7 @@ SQUIDCEXTERN char *clientConstructTraceEcho(clientHttpRequest *); SQUIDCEXTERN ACLChecklist *clientAclChecklistCreate(const acl_access * acl, const clientHttpRequest * http); SQUIDCEXTERN void *clientReplyNewContext(clientHttpRequest *); SQUIDCEXTERN int clientHttpRequestStatus(int fd, clientHttpRequest const *http); +SQUIDCEXTERN void clientAccessCheck(ClientHttpRequest *); /* ones that should be elsewhere */ SQUIDCEXTERN void redirectStart(clientHttpRequest *, RH *, void *); diff --git a/src/delay_pools.cc b/src/delay_pools.cc index 1ddff3deda..a11459907b 100644 --- a/src/delay_pools.cc +++ b/src/delay_pools.cc @@ -1,6 +1,6 @@ /* - * $Id: delay_pools.cc,v 1.31 2003/01/28 01:29:34 robertc Exp $ + * $Id: delay_pools.cc,v 1.32 2003/01/28 06:18:13 robertc Exp $ * * DEBUG: section 77 Delay Pools * AUTHOR: David Luyer @@ -41,6 +41,7 @@ #include "Store.h" #include "MemObject.h" #include "client_side_request.h" +#include "ACLChecklist.h" struct _class1DelayPool { int delay_class; diff --git a/src/protos.h b/src/protos.h index 7054768958..43546bc83c 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.461 2003/01/28 01:29:35 robertc Exp $ + * $Id: protos.h,v 1.462 2003/01/28 06:18:13 robertc Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -135,7 +135,6 @@ SQUIDCEXTERN int clientdbCutoffDenied(struct in_addr); SQUIDCEXTERN void clientdbDump(StoreEntry *); SQUIDCEXTERN void clientdbFreeMemory(void); SQUIDCEXTERN int clientdbEstablished(struct in_addr, int); -SQUIDCEXTERN void clientAccessCheck(void *); SQUIDCEXTERN void clientOpenListenSockets(void); SQUIDCEXTERN void clientHttpConnectionsClose(void); SQUIDCEXTERN void clientReadBody(request_t * req, char *buf, size_t size, CBCB * callback, void *data);