]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Summary: Fix delay pools from aclCheck_t fix. Some code cleanps.
authorrobertc <>
Tue, 28 Jan 2003 13:18:12 +0000 (13:18 +0000)
committerrobertc <>
Tue, 28 Jan 2003 13:18:12 +0000 (13:18 +0000)
Keywords:

Objectify ClientRequestContext.
Delay pools needs ACLChecklist.h.

src/client_side.cc
src/client_side_request.cc
src/client_side_request.h
src/delay_pools.cc
src/protos.h

index acfed4254058f4ff988446f3200920aecc825db8..7930d0e4f84b110e39c4678baf1c652935aaad61 100644 (file)
@@ -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)
 {
index 2b6de0c07691e663d69b63b71407a8c363855260..27dd264c7fa673b28e978d2860e40248240c859f 100644 (file)
@@ -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)
 
 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<ClientRequestContext *>(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 : "<null>");
@@ -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);
 }
index d0f04ded903aa081bb48e574163e934c0535c404..caceb6306db184909bb7845a03bde58f0d4d95d6 100644 (file)
@@ -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 *);
index 1ddff3deda05c08174539938b6199d15266d4357..a11459907b49ed726e05f50f116f3f73a3bf56d6 100644 (file)
@@ -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 <david@luyer.net>
@@ -41,6 +41,7 @@
 #include "Store.h"
 #include "MemObject.h"
 #include "client_side_request.h"
+#include "ACLChecklist.h"
 
 struct _class1DelayPool {
     int delay_class;
index 7054768958f6dbaf17c23bd999b22765e30cd850..43546bc83cac3925bb8711c83b86b295be2ade53 100644 (file)
@@ -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);