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.