extern void purgeEntriesByUrl(HttpRequest * req, const char *url);
-ServerStateData::ServerStateData(FwdState *theFwdState): AsyncJob("ServerStateData"),requestSender(NULL)
+ServerStateData::ServerStateData(FwdState *theFwdState): AsyncJob("ServerStateData"),
+ requestSender(NULL),
#if USE_ADAPTATION
- , adaptedHeadSource(NULL)
- , adaptationAccessCheckPending(false)
- , startedAdaptation(false)
+ adaptedHeadSource(NULL),
+ adaptationAccessCheckPending(false),
+ startedAdaptation(false),
#endif
+ receivedWholeRequestBody(false)
{
fwd = theFwdState;
entry = fwd->entry;
void
ServerStateData::handleRequestBodyProductionEnded()
{
+ receivedWholeRequestBody = true;
if (!requestSender)
doneSendingRequestBody();
else
return;
}
- if (requestBodySource->exhausted())
+ if (!requestBodySource->exhausted())
+ sendMoreRequestBody();
+ else if (receivedWholeRequestBody)
doneSendingRequestBody();
else
- sendMoreRequestBody();
+ debugs(9,3, HERE << "waiting for body production end or abort");
}
#if 0
}
MemBuf buf;
- if (requestBodySource->getMoreData(buf)) {
+ if (getMoreRequestBody(buf) && buf.contentSize() > 0) {
debugs(9,3, HERE << "will write " << buf.contentSize() << " request body bytes");
typedef CommCbMemFunT<ServerStateData, CommIoCbParams> Dialer;
requestSender = JobCallback(93,3,
}
}
+/// either fill buf with available [encoded] request body bytes or return false
+bool
+ServerStateData::getMoreRequestBody(MemBuf &buf)
+{
+ // default implementation does not encode request body content
+ Must(requestBodySource != NULL);
+ return requestBodySource->getMoreData(buf);
+}
+
// Compares hosts in urls, returns false if different, no sheme, or no host.
static bool
sameUrlHosts(const char *url1, const char *url2)