/*
- * $Id: client_side_reply.cc,v 1.100 2006/04/27 16:54:16 wessels Exp $
+ * $Id: client_side_reply.cc,v 1.101 2006/05/05 21:33:56 wessels Exp $
*
* DEBUG: section 88 Client-side Reply Routines
* AUTHOR: Robert Collins (Originally Duane Wessels in client_side.c)
safe_free(tempBuffer.data);
cbdataReferenceDone(http);
HTTPMSGUNLOCK(reply);
+ fwd = NULL; // refcounted
}
clientReplyContext::clientReplyContext(ClientHttpRequest *clientContext) : http (cbdataReference(clientContext)), old_entry (NULL), old_sc(NULL), deleting(false)
(long int) entry->lastmod);
http->storeEntry(entry);
assert(http->out.offset == 0);
- FwdState::fwdStart(http->getConn().getRaw() != NULL ? http->getConn()->fd : -1,
- http->storeEntry(),
- http->request);
+
+ /*
+ * A refcounted pointer so that FwdState stays around as long as
+ * this clientReplyContext does
+ */
+ fwd = FwdState::fwdStart(http->getConn().getRaw() != NULL ? http->getConn()->fd : -1,
+ http->storeEntry(),
+ http->request);
/* Register with storage manager to receive updates when data comes in. */
if (EBIT_TEST(entry->flags, ENTRY_ABORTED))
/*
- * $Id: client_side_reply.h,v 1.10 2006/02/18 00:23:43 wessels Exp $
+ * $Id: client_side_reply.h,v 1.11 2006/05/05 21:33:56 wessels Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
#include "StoreClient.h"
#include "client_side_request.h"
+/*
+ * The clientReplyContext class now keeps a refcounted pointer to
+ * FwdState. This was done so that FwdState refcount doesn't go
+ * to zero during a "reforward" between the time when the initial
+ * ServerSide gets destroyed and before the second attempt ServerSide
+ * gets created.
+ */
+#include "forward.h"
+
/* XXX make static method */
class clientReplyContext : public RefCountable, public StoreClient
void startSendProcess();
StoreIOBuffer holdingBuffer;
HttpReply *reply;
+ FwdState::Pointer fwd;
void processReplyAccess();
static PF ProcessReplyAccessResult;
void processReplyAccessResult(bool accessAllowed);
/*
- * $Id: forward.cc,v 1.138 2006/04/27 19:27:37 wessels Exp $
+ * $Id: forward.cc,v 1.139 2006/05/05 21:33:56 wessels Exp $
*
* DEBUG: section 17 Request Forwarding
* AUTHOR: Duane Wessels
* a transaction. It is a static method that may or may not
* allocate a FwdState.
*/
-void
+FwdState *
FwdState::fwdStart(int client_fd, StoreEntry *entry, HttpRequest *request)
{
/*
errorAppendEntry(entry, anErr); // frees anErr
- return;
+ return NULL;
}
}
ErrorState *anErr = errorCon(ERR_SHUTTING_DOWN, HTTP_SERVICE_UNAVAILABLE);
anErr->request = HTTPMSGLOCK(request);
errorAppendEntry(entry, anErr); // frees anErr
- return;
+ return NULL;
}
switch (request->protocol) {
case PROTO_INTERNAL:
internalStart(request, entry);
- return;
+ return NULL;
case PROTO_CACHEOBJ:
cachemgrStart(client_fd, request, entry);
- return;
+ return NULL;
case PROTO_URN:
urnStart(request, entry);
- return;
+ return NULL;
default:
FwdState *fwd = new FwdState(client_fd, entry, request);
peerSelect(request, entry, fwdStartCompleteWrapper, fwd);
- return;
+ return fwd;
}
/* NOTREACHED */
~FwdState();
static void initModule();
- static void fwdStart(int fd, StoreEntry *, HttpRequest *);
+ static FwdState * fwdStart(int fd, StoreEntry *, HttpRequest *);
void startComplete(FwdServer *);
void startFail();
void fail(ErrorState *err);