/*
- * $Id: client_side.cc,v 1.204 1998/02/04 07:22:16 wessels Exp $
+ * $Id: client_side.cc,v 1.205 1998/02/04 23:33:37 wessels Exp $
*
* DEBUG: section 33 Client-side Routines
* AUTHOR: Duane Wessels
const char *url = storeUrl(entry);
int unlink_request = 0;
StoreEntry *oldentry;
- debug(33, 3) ("clientHandleIMSReply: %s\n", url);
+ debug(33, 3) ("clientHandleIMSReply: %s, %d bytes\n", url, (int) size);
memFree(MEM_4K_BUF, buf);
buf = NULL;
/* unregister this handler */
StoreEntry *entry = http->entry;
request_t *request = http->request;
MemObject *mem = NULL;
- debug(12, 3) ("httpRequestFree: %s\n", storeUrl(entry));
+ debug(33, 3) ("httpRequestFree: %s\n", storeUrl(entry));
if (!clientCheckTransferDone(http)) {
if (entry)
storeUnregister(entry, http); /* unregister BEFORE abort */
{
ConnStateData *connState = data;
clientHttpRequest *http;
- debug(12, 3) ("connStateFree: FD %d\n", fd);
+ debug(33, 3) ("connStateFree: FD %d\n", fd);
assert(connState != NULL);
while ((http = connState->chr) != NULL) {
assert(http->conn == connState);
if ((t = mime_get_header(request_hdr, "Via")))
if (strstr(t, ThisCache)) {
if (!http->accel) {
- debug(12, 1) ("WARNING: Forwarding loop detected for '%s'\n",
+ debug(33, 1) ("WARNING: Forwarding loop detected for '%s'\n",
http->uri);
- debug(12, 1) ("--> %s\n", t);
+ debug(33, 1) ("--> %s\n", t);
}
EBIT_SET(request->flags, REQ_LOOPDETECT);
}
EBIT_SET(request->flags, REQ_CACHABLE);
if (clientHierarchical(http))
EBIT_SET(request->flags, REQ_HIERARCHICAL);
- debug(12, 5) ("clientParseRequestHeaders: REQ_NOCACHE = %s\n",
+ debug(33, 5) ("clientParseRequestHeaders: REQ_NOCACHE = %s\n",
EBIT_TEST(request->flags, REQ_NOCACHE) ? "SET" : "NOT SET");
- debug(12, 5) ("clientParseRequestHeaders: REQ_CACHABLE = %s\n",
+ debug(33, 5) ("clientParseRequestHeaders: REQ_CACHABLE = %s\n",
EBIT_TEST(request->flags, REQ_CACHABLE) ? "SET" : "NOT SET");
- debug(12, 5) ("clientParseRequestHeaders: REQ_HIERARCHICAL = %s\n",
+ debug(33, 5) ("clientParseRequestHeaders: REQ_HIERARCHICAL = %s\n",
EBIT_TEST(request->flags, REQ_HIERARCHICAL) ? "SET" : "NOT SET");
}
size_t l;
end = mime_headers_end(hdr_in);
if (end == NULL) {
- debug(12, 3) ("clientBuildReplyHeader: DIDN'T FIND END-OF-HEADERS\n");
+ debug(33, 3) ("clientBuildReplyHeader: DIDN'T FIND END-OF-HEADERS\n");
return 0;
}
xbuf = memAllocate(MEM_4K_BUF, 1);
debug_trap("clientBuildReplyHeader: size mismatch");
len = l;
}
- debug(12, 3) ("clientBuildReplyHeader: OUTPUT:\n%s\n", hdr_out);
+ debug(33, 3) ("clientBuildReplyHeader: OUTPUT:\n%s\n", hdr_out);
memFree(MEM_4K_BUF, xbuf);
memFree(MEM_4K_BUF, ybuf);
return len;
clientCacheHit(void *data, char *buf, ssize_t size)
{
clientHttpRequest *http = data;
+ debug(33, 3) ("clientCacheHit: %s, %d bytes\n", http->uri, (int) size);
if (size >= 0) {
clientSendMoreData(data, buf, size);
} else if (http->entry == NULL) {
- debug(12, 3) ("clientCacheHit: request aborted\n");
+ debug(33, 3) ("clientCacheHit: request aborted\n");
} else {
/* swap in failure */
- debug(12, 1) ("KARMA: clientCacheHit fail\n");
+ debug(33, 3) ("clientCacheHit: swapin failure for %s\n", http->uri);
http->log_type = LOG_TCP_SWAPFAIL_MISS;
if (http->entry)
storeRelease(http->entry);
FREE *freefunc = memFree4K;
int hack = 0;
char C = '\0';
+ debug(33, 5) ("clientSendMoreData: %s, %d bytes\n", http->uri, (int) size);
assert(size <= SM_PAGE_SIZE);
assert(http->request != NULL);
- debug(12, 5) ("clientSendMoreData: FD %d '%s', out.offset=%d \n",
+ debug(33, 5) ("clientSendMoreData: FD %d '%s', out.offset=%d \n",
fd, storeUrl(entry), http->out.offset);
if (conn->chr != http) {
/* there is another object in progress, defer this one */
* hdrlen is the length of the old headers in buf
* size - hdrlen is the amount of body in buf
*/
- debug(12, 3) ("clientSendMoreData: Appending %d bytes after headers\n",
+ debug(33, 3) ("clientSendMoreData: Appending %d bytes after headers\n",
(int) (size - hdrlen));
if (((size - hdrlen) + l) > 8192) {
debug(0, 0) ("Size, hdrlen, l %d, %d, %d\n", size, hdrlen, l);
StoreEntry *entry = http->entry;
int done;
http->out.size += size;
- debug(12, 5) ("clientWriteComplete: FD %d, sz %d, err %d, off %d, len %d\n",
+ debug(33, 5) ("clientWriteComplete: FD %d, sz %d, err %d, off %d, len %d\n",
fd, size, errflag, http->out.offset, entry->object_len);
if (errflag) {
CheckQuickAbort(http);
} else if (entry->store_status == STORE_ABORTED) {
comm_close(fd);
} else if ((done = clientCheckTransferDone(http)) != 0 || size == 0) {
- debug(12, 5) ("clientWriteComplete: FD %d transfer is DONE\n", fd);
+ debug(33, 5) ("clientWriteComplete: FD %d transfer is DONE\n", fd);
/* We're finished case */
if (http->entry->mem_obj->reply->content_length < 0 || !done ||
EBIT_TEST(entry->flag, ENTRY_BAD_LENGTH)) {
*/
comm_close(fd);
} else if (EBIT_TEST(http->request->flags, REQ_PROXY_KEEPALIVE)) {
- debug(12, 5) ("clientWriteComplete: FD %d Keeping Alive\n", fd);
+ debug(33, 5) ("clientWriteComplete: FD %d Keeping Alive\n", fd);
conn = http->conn;
conn->defer.until = 0; /* Kick it to read a new request */
httpRequestFree(http);
if ((http = conn->chr) != NULL) {
- debug(12, 1) ("clientWriteComplete: FD %d Sending next request\n", fd);
+ debug(33, 1) ("clientWriteComplete: FD %d Sending next request\n", fd);
if (!storeClientCopyPending(http->entry, http)) {
if (entry->store_status == STORE_ABORTED)
debug(33, 0) ("clientWriteComplete: entry->swap_status == STORE_ABORTED\n");
http);
}
} else {
- debug(12, 5) ("clientWriteComplete: FD %d reading next request\n", fd);
+ debug(33, 5) ("clientWriteComplete: FD %d reading next request\n", fd);
fd_note(fd, "Reading next request");
/*
* Set the timeout BEFORE calling clientReadRequest().
StoreEntry *entry = http->entry;
MemObject *mem = entry->mem_obj;
char *reply = NULL;
+ debug(33, 3) ("clientGetHeadersForIMS: %s, %d bytes\n",
+ http->uri, (int) size);
assert(size <= SM_PAGE_SIZE);
memFree(MEM_4K_BUF, buf);
buf = NULL;
if (size < 0 || entry->store_status == STORE_ABORTED) {
- debug(12, 1) ("clientGetHeadersForIMS: storeClientCopy failed for '%s'\n",
+ debug(33, 1) ("clientGetHeadersForIMS: storeClientCopy failed for '%s'\n",
storeKeyText(entry->key));
clientProcessMiss(http);
return;
clientProcessMiss(http);
return;
}
+ if (size == SM_PAGE_SIZE && http->out.offset == 0) {
+ /*
+ * We can't get any more headers than this, so bail
+ */
+ debug(33, 1) ("clientGetHeadersForIMS: failed, forcing cache miss\n");
+ clientProcessMiss(http);
+ return;
+ }
+ debug(33, 3) ("clientGetHeadersForIMS: waiting for HTTP reply headers\n");
/* All headers are not yet available, wait for more data */
if (entry->store_status == STORE_ABORTED)
debug(33, 0) ("clientGetHeadersForIMS: entry->swap_status == STORE_ABORTED\n");
#ifdef CHECK_REPLY_CODE_NOTEQUAL_200
/* Only objects with statuscode==200 can be "Not modified" */
if (mem->reply->code != 200) {
- debug(12, 4) ("clientGetHeadersForIMS: Reply code %d!=200\n",
+ debug(33, 4) ("clientGetHeadersForIMS: Reply code %d!=200\n",
mem->reply->code);
clientProcessMiss(http);
return;
http);
return;
}
- debug(12, 4) ("clientGetHeadersForIMS: Not modified '%s'\n", storeUrl(entry));
+ debug(33, 4) ("clientGetHeadersForIMS: Not modified '%s'\n", storeUrl(entry));
reply = clientConstruct304reply(mem->reply);
comm_write(http->conn->fd,
xstrdup(reply),
{
clientHttpRequest *http = data;
StoreEntry *entry = http->entry;
- debug(12, 5) ("clientHandleIMSComplete: Not Modified sent '%s'\n", storeUrl(entry));
+ debug(33, 5) ("clientHandleIMSComplete: Not Modified sent '%s'\n", storeUrl(entry));
/* Set up everything for the logging */
storeUnregister(entry, http);
storeUnlockObject(entry);
request_t *r = http->request;
int fd = http->conn->fd;
char *hdr;
- debug(12, 4) ("clientProcessRequest: %s '%s'\n",
+ debug(33, 4) ("clientProcessRequest: %s '%s'\n",
RequestMethodStr[r->method],
url);
if (r->method == METHOD_CONNECT) {
return;
}
http->log_type = clientProcessRequest2(http);
- debug(12, 4) ("clientProcessRequest: %s for '%s'\n",
+ debug(33, 4) ("clientProcessRequest: %s for '%s'\n",
log_tags[http->log_type],
http->uri);
if ((entry = http->entry) != NULL) {
aclCheck_t ch;
int answer;
ErrorState *err = NULL;
- debug(12, 4) ("clientProcessMiss: '%s %s'\n",
+ debug(33, 4) ("clientProcessMiss: '%s %s'\n",
RequestMethodStr[r->method], url);
- debug(12, 10) ("clientProcessMiss: request_hdr:\n%s\n", request_hdr);
+ debug(33, 10) ("clientProcessMiss: request_hdr:\n%s\n", request_hdr);
/*
* We might have a left-over StoreEntry from a failed cache hit
* or IMS request.
/* Make sure a complete line has been received */
if (strchr(conn->in.buf, '\n') == NULL) {
- debug(12, 5) ("Incomplete request line, waiting for more data\n");
+ debug(33, 5) ("Incomplete request line, waiting for more data\n");
*status = 0;
return NULL;
}
/* Look for request method */
if ((mstr = strtok(inbuf, "\t ")) == NULL) {
- debug(12, 1) ("parseHttpRequest: Can't get request method\n");
+ debug(33, 1) ("parseHttpRequest: Can't get request method\n");
http = xcalloc(1, sizeof(clientHttpRequest));
cbdataAdd(http, MEM_NONE);
http->conn = conn;
}
method = urlParseMethod(mstr);
if (method == METHOD_NONE) {
- debug(12, 1) ("parseHttpRequest: Unsupported method '%s'\n", mstr);
+ debug(33, 1) ("parseHttpRequest: Unsupported method '%s'\n", mstr);
http = xcalloc(1, sizeof(clientHttpRequest));
cbdataAdd(http, MEM_NONE);
http->conn = conn;
*status = -1;
return http;
}
- debug(12, 5) ("parseHttpRequest: Method is '%s'\n", mstr);
+ debug(33, 5) ("parseHttpRequest: Method is '%s'\n", mstr);
*method_p = method;
/* look for URL */
if ((url = strtok(NULL, "\r\n\t ")) == NULL) {
- debug(12, 1) ("parseHttpRequest: Missing URL\n");
+ debug(33, 1) ("parseHttpRequest: Missing URL\n");
http = xcalloc(1, sizeof(clientHttpRequest));
cbdataAdd(http, MEM_NONE);
http->conn = conn;
*status = -1;
return http;
}
- debug(12, 5) ("parseHttpRequest: Request is '%s'\n", url);
+ debug(33, 5) ("parseHttpRequest: Request is '%s'\n", url);
token = strtok(NULL, null_string);
for (t = token; t && *t && *t != '\n' && *t != '\r'; t++);
if (t == NULL || *t == '\0' || t == token || strncmp(token, "HTTP/", 5)) {
- debug(12, 3) ("parseHttpRequest: Missing HTTP identifier\n");
+ debug(33, 3) ("parseHttpRequest: Missing HTTP identifier\n");
http = xcalloc(1, sizeof(clientHttpRequest));
cbdataAdd(http, MEM_NONE);
http->conn = conn;
break;
if (end <= req_hdr) {
/* Invalid request */
- debug(12, 3) ("parseHttpRequest: No request headers?\n");
+ debug(33, 3) ("parseHttpRequest: No request headers?\n");
http = xcalloc(1, sizeof(clientHttpRequest));
cbdataAdd(http, MEM_NONE);
http->conn = conn;
xmemcpy(*headers_p, req_hdr, header_sz);
*(*headers_p + header_sz) = '\0';
- debug(12, 5) ("parseHttpRequest: Request Header is\n%s\n", *headers_p);
+ debug(33, 5) ("parseHttpRequest: Request Header is\n%s\n", *headers_p);
/* Assign http->uri */
if ((t = strchr(url, '\n'))) /* remove NL */
inet_ntoa(http->conn->me.sin_addr),
(int) Config.Accel.port,
url);
- debug(12, 5) ("VHOST REWRITE: '%s'\n", http->uri);
+ debug(33, 5) ("VHOST REWRITE: '%s'\n", http->uri);
} else {
url_sz = strlen(Config2.Accel.prefix) + strlen(url) +
Config.appendDomainLen + 1;
http->accel = 0;
}
http->log_uri = xstrdup(http->uri);
- debug(12, 5) ("parseHttpRequest: Complete request received\n");
+ debug(33, 5) ("parseHttpRequest: Complete request received\n");
if (free_request)
safe_free(url);
xfree(inbuf);
ErrorState *err = NULL;
fde *F = &fd_table[fd];
int len = conn->in.size - conn->in.offset - 1;
- debug(12, 4) ("clientReadRequest: FD %d: reading request...\n", fd);
+ debug(33, 4) ("clientReadRequest: FD %d: reading request...\n", fd);
size = read(fd, conn->in.buf + conn->in.offset, len);
fd_bytes(fd, size, FD_READ);
/*
return;
}
/* It might be half-closed, we can't tell */
- debug(12, 5) ("clientReadRequest: FD %d closed?\n", fd);
+ debug(33, 5) ("clientReadRequest: FD %d closed?\n", fd);
EBIT_SET(F->flags, FD_SOCKET_EOF);
conn->defer.until = squid_curtime + 1;
conn->defer.n++;
/* Limit the number of concurrent requests to 2 */
for (H = &conn->chr, nrequests = 0; *H; H = &(*H)->next, nrequests++);
if (nrequests >= 2) {
- debug(12, 2) ("clientReadRequest: FD %d max concurrent requests reached\n", fd);
- debug(12, 5) ("clientReadRequest: FD %d defering new request until one is done\n", fd);
+ debug(33, 2) ("clientReadRequest: FD %d max concurrent requests reached\n", fd);
+ debug(33, 5) ("clientReadRequest: FD %d defering new request until one is done\n", fd);
conn->defer.until = squid_curtime + 100; /* Reset when a request is complete */
break;
}
conn->nrequests++;
commSetTimeout(fd, Config.Timeout.lifetime, NULL, NULL);
if (parser_return_code < 0) {
- debug(12, 1) ("clientReadRequest: FD %d Invalid Request\n", fd);
+ debug(33, 1) ("clientReadRequest: FD %d Invalid Request\n", fd);
err = errorCon(ERR_INVALID_REQ, HTTP_BAD_REQUEST);
err->request_hdrs = xstrdup(conn->in.buf);
http->entry = clientCreateStoreEntry(http, method, 0);
break;
}
if ((request = urlParse(method, http->uri)) == NULL) {
- debug(12, 5) ("Invalid URL: %s\n", http->uri);
+ debug(33, 5) ("Invalid URL: %s\n", http->uri);
err = errorCon(ERR_INVALID_URL, HTTP_BAD_REQUEST);
err->src_addr = conn->peer.sin_addr;
err->url = xstrdup(http->uri);
if (k == 0) {
if (conn->in.offset >= Config.maxRequestSize) {
/* The request is too large to handle */
- debug(12, 0) ("Request won't fit in buffer.\n");
- debug(12, 0) ("Config 'request_size'= %d bytes.\n",
+ debug(33, 0) ("Request won't fit in buffer.\n");
+ debug(33, 0) ("Config 'request_size'= %d bytes.\n",
Config.maxRequestSize);
- debug(12, 0) ("This request = %d bytes.\n",
+ debug(33, 0) ("This request = %d bytes.\n",
conn->in.offset);
err = errorCon(ERR_INVALID_REQ, HTTP_REQUEST_ENTITY_TOO_LARGE);
http->entry = clientCreateStoreEntry(http, request->method, 0);
conn->in.size += REQUEST_BUF_SIZE;
conn->in.buf = xrealloc(conn->in.buf, conn->in.size);
meta_data.misc += REQUEST_BUF_SIZE;
- debug(12, 2) ("Handling a large request, offset=%d inbufsize=%d\n",
+ debug(33, 2) ("Handling a large request, offset=%d inbufsize=%d\n",
conn->in.offset, conn->in.size);
k = conn->in.size - 1 - conn->in.offset;
}
{
ConnStateData *conn = data;
ErrorState *err;
- debug(12, 2) ("requestTimeout: FD %d: lifetime is expired.\n", fd);
+ debug(33, 2) ("requestTimeout: FD %d: lifetime is expired.\n", fd);
if (fd_table[fd].rwstate) {
/*
* Some data has been sent to the client, just close the FD
sock, xstrerror());
return;
}
- debug(12, 4) ("httpAccept: FD %d: accepted\n", fd);
+ debug(33, 4) ("httpAccept: FD %d: accepted\n", fd);
connState = xcalloc(1, sizeof(ConnStateData));
connState->peer = peer;
connState->log_addr = peer.sin_addr;
return;
if (CheckQuickAbort2(http) == 0)
return;
- debug(12, 3) ("CheckQuickAbort: ABORTING %s\n", storeUrl(entry));
+ debug(33, 3) ("CheckQuickAbort: ABORTING %s\n", storeUrl(entry));
storeAbort(entry, 1);
}
return;
if (request_failure_ratio < 1.0)
return;
- debug(12, 0) ("Failure Ratio at %4.2f\n", request_failure_ratio);
- debug(12, 0) ("Going into hit-only-mode for %d minutes...\n",
+ debug(33, 0) ("Failure Ratio at %4.2f\n", request_failure_ratio);
+ debug(33, 0) ("Going into hit-only-mode for %d minutes...\n",
FAILURE_MODE_TIME / 60);
hit_only_mode_until = squid_curtime + FAILURE_MODE_TIME;
request_failure_ratio = 0.8; /* reset to something less than 1.0 */