/*
- * $Id: errorpage.cc,v 1.146 1999/01/12 16:40:35 wessels Exp $
+ * $Id: errorpage.cc,v 1.147 1999/01/19 05:24:47 wessels Exp $
*
* DEBUG: section 4 Error Generation
* AUTHOR: Duane Wessels
httpReplyDestroy(rep);
mem->reply->sline.status = err->http_status;
mem->reply->content_length = -1;
+ EBIT_CLR(entry->flags, ENTRY_FWD_HDR_WAIT);
storeBufferFlush(entry);
storeComplete(entry);
storeNegativeCache(entry);
/*
- * $Id: forward.cc,v 1.47 1999/01/19 02:24:24 wessels Exp $
+ * $Id: forward.cc,v 1.48 1999/01/19 05:24:48 wessels Exp $
*
* DEBUG: section 17 Request Forwarding
* AUTHOR: Duane Wessels
static PSC fwdStartComplete;
static void fwdDispatch(FwdState *);
-static void fwdConnectStart(FwdState * fwdState);
+static void fwdConnectStart(void *); /* should be same as EVH */
static void fwdStateFree(FwdState * fwdState);
static PF fwdConnectTimeout;
static PF fwdServerClosed;
errorAppendEntry(e, fwdState->err);
}
}
+ assert(!EBIT_TEST(e->flags, ENTRY_FWD_HDR_WAIT));
fwdServersFree(&fwdState->servers);
requestUnlink(fwdState->request);
fwdState->request = NULL;
return 0;
if (squid_curtime - fwdState->start > 120)
return 0;
+ if (fwdState->flags.dont_retry)
+ return 0;
if (pumpMethod(fwdState->request->method))
if (0 == pumpRestart(fwdState->request))
return 0;
debug(17, 3) ("fwdServerClosed: re-forwarding (%d tries, %d secs)\n",
fwdState->n_tries,
(int) (squid_curtime - fwdState->start));
- fwdConnectStart(fwdState);
+ /* use eventAdd to break potential call sequence loops */
+ eventAdd("fwdConnectStart", fwdConnectStart, fwdState, 0.0, 1);
} else {
fwdStateFree(fwdState);
}
FwdServer *fs = fwdState->servers;
ErrorState *err;
request_t *request = fwdState->request;
+ static int loop_detect = 0;
+ assert(loop_detect++ == 0);
assert(fwdState->server_fd == server_fd);
if (status == COMM_ERR_DNS) {
+ fwdState->flags.dont_retry = 1;
debug(17, 4) ("fwdConnectDone: Unknown host: %s\n",
request->host);
err = errorCon(ERR_DNS_FAIL, HTTP_SERVICE_UNAVAILABLE);
fd_table[server_fd].uses++;
fwdDispatch(fwdState);
}
+ loop_detect--;
}
static void
}
static void
-fwdConnectStart(FwdState * fwdState)
+fwdConnectStart(void *data)
{
+ FwdState * fwdState = data;
const char *url = storeUrl(fwdState->entry);
int fd;
ErrorState *err;