Revision: 14389
Author: adrian.chadd
Date: Wed Feb 10 08:28:07 2010
Log: Begin breaking out the client-side request routines into a separate
file.
They'll eventually be further broken out into multiple files, one per
module, with a well-defined API to tie it all together.
http://code.google.com/p/lusca-cache/source/detail?r=14389
Added:
/branches/LUSCA_HEAD/src/client_side_request.c
/branches/LUSCA_HEAD/src/client_side_request.h
Modified:
/branches/LUSCA_HEAD/src/Makefile.am
/branches/LUSCA_HEAD/src/client_side.c
/branches/LUSCA_HEAD/src/protos.h
=======================================
--- /dev/null
+++ /branches/LUSCA_HEAD/src/client_side_request.c Wed Feb 10 08:28:07 2010
@@ -0,0 +1,246 @@
+#include "squid.h"
+
+/* Client-side request related pipeline routines */
+
+#if FOLLOW_X_FORWARDED_FOR
+static void clientFollowXForwardedForStart(void *data);
+static void clientFollowXForwardedForNext(void *data);
+static void clientFollowXForwardedForDone(int answer, void *data);
+#endif /* FOLLOW_X_FORWARDED_FOR */
+
+
+/* http_access check */
+
+static void
+clientAccessCheckDone(int answer, void *data)
+{
+ clientHttpRequest *http = data;
+ err_type page_id;
+ http_status status;
+ ErrorState *err = NULL;
+ char *proxy_auth_msg = NULL;
+ debug(33, 2) ("The request %s %s is %s, because it matched '%s'\n",
+ urlMethodGetConstStr(http->request->method), http->uri,
+ answer == ACCESS_ALLOWED ? "ALLOWED" : "DENIED",
+ AclMatchedName ? AclMatchedName : "NO ACL's");
+ proxy_auth_msg =
authenticateAuthUserRequestMessage(http->conn->auth_user_request ?
http->conn->auth_user_request : http->request->auth_user_request);
+ http->acl_checklist = NULL;
+ if (answer == ACCESS_ALLOWED) {
+ safe_free(http->uri);
+ http->uri = xstrdup(urlCanonical(http->request));
+ assert(http->redirect_state == REDIRECT_NONE);
+ http->redirect_state = REDIRECT_PENDING;
+ clientRedirectStart(http);
+ } else {
+ int require_auth = (answer == ACCESS_REQ_PROXY_AUTH ||
aclIsProxyAuth(AclMatchedName)) && !http->request->flags.transparent;
+ debug(33, 5) ("Access Denied: %s\n", http->uri);
+ debug(33, 5) ("AclMatchedName = %s\n",
+ AclMatchedName ? AclMatchedName : "<null>");
+ debug(33, 5) ("Proxy Auth Message = %s\n",
+ proxy_auth_msg ? proxy_auth_msg : "<null>");
+ /*
+ * NOTE: get page_id here, based on AclMatchedName because
+ * if USE_DELAY_POOLS is enabled, then AclMatchedName gets
+ * clobbered in the clientCreateStoreEntry() call
+ * just below. Pedro Ribeiro <[email protected]>
+ */
+ page_id = aclGetDenyInfoPage(&Config.denyInfoList, AclMatchedName,
answer != ACCESS_REQ_PROXY_AUTH);
+ http->log_type = LOG_TCP_DENIED;
+ http->entry = clientCreateStoreEntry(http, http->request->method,
+ null_request_flags);
+ if (require_auth) {
+ if (!http->flags.accel) {
+ /* Proxy authorisation needed */
+ status = HTTP_PROXY_AUTHENTICATION_REQUIRED;
+ } else {
+ /* WWW authorisation needed */
+ status = HTTP_UNAUTHORIZED;
+ }
+ if (page_id == ERR_NONE)
+ page_id = ERR_CACHE_ACCESS_DENIED;
+ } else {
+ status = HTTP_FORBIDDEN;
+ if (page_id == ERR_NONE)
+ page_id = ERR_ACCESS_DENIED;
+ }
+ err = errorCon(page_id, status, http->orig_request);
+ if (http->conn->auth_user_request)
+ err->auth_user_request = http->conn->auth_user_request;
+ else if (http->request->auth_user_request)
+ err->auth_user_request = http->request->auth_user_request;
+ /* lock for the error state */
+ if (err->auth_user_request)
+ authenticateAuthUserRequestLock(err->auth_user_request);
+ err->callback_data = NULL;
+ errorAppendEntry(http->entry, err);
+ }
+}
+
+static void
+clientAccessCheck(void *data)
+{
+ clientHttpRequest *http = data;
+ http->acl_checklist = clientAclChecklistCreate(Config.accessList.http,
http);
+ aclNBCheck(http->acl_checklist, clientAccessCheckDone, http);
+}
+
+/* X-Forwarded-For processing */
+
+#if FOLLOW_X_FORWARDED_FOR
+/*
+ * clientFollowXForwardedForStart() copies the X-Forwarded-For
+ * header into x_forwarded_for_iterator and passes control to
+ * clientFollowXForwardedForNext().
+ *
+ * clientFollowXForwardedForNext() checks the indirect_client_addr
+ * against the followXFF ACL and passes the result to
+ * clientFollowXForwardedForDone().
+ *
+ * clientFollowXForwardedForDone() either grabs the next address
+ * from the tail of x_forwarded_for_iterator and loops back to
+ * clientFollowXForwardedForNext(), or cleans up and passes control to
+ * clientAccessCheck().
+ */
+
+static void
+clientFollowXForwardedForStart(void *data)
+{
+ clientHttpRequest *http = data;
+ request_t *request = http->request;
+ request->x_forwarded_for_iterator = httpHeaderGetList(
+ &request->header, HDR_X_FORWARDED_FOR);
+ debug(33, 5) ("clientFollowXForwardedForStart: indirect_client_addr=%s
XFF='%.*s'\n",
+ inet_ntoa(request->indirect_client_addr),
+ strLen2(request->x_forwarded_for_iterator),
+ strBuf2(request->x_forwarded_for_iterator));
+ clientFollowXForwardedForNext(http);
+}
+
+static void
+clientFollowXForwardedForNext(void *data)
+{
+ clientHttpRequest *http = data;
+ request_t *request = http->request;
+ debug(33, 5) ("clientFollowXForwardedForNext: indirect_client_addr=%s
XFF='%.*s'\n",
+ inet_ntoa(request->indirect_client_addr),
+ strLen2(request->x_forwarded_for_iterator),
+ strBuf2(request->x_forwarded_for_iterator));
+ if (strLen(request->x_forwarded_for_iterator) != 0) {
+ /* check the acl to see whether to believe the X-Forwarded-For header */
+ http->acl_checklist = clientAclChecklistCreate(
+ Config.accessList.followXFF, http);
+ aclNBCheck(http->acl_checklist, clientFollowXForwardedForDone, http);
+ } else {
+ /* nothing left to follow */
+ debug(33, 5) ("clientFollowXForwardedForNext: nothing more to do\n");
+ clientFollowXForwardedForDone(-1, http);
+ }
+}
+
+static void
+clientFollowXForwardedForDone(int answer, void *data)
+{
+ clientHttpRequest *http = data;
+ request_t *request = http->request;
+ /*
+ * answer should be be ACCESS_ALLOWED or ACCESS_DENIED if we are
+ * called as a result of ACL checks, or -1 if we are called when
+ * there's nothing left to do.
+ */
+ if (answer == ACCESS_ALLOWED) {
+ /*
+ * The IP address currently in request->indirect_client_addr
+ * is trusted to use X-Forwarded-For. Remove the last
+ * comma-delimited element from x_forwarded_for_iterator and use
+ * it to to replace indirect_client_addr, then repeat the cycle.
+ */
+ const char *p;
+ char *asciiaddr;
+ int l;
+ struct in_addr addr;
+ debug(33, 5) ("clientFollowXForwardedForDone: indirect_client_addr=%s is
trusted\n",
+ inet_ntoa(request->indirect_client_addr));
+ p = strBuf2(request->x_forwarded_for_iterator);
+ l = strLen2(request->x_forwarded_for_iterator);
+
+ /*
+ * XXX x_forwarded_for_iterator should really be a list of
+ * IP addresses, but it's a String instead. We have to
+ * walk backwards through the String, biting off the last
+ * comma-delimited part each time. As long as the data is in
+ * a String, we should probably implement and use a variant of
+ * strListGetItem() that walks backwards instead of forwards
+ * through a comma-separated list. But we don't even do that;
+ * we just do the work in-line here.
+ */
+ /* skip trailing space and commas */
+ while (l > 0 && (p[l - 1] == ',' || xisspace(p[l - 1])))
+ l--;
+ strCut(&request->x_forwarded_for_iterator, l);
+ /* look for start of last item in list */
+ while (l > 0 && !(p[l - 1] == ',' || xisspace(p[l - 1])))
+ l--;
+
+ /* Take a temporary copy of the buffer so inet_aton() can run on it */
+ asciiaddr = stringDupToCOffset(&request->x_forwarded_for_iterator,
l);
+ if (inet_aton(asciiaddr, &addr) == 0) {
+ /* the address is not well formed; do not use it */
+ debug(33, 3) ("clientFollowXForwardedForDone: malformed
address '%s'\n",
+ asciiaddr);
+ safe_free(asciiaddr);
+ goto done;
+ }
+ debug(33, 3) ("clientFollowXForwardedForDone: changing
indirect_client_addr from %s to '%s'\n",
+ inet_ntoa(request->indirect_client_addr),
+ asciiaddr);
+ safe_free(asciiaddr);
+ request->indirect_client_addr = addr;
+ strCut(&request->x_forwarded_for_iterator, l);
+ if (!Config.onoff.acl_uses_indirect_client) {
+ /*
+ * If acl_uses_indirect_client is off, then it's impossible
+ * to follow more than one level of X-Forwarded-For.
+ */
+ goto done;
+ }
+ clientFollowXForwardedForNext(http);
+ return;
+ } else if (answer == ACCESS_DENIED) {
+ debug(33, 5) ("clientFollowXForwardedForDone: indirect_client_addr=%s not
trusted\n",
+ inet_ntoa(request->indirect_client_addr));
+ } else {
+ debug(33, 5) ("clientFollowXForwardedForDone: indirect_client_addr=%s
nothing more to do\n",
+ inet_ntoa(request->indirect_client_addr));
+ }
+ done:
+ /* clean up, and pass control to clientAccessCheck */
+ debug(33, 6) ("clientFollowXForwardedForDone: cleanup\n");
+ if (Config.onoff.log_uses_indirect_client) {
+ /*
+ * Ensure that the access log shows the indirect client
+ * instead of the direct client.
+ */
+ ConnStateData *conn = http->conn;
+ conn->log_addr = request->indirect_client_addr;
+ conn->log_addr.s_addr &= Config.Addrs.client_netmask.s_addr;
+ debug(33, 3) ("clientFollowXForwardedForDone: setting log_addr=%s\n",
+ inet_ntoa(conn->log_addr));
+ }
+ stringClean(&request->x_forwarded_for_iterator);
+ http->acl_checklist = NULL; /* XXX do we need to aclChecklistFree() ?
*/
+ clientAccessCheck(http);
+}
+#endif /* FOLLOW_X_FORWARDED_FOR */
+
+void
+clientCheckFollowXForwardedFor(void *data)
+{
+ clientHttpRequest *http = data;
+#if FOLLOW_X_FORWARDED_FOR
+ if (Config.accessList.followXFF &&
httpHeaderHas(&http->request->header, HDR_X_FORWARDED_FOR)) {
+ clientFollowXForwardedForStart(http);
+ return;
+ }
+#endif
+ clientAccessCheck(http);
+}
=======================================
--- /dev/null
+++ /branches/LUSCA_HEAD/src/client_side_request.h Wed Feb 10 08:28:07 2010
@@ -0,0 +1,8 @@
+#ifndef __CLIENT_SIDE_REQUEST_H__
+#define __CLIENT_SIDE_REQUEST_H__
+
+/* This begins the request-side processing chain */
+extern void clientCheckFollowXForwardedFor(void *data);
+
+#endif
+
=======================================
--- /branches/LUSCA_HEAD/src/Makefile.am Fri Oct 30 00:52:22 2009
+++ /branches/LUSCA_HEAD/src/Makefile.am Wed Feb 10 08:28:07 2010
@@ -107,6 +107,9 @@
cbdata.c \
client_db.c \
client_side.c \
+ client_side_request.c \
+ client_side_reply.c \
+ client_side_conn.c \
client_side_nat.c \
client_side_rewrite.c \
client_side_storeurl_rewrite.c \
=======================================
--- /branches/LUSCA_HEAD/src/client_side.c Mon Oct 26 23:58:33 2009
+++ /branches/LUSCA_HEAD/src/client_side.c Wed Feb 10 08:28:07 2010
@@ -96,6 +96,7 @@
#include <linux/netfilter_ipv4.h>
#endif
+#include "client_side_request.h"
#if LINGERING_CLOSE
#define comm_close comm_lingering_close
@@ -105,6 +106,7 @@
#define FAILURE_MODE_TIME 300
+
/* Local functions */
static CWCB clientWriteComplete;
@@ -129,11 +131,7 @@
#if USE_IDENT
static IDCB clientIdentDone;
#endif
-#if FOLLOW_X_FORWARDED_FOR
-static void clientFollowXForwardedForStart(void *data);
-static void clientFollowXForwardedForNext(void *data);
-static void clientFollowXForwardedForDone(int answer, void *data);
-#endif /* FOLLOW_X_FORWARDED_FOR */
+
static int clientOnlyIfCached(clientHttpRequest * http);
static STNCB clientSendMoreData;
static STHCB clientSendHeaders;
@@ -155,8 +153,6 @@
static int clientRequestBodyTooLarge(clientHttpRequest *, request_t *);
static void clientProcessBody(ConnStateData * conn);
static void clientEatRequestBody(clientHttpRequest *);
-static void clientAccessCheck(void *data);
-static void clientAccessCheckDone(int answer, void *data);
static void clientAccessCheckDone2(int answer, void *data);
static BODY_HANDLER clientReadBody;
static void clientAbortBody(request_t * req);
@@ -165,7 +161,6 @@
#endif
static int varyEvaluateMatch(StoreEntry * entry, request_t * request);
static int modifiedSince(StoreEntry *, request_t *);
-static StoreEntry *clientCreateStoreEntry(clientHttpRequest *, method_t *,
request_flags);
static int clientCheckBeginForwarding(clientHttpRequest * http);
static int clientside_num_conns = 0;
@@ -199,173 +194,6 @@
return ch;
}
-
-#if FOLLOW_X_FORWARDED_FOR
-/*
- * clientFollowXForwardedForStart() copies the X-Forwarded-For
- * header into x_forwarded_for_iterator and passes control to
- * clientFollowXForwardedForNext().
- *
- * clientFollowXForwardedForNext() checks the indirect_client_addr
- * against the followXFF ACL and passes the result to
- * clientFollowXForwardedForDone().
- *
- * clientFollowXForwardedForDone() either grabs the next address
- * from the tail of x_forwarded_for_iterator and loops back to
- * clientFollowXForwardedForNext(), or cleans up and passes control to
- * clientAccessCheck().
- */
-
-static void
-clientFollowXForwardedForStart(void *data)
-{
- clientHttpRequest *http = data;
- request_t *request = http->request;
- request->x_forwarded_for_iterator = httpHeaderGetList(
- &request->header, HDR_X_FORWARDED_FOR);
- debug(33, 5) ("clientFollowXForwardedForStart: indirect_client_addr=%s
XFF='%.*s'\n",
- inet_ntoa(request->indirect_client_addr),
- strLen2(request->x_forwarded_for_iterator),
- strBuf2(request->x_forwarded_for_iterator));
- clientFollowXForwardedForNext(http);
-}
-
-static void
-clientFollowXForwardedForNext(void *data)
-{
- clientHttpRequest *http = data;
- request_t *request = http->request;
- debug(33, 5) ("clientFollowXForwardedForNext: indirect_client_addr=%s
XFF='%.*s'\n",
- inet_ntoa(request->indirect_client_addr),
- strLen2(request->x_forwarded_for_iterator),
- strBuf2(request->x_forwarded_for_iterator));
- if (strLen(request->x_forwarded_for_iterator) != 0) {
- /* check the acl to see whether to believe the X-Forwarded-For header */
- http->acl_checklist = clientAclChecklistCreate(
- Config.accessList.followXFF, http);
- aclNBCheck(http->acl_checklist, clientFollowXForwardedForDone, http);
- } else {
- /* nothing left to follow */
- debug(33, 5) ("clientFollowXForwardedForNext: nothing more to do\n");
- clientFollowXForwardedForDone(-1, http);
- }
-}
-
-static void
-clientFollowXForwardedForDone(int answer, void *data)
-{
- clientHttpRequest *http = data;
- request_t *request = http->request;
- /*
- * answer should be be ACCESS_ALLOWED or ACCESS_DENIED if we are
- * called as a result of ACL checks, or -1 if we are called when
- * there's nothing left to do.
- */
- if (answer == ACCESS_ALLOWED) {
- /*
- * The IP address currently in request->indirect_client_addr
- * is trusted to use X-Forwarded-For. Remove the last
- * comma-delimited element from x_forwarded_for_iterator and use
- * it to to replace indirect_client_addr, then repeat the cycle.
- */
- const char *p;
- char *asciiaddr;
- int l;
- struct in_addr addr;
- debug(33, 5) ("clientFollowXForwardedForDone: indirect_client_addr=%s is
trusted\n",
- inet_ntoa(request->indirect_client_addr));
- p = strBuf2(request->x_forwarded_for_iterator);
- l = strLen2(request->x_forwarded_for_iterator);
-
- /*
- * XXX x_forwarded_for_iterator should really be a list of
- * IP addresses, but it's a String instead. We have to
- * walk backwards through the String, biting off the last
- * comma-delimited part each time. As long as the data is in
- * a String, we should probably implement and use a variant of
- * strListGetItem() that walks backwards instead of forwards
- * through a comma-separated list. But we don't even do that;
- * we just do the work in-line here.
- */
- /* skip trailing space and commas */
- while (l > 0 && (p[l - 1] == ',' || xisspace(p[l - 1])))
- l--;
- strCut(&request->x_forwarded_for_iterator, l);
- /* look for start of last item in list */
- while (l > 0 && !(p[l - 1] == ',' || xisspace(p[l - 1])))
- l--;
-
- /* Take a temporary copy of the buffer so inet_aton() can run on it */
- asciiaddr = stringDupToCOffset(&request->x_forwarded_for_iterator,
l);
- if (inet_aton(asciiaddr, &addr) == 0) {
- /* the address is not well formed; do not use it */
- debug(33, 3) ("clientFollowXForwardedForDone: malformed
address '%s'\n",
- asciiaddr);
- safe_free(asciiaddr);
- goto done;
- }
- debug(33, 3) ("clientFollowXForwardedForDone: changing
indirect_client_addr from %s to '%s'\n",
- inet_ntoa(request->indirect_client_addr),
- asciiaddr);
- safe_free(asciiaddr);
- request->indirect_client_addr = addr;
- strCut(&request->x_forwarded_for_iterator, l);
- if (!Config.onoff.acl_uses_indirect_client) {
- /*
- * If acl_uses_indirect_client is off, then it's impossible
- * to follow more than one level of X-Forwarded-For.
- */
- goto done;
- }
- clientFollowXForwardedForNext(http);
- return;
- } else if (answer == ACCESS_DENIED) {
- debug(33, 5) ("clientFollowXForwardedForDone: indirect_client_addr=%s not
trusted\n",
- inet_ntoa(request->indirect_client_addr));
- } else {
- debug(33, 5) ("clientFollowXForwardedForDone: indirect_client_addr=%s
nothing more to do\n",
- inet_ntoa(request->indirect_client_addr));
- }
- done:
- /* clean up, and pass control to clientAccessCheck */
- debug(33, 6) ("clientFollowXForwardedForDone: cleanup\n");
- if (Config.onoff.log_uses_indirect_client) {
- /*
- * Ensure that the access log shows the indirect client
- * instead of the direct client.
- */
- ConnStateData *conn = http->conn;
- conn->log_addr = request->indirect_client_addr;
- conn->log_addr.s_addr &= Config.Addrs.client_netmask.s_addr;
- debug(33, 3) ("clientFollowXForwardedForDone: setting log_addr=%s\n",
- inet_ntoa(conn->log_addr));
- }
- stringClean(&request->x_forwarded_for_iterator);
- http->acl_checklist = NULL; /* XXX do we need to aclChecklistFree() ?
*/
- clientAccessCheck(http);
-}
-#endif /* FOLLOW_X_FORWARDED_FOR */
-
-static void
-clientCheckFollowXForwardedFor(void *data)
-{
- clientHttpRequest *http = data;
-#if FOLLOW_X_FORWARDED_FOR
- if (Config.accessList.followXFF &&
httpHeaderHas(&http->request->header, HDR_X_FORWARDED_FOR)) {
- clientFollowXForwardedForStart(http);
- return;
- }
-#endif
- clientAccessCheck(http);
-}
-
-static void
-clientAccessCheck(void *data)
-{
- clientHttpRequest *http = data;
- http->acl_checklist = clientAclChecklistCreate(Config.accessList.http,
http);
- aclNBCheck(http->acl_checklist, clientAccessCheckDone, http);
-}
void
clientAccessCheck2(void *data)
@@ -392,7 +220,7 @@
EBIT_TEST(r->cache_control->mask, CC_ONLY_IF_CACHED);
}
-static StoreEntry *
+StoreEntry *
clientCreateStoreEntry(clientHttpRequest * h, method_t * m, request_flags
flags)
{
StoreEntry *e;
@@ -430,71 +258,6 @@
clientAccessCheck2(http);
}
-
-static void
-clientAccessCheckDone(int answer, void *data)
-{
- clientHttpRequest *http = data;
- err_type page_id;
- http_status status;
- ErrorState *err = NULL;
- char *proxy_auth_msg = NULL;
- debug(33, 2) ("The request %s %s is %s, because it matched '%s'\n",
- urlMethodGetConstStr(http->request->method), http->uri,
- answer == ACCESS_ALLOWED ? "ALLOWED" : "DENIED",
- AclMatchedName ? AclMatchedName : "NO ACL's");
- proxy_auth_msg =
authenticateAuthUserRequestMessage(http->conn->auth_user_request ?
http->conn->auth_user_request : http->request->auth_user_request);
- http->acl_checklist = NULL;
- if (answer == ACCESS_ALLOWED) {
- safe_free(http->uri);
- http->uri = xstrdup(urlCanonical(http->request));
- assert(http->redirect_state == REDIRECT_NONE);
- http->redirect_state = REDIRECT_PENDING;
- clientRedirectStart(http);
- } else {
- int require_auth = (answer == ACCESS_REQ_PROXY_AUTH ||
aclIsProxyAuth(AclMatchedName)) && !http->request->flags.transparent;
- debug(33, 5) ("Access Denied: %s\n", http->uri);
- debug(33, 5) ("AclMatchedName = %s\n",
- AclMatchedName ? AclMatchedName : "<null>");
- debug(33, 5) ("Proxy Auth Message = %s\n",
- proxy_auth_msg ? proxy_auth_msg : "<null>");
- /*
- * NOTE: get page_id here, based on AclMatchedName because
- * if USE_DELAY_POOLS is enabled, then AclMatchedName gets
- * clobbered in the clientCreateStoreEntry() call
- * just below. Pedro Ribeiro <[email protected]>
- */
- page_id = aclGetDenyInfoPage(&Config.denyInfoList, AclMatchedName,
answer != ACCESS_REQ_PROXY_AUTH);
- http->log_type = LOG_TCP_DENIED;
- http->entry = clientCreateStoreEntry(http, http->request->method,
- null_request_flags);
- if (require_auth) {
- if (!http->flags.accel) {
- /* Proxy authorisation needed */
- status = HTTP_PROXY_AUTHENTICATION_REQUIRED;
- } else {
- /* WWW authorisation needed */
- status = HTTP_UNAUTHORIZED;
- }
- if (page_id == ERR_NONE)
- page_id = ERR_CACHE_ACCESS_DENIED;
- } else {
- status = HTTP_FORBIDDEN;
- if (page_id == ERR_NONE)
- page_id = ERR_ACCESS_DENIED;
- }
- err = errorCon(page_id, status, http->orig_request);
- if (http->conn->auth_user_request)
- err->auth_user_request = http->conn->auth_user_request;
- else if (http->request->auth_user_request)
- err->auth_user_request = http->request->auth_user_request;
- /* lock for the error state */
- if (err->auth_user_request)
- authenticateAuthUserRequestLock(err->auth_user_request);
- err->callback_data = NULL;
- errorAppendEntry(http->entry, err);
- }
-}
static void
clientAccessCheckDone2(int answer, void *data)
=======================================
--- /branches/LUSCA_HEAD/src/protos.h Mon Oct 26 23:58:33 2009
+++ /branches/LUSCA_HEAD/src/protos.h Wed Feb 10 08:28:07 2010
@@ -1074,6 +1074,7 @@
extern void clientAccessCheck2(void *data);
extern void clientFinishRewriteStuff(clientHttpRequest * http);
extern int connStateGetCount(void);
+extern StoreEntry *clientCreateStoreEntry(clientHttpRequest *, method_t *,
request_flags);
/* client_side_nat.c */
extern int clientNatLookup(ConnStateData * conn);
--
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.