Revision: 14401
Author: adrian.chadd
Date: Thu Feb 11 23:26:11 2010
Log: Begin breaking out the client-side request body related routines.


http://code.google.com/p/lusca-cache/source/detail?r=14401

Added:
 /branches/LUSCA_HEAD/src/client_side_body.c
 /branches/LUSCA_HEAD/src/client_side_body.h
Modified:
 /branches/LUSCA_HEAD/src/Makefile.am
 /branches/LUSCA_HEAD/src/client_side.c
 /branches/LUSCA_HEAD/src/client_side.h

=======================================
--- /dev/null
+++ /branches/LUSCA_HEAD/src/client_side_body.c Thu Feb 11 23:26:11 2010
@@ -0,0 +1,158 @@
+#include "squid.h"
+#include "client_side_body.h"
+
+static void
+clientEatRequestBodyHandler(char *buf, ssize_t size, void *data)
+{
+    clientHttpRequest *http = data;
+    ConnStateData *conn = http->conn;
+    if (buf && size < 0) {
+       return;                 /* Aborted, don't care */
+    }
+    if (conn->body.size_left > 0) {
+       conn->body.callback = clientEatRequestBodyHandler;
+       conn->body.cbdata = http;
+       cbdataLock(conn->body.cbdata);
+       conn->body.buf = NULL;
+       conn->body.bufsize = SQUID_TCP_SO_RCVBUF;
+       clientProcessBody(conn);
+    } else {
+       if (http->request->flags.proxy_keepalive) {
+ debug(33, 5) ("clientEatRequestBodyHandler: FD %d Keeping Alive\n", conn->fd);
+           clientKeepaliveNextRequest(http);
+       } else {
+           comm_close(conn->fd);
+       }
+    }
+}
+
+void
+clientEatRequestBody(clientHttpRequest * http)
+{
+    ConnStateData *conn = http->conn;
+    cbdataLock(conn);
+    if (conn->body.request)
+       requestAbortBody(conn->body.request);
+    if (cbdataValid(conn))
+       clientEatRequestBodyHandler(NULL, -1, http);
+    cbdataUnlock(conn);
+}
+
+/* Called by clientReadRequest to process body content */
+void
+clientProcessBody(ConnStateData * conn)
+{
+    int size;
+    char *buf = conn->body.buf;
+    void *cbdata = conn->body.cbdata;
+    CBCB *callback = conn->body.callback;
+    request_t *request = conn->body.request;
+    /* Note: request is null while eating "aborted" transfers */
+ debug(33, 2) ("clientProcessBody: start fd=%d body_size=%lu in.offset=%ld cb=%p req=%p\n", conn->fd, (unsigned long int) conn->body.size_left, (long int) conn->in.offset, callback, request);
+    if (conn->in.offset) {
+       int valid = cbdataValid(conn->body.cbdata);
+       if (!valid) {
+           comm_close(conn->fd);
+           return;
+       }
+       /* Some sanity checks... */
+       assert(conn->body.size_left > 0);
+       assert(conn->in.offset > 0);
+       assert(callback != NULL);
+       /* How much do we have to process? */
+       size = conn->in.offset;
+       if (size > conn->body.size_left)  /* only process the body part */
+           size = conn->body.size_left;
+       if (size > conn->body.bufsize)    /* don't copy more than requested */
+           size = conn->body.bufsize;
+       if (valid && buf)
+           xmemcpy(buf, conn->in.buf, size);
+       conn->body.size_left -= size;
+       /* Move any remaining data */
+       conn->in.offset -= size;
+       /* Resume the fd if necessary */
+       if (conn->in.offset < conn->in.size - 1)
+           commResumeFD(conn->fd);
+       if (conn->in.offset > 0)
+           xmemmove(conn->in.buf, conn->in.buf + size, conn->in.offset);
+       /* Remove request link if this is the last part of the body, as
+        * clientReadRequest automatically continues to process next request */
+       if (conn->body.size_left <= 0 && request != NULL) {
+           request->body_reader = NULL;
+           if (request->body_reader_data)
+               cbdataUnlock(request->body_reader_data);
+           request->body_reader_data = NULL;
+       }
+       /* Remove clientReadBody arguments (the call is completed) */
+       conn->body.request = NULL;
+       conn->body.callback = NULL;
+       cbdataUnlock(conn->body.cbdata);
+       conn->body.cbdata = NULL;
+       conn->body.buf = NULL;
+       conn->body.bufsize = 0;
+       /* Remember that we have touched the body, not restartable */
+       if (request != NULL)
+           request->flags.body_sent = 1;
+       /* Invoke callback function */
+       if (valid)
+           callback(buf, size, cbdata);
+       if (request != NULL)
+           requestUnlink(request);     /* Linked in clientReadBody */
+ debug(33, 2) ("clientProcessBody: end fd=%d size=%d body_size=%lu in.offset=%ld cb=%p req=%p\n", conn->fd, size, (unsigned long int) conn->body.size_left, (long int) conn->in.offset, callback, request);
+    }
+}
+
+/* Abort a body request */
+static void
+clientAbortBody(request_t * request)
+{
+    ConnStateData *conn = request->body_reader_data;
+    char *buf;
+    CBCB *callback;
+    void *cbdata;
+    int valid;
+    if (!conn || !cbdataValid(conn))
+       return;
+    if (!conn->body.callback || conn->body.request != request)
+       return;
+    buf = conn->body.buf;
+    callback = conn->body.callback;
+    cbdata = conn->body.cbdata;
+    valid = cbdataValid(cbdata);
+    assert(request == conn->body.request);
+    conn->body.buf = NULL;
+    conn->body.callback = NULL;
+    cbdataUnlock(conn->body.cbdata);
+    conn->body.cbdata = NULL;
+    conn->body.request = NULL;
+    if (valid)
+ callback(buf, -1, cbdata); /* Signal abort to clientReadBody caller to allow them to clean up */
+    else
+ debug(33, 1) ("NOTICE: A request body was aborted with cancelled callback: %p, possible memory leak\n", callback);
+    requestUnlink(request);    /* Linked in clientReadBody */
+}
+
+/* file_read like function, for reading body content */
+void
+clientReadBody(request_t * request, char *buf, size_t size, CBCB * callback, void *cbdata)
+{
+    ConnStateData *conn = request->body_reader_data;
+    if (!callback) {
+        clientAbortBody(request);
+        return;
+    }
+    if (!conn) {
+ debug(33, 5) ("clientReadBody: no body to read, request=%p\n", request);
+        callback(buf, 0, cbdata);       /* Signal end of body */
+        return;
+    }
+    assert(cbdataValid(conn));
+ debug(33, 2) ("clientReadBody: start fd=%d body_size=%lu in.offset=%ld cb=%p req=%p\n", conn->fd, (unsigned long int) conn->body.size_left, (long int) conn->in.offset, callback, request);
+    conn->body.callback = callback;
+    conn->body.cbdata = cbdata;
+    cbdataLock(conn->body.cbdata);
+    conn->body.buf = buf;
+    conn->body.bufsize = size;
+    conn->body.request = requestLink(request);
+    clientProcessBody(conn);
+}
=======================================
--- /dev/null
+++ /branches/LUSCA_HEAD/src/client_side_body.h Thu Feb 11 23:26:11 2010
@@ -0,0 +1,8 @@
+#ifndef        __CLIENT_SIDE_BODY_H__
+#define        __CLIENT_SIDE_BODY_H__
+
+extern void clientProcessBody(ConnStateData * conn);
+extern BODY_HANDLER clientReadBody;
+extern void clientEatRequestBody(clientHttpRequest * http);
+
+#endif
=======================================
--- /branches/LUSCA_HEAD/src/Makefile.am        Thu Feb 11 02:08:09 2010
+++ /branches/LUSCA_HEAD/src/Makefile.am        Thu Feb 11 23:26:11 2010
@@ -107,6 +107,7 @@
        cbdata.c \
        client_db.c \
        client_side.c \
+       client_side_body.c \
        client_side_request.c \
        client_side_reply.c \
        client_side_conn.c \
=======================================
--- /branches/LUSCA_HEAD/src/client_side.c      Thu Feb 11 08:14:08 2010
+++ /branches/LUSCA_HEAD/src/client_side.c      Thu Feb 11 23:26:11 2010
@@ -36,6 +36,7 @@
 #include "squid.h"

 #include "client_side_conn.h"
+#include "client_side_body.h"
 #include "client_side_request.h"
 #include "client_side_ranges.h"
 #include "client_side_async_refresh.h"
@@ -83,9 +84,6 @@
 static log_type clientProcessRequest2(clientHttpRequest * http);
 static int clientReplyBodyTooLarge(clientHttpRequest *, squid_off_t clen);
 static int clientRequestBodyTooLarge(clientHttpRequest *, request_t *);
-static void clientProcessBody(ConnStateData * conn);
-static void clientEatRequestBody(clientHttpRequest *);
-static BODY_HANDLER clientReadBody;
 static void clientAbortBody(request_t * req);
 #if USE_SSL
static void httpsAcceptSSL(ConnStateData * connState, SSL_CTX * sslContext);
@@ -2299,7 +2297,7 @@
     clientWriteComplete(fd, NULL, size, errflag, data);
 }

-static void
+void
 clientKeepaliveNextRequest(clientHttpRequest * http)
 {
     ConnStateData *conn = http->conn;
@@ -3431,162 +3429,6 @@
        commSetSelect(fd, COMM_SELECT_READ, clientReadRequest, conn, 0);
     }
 }
-
-/* file_read like function, for reading body content */
-static void
-clientReadBody(request_t * request, char *buf, size_t size, CBCB * callback, void *cbdata)
-{
-    ConnStateData *conn = request->body_reader_data;
-    if (!callback) {
-       clientAbortBody(request);
-       return;
-    }
-    if (!conn) {
-       debug(33, 5) ("clientReadBody: no body to read, request=%p\n", request);
-       callback(buf, 0, cbdata);       /* Signal end of body */
-       return;
-    }
-    assert(cbdataValid(conn));
- debug(33, 2) ("clientReadBody: start fd=%d body_size=%lu in.offset=%ld cb=%p req=%p\n", conn->fd, (unsigned long int) conn->body.size_left, (long int) conn->in.offset, callback, request);
-    conn->body.callback = callback;
-    conn->body.cbdata = cbdata;
-    cbdataLock(conn->body.cbdata);
-    conn->body.buf = buf;
-    conn->body.bufsize = size;
-    conn->body.request = requestLink(request);
-    clientProcessBody(conn);
-}
-
-static void
-clientEatRequestBodyHandler(char *buf, ssize_t size, void *data)
-{
-    clientHttpRequest *http = data;
-    ConnStateData *conn = http->conn;
-    if (buf && size < 0) {
-       return;                 /* Aborted, don't care */
-    }
-    if (conn->body.size_left > 0) {
-       conn->body.callback = clientEatRequestBodyHandler;
-       conn->body.cbdata = http;
-       cbdataLock(conn->body.cbdata);
-       conn->body.buf = NULL;
-       conn->body.bufsize = SQUID_TCP_SO_RCVBUF;
-       clientProcessBody(conn);
-    } else {
-       if (http->request->flags.proxy_keepalive) {
- debug(33, 5) ("clientEatRequestBodyHandler: FD %d Keeping Alive\n", conn->fd);
-           clientKeepaliveNextRequest(http);
-       } else {
-           comm_close(conn->fd);
-       }
-    }
-}
-
-static void
-clientEatRequestBody(clientHttpRequest * http)
-{
-    ConnStateData *conn = http->conn;
-    cbdataLock(conn);
-    if (conn->body.request)
-       requestAbortBody(conn->body.request);
-    if (cbdataValid(conn))
-       clientEatRequestBodyHandler(NULL, -1, http);
-    cbdataUnlock(conn);
-}
-
-/* Called by clientReadRequest to process body content */
-static void
-clientProcessBody(ConnStateData * conn)
-{
-    int size;
-    char *buf = conn->body.buf;
-    void *cbdata = conn->body.cbdata;
-    CBCB *callback = conn->body.callback;
-    request_t *request = conn->body.request;
-    /* Note: request is null while eating "aborted" transfers */
- debug(33, 2) ("clientProcessBody: start fd=%d body_size=%lu in.offset=%ld cb=%p req=%p\n", conn->fd, (unsigned long int) conn->body.size_left, (long int) conn->in.offset, callback, request);
-    if (conn->in.offset) {
-       int valid = cbdataValid(conn->body.cbdata);
-       if (!valid) {
-           comm_close(conn->fd);
-           return;
-       }
-       /* Some sanity checks... */
-       assert(conn->body.size_left > 0);
-       assert(conn->in.offset > 0);
-       assert(callback != NULL);
-       /* How much do we have to process? */
-       size = conn->in.offset;
-       if (size > conn->body.size_left)  /* only process the body part */
-           size = conn->body.size_left;
-       if (size > conn->body.bufsize)    /* don't copy more than requested */
-           size = conn->body.bufsize;
-       if (valid && buf)
-           xmemcpy(buf, conn->in.buf, size);
-       conn->body.size_left -= size;
-       /* Move any remaining data */
-       conn->in.offset -= size;
-       /* Resume the fd if necessary */
-       if (conn->in.offset < conn->in.size - 1)
-           commResumeFD(conn->fd);
-       if (conn->in.offset > 0)
-           xmemmove(conn->in.buf, conn->in.buf + size, conn->in.offset);
-       /* Remove request link if this is the last part of the body, as
-        * clientReadRequest automatically continues to process next request */
-       if (conn->body.size_left <= 0 && request != NULL) {
-           request->body_reader = NULL;
-           if (request->body_reader_data)
-               cbdataUnlock(request->body_reader_data);
-           request->body_reader_data = NULL;
-       }
-       /* Remove clientReadBody arguments (the call is completed) */
-       conn->body.request = NULL;
-       conn->body.callback = NULL;
-       cbdataUnlock(conn->body.cbdata);
-       conn->body.cbdata = NULL;
-       conn->body.buf = NULL;
-       conn->body.bufsize = 0;
-       /* Remember that we have touched the body, not restartable */
-       if (request != NULL)
-           request->flags.body_sent = 1;
-       /* Invoke callback function */
-       if (valid)
-           callback(buf, size, cbdata);
-       if (request != NULL)
-           requestUnlink(request);     /* Linked in clientReadBody */
- debug(33, 2) ("clientProcessBody: end fd=%d size=%d body_size=%lu in.offset=%ld cb=%p req=%p\n", conn->fd, size, (unsigned long int) conn->body.size_left, (long int) conn->in.offset, callback, request);
-    }
-}
-
-/* Abort a body request */
-static void
-clientAbortBody(request_t * request)
-{
-    ConnStateData *conn = request->body_reader_data;
-    char *buf;
-    CBCB *callback;
-    void *cbdata;
-    int valid;
-    if (!conn || !cbdataValid(conn))
-       return;
-    if (!conn->body.callback || conn->body.request != request)
-       return;
-    buf = conn->body.buf;
-    callback = conn->body.callback;
-    cbdata = conn->body.cbdata;
-    valid = cbdataValid(cbdata);
-    assert(request == conn->body.request);
-    conn->body.buf = NULL;
-    conn->body.callback = NULL;
-    cbdataUnlock(conn->body.cbdata);
-    conn->body.cbdata = NULL;
-    conn->body.request = NULL;
-    if (valid)
- callback(buf, -1, cbdata); /* Signal abort to clientReadBody caller to allow them to clean up */
-    else
- debug(33, 1) ("NOTICE: A request body was aborted with cancelled callback: %p, possible memory leak\n", callback);
-    requestUnlink(request);    /* Linked in clientReadBody */
-}

 /* general lifetime handler for HTTP requests */
 static void
=======================================
--- /branches/LUSCA_HEAD/src/client_side.h      Thu Feb 11 02:08:09 2010
+++ /branches/LUSCA_HEAD/src/client_side.h      Thu Feb 11 23:26:11 2010
@@ -14,6 +14,6 @@
 extern void clientProcessExpired(clientHttpRequest *);
 extern void clientProcessOnlyIfCachedMiss(clientHttpRequest * http);
 extern void httpRequestFree(void *data);
-
+extern void clientKeepaliveNextRequest(clientHttpRequest * http);

 #endif

--
You received this message because you are subscribed to the Google Groups 
"lusca-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/lusca-commit?hl=en.

Reply via email to