From: serassio <> Date: Sat, 10 Sep 2005 22:03:52 +0000 (+0000) Subject: Bug #1342: Odd URLs in error messages on forwarded requests X-Git-Tag: SQUID_3_0_PRE4~641 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6cae5db192af26b1c74edba75df7dd902af72e04;p=thirdparty%2Fsquid.git Bug #1342: Odd URLs in error messages on forwarded requests While trying to retrieve the URL:NONE://10.72.43.56:8181http://www.abcd.com/ and error message content incomplete (many % codes not known) in several other error conditions Forward port of 2.5 patch. --- diff --git a/src/cache_manager.cc b/src/cache_manager.cc index fb04c39e68..2aecaa823e 100644 --- a/src/cache_manager.cc +++ b/src/cache_manager.cc @@ -1,6 +1,6 @@ /* - * $Id: cache_manager.cc,v 1.31 2003/09/01 03:49:38 robertc Exp $ + * $Id: cache_manager.cc,v 1.32 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 16 Cache Manager Objects * AUTHOR: Duane Wessels @@ -251,6 +251,7 @@ cachemgrStart(int fd, HttpRequest * request, StoreEntry * entry) if ((mgr = cachemgrParseUrl(storeUrl(entry))) == NULL) { err = errorCon(ERR_INVALID_URL, HTTP_NOT_FOUND); err->url = xstrdup(storeUrl(entry)); + err->request = requestLink(request); errorAppendEntry(entry, err); entry->expires = squid_curtime; return; diff --git a/src/forward.cc b/src/forward.cc index 47f7fa2541..306e6b2618 100644 --- a/src/forward.cc +++ b/src/forward.cc @@ -1,6 +1,6 @@ /* - * $Id: forward.cc,v 1.128 2005/06/09 16:04:30 serassio Exp $ + * $Id: forward.cc,v 1.129 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 17 Request Forwarding * AUTHOR: Duane Wessels @@ -414,8 +414,6 @@ fwdConnectDone(int server_fd, comm_err_t status, int xerrno, void *data) err->dnsserver_msg = xstrdup(dns_error_message); - err->request = requestLink(request); - fwdFail(fwdState, err); comm_close(server_fd); @@ -432,7 +430,6 @@ fwdConnectDone(int server_fd, comm_err_t status, int xerrno, void *data) err->port = request->port; } - err->request = requestLink(request); fwdFail(fwdState, err); if (fs->_peer) @@ -469,7 +466,6 @@ fwdConnectTimeout(int fd, void *data) if (entry->isEmpty()) { err = errorCon(ERR_CONNECT_FAIL, HTTP_GATEWAY_TIMEOUT); - err->request = requestLink(fwdState->request); err->xerrno = ETIMEDOUT; fwdFail(fwdState, err); /* @@ -632,7 +628,6 @@ fwdConnectStart(void *data) debug(50, 4) ("fwdConnectStart: %s\n", xstrerror()); err = errorCon(ERR_SOCKET_FAILURE, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; - err->request = requestLink(fwdState->request); fwdFail(fwdState, err); fwdStateFree(fwdState); return; @@ -686,7 +681,6 @@ fwdStartFail(FwdState * fwdState) ErrorState *err; debug(17, 3) ("fwdStartFail: %s\n", storeUrl(fwdState->entry)); err = errorCon(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE); - err->request = requestLink(fwdState->request); err->xerrno = errno; fwdFail(fwdState, err); fwdStateFree(fwdState); @@ -781,7 +775,6 @@ fwdDispatch(FwdState * fwdState) debug(17, 1) ("fwdDispatch: Cannot retrieve '%s'\n", storeUrl(entry)); err = errorCon(ERR_UNSUP_REQ, HTTP_BAD_REQUEST); - err->request = requestLink(request); fwdFail(fwdState, err); /* * Force a persistent connection to be closed because @@ -953,7 +946,6 @@ fwdStart(int fd, StoreEntry * e, HttpRequest * r) void fwdFail(FwdState * fwdState, ErrorState * errorState) { - assert(EBIT_TEST(fwdState->entry->flags, ENTRY_FWD_HDR_WAIT)); debug(17, 3) ("fwdFail: %s \"%s\"\n\t%s\n", err_type_str[errorState->type], httpStatusString(errorState->httpStatus), @@ -963,6 +955,9 @@ fwdFail(FwdState * fwdState, ErrorState * errorState) errorStateFree(fwdState->err); fwdState->err = errorState; + + if (!errorState->request) + errorState->request = requestLink(fwdState->request); } /* diff --git a/src/ftp.cc b/src/ftp.cc index 992d9eabfe..45762f9ce9 100644 --- a/src/ftp.cc +++ b/src/ftp.cc @@ -1,6 +1,6 @@ /* - * $Id: ftp.cc,v 1.364 2005/09/03 10:09:09 serassio Exp $ + * $Id: ftp.cc,v 1.365 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 9 File Transfer Protocol (FTP) * AUTHOR: Harvest Derived @@ -2956,8 +2956,6 @@ ftpFailedErrorMessage(FtpStateData * ftpState, err_type error, int xerrno) err->xerrno = xerrno; - err->request = requestLink(ftpState->request); - err->ftp.server_msg = ftpState->ctrl.message; ftpState->ctrl.message = NULL; diff --git a/src/gopher.cc b/src/gopher.cc index 57e95fca63..9da8be0d45 100644 --- a/src/gopher.cc +++ b/src/gopher.cc @@ -1,6 +1,6 @@ /* - * $Id: gopher.cc,v 1.187 2005/05/01 08:11:48 serassio Exp $ + * $Id: gopher.cc,v 1.188 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 10 Gopher * AUTHOR: Harvest Derived @@ -707,12 +707,8 @@ gopherTimeout(int fd, void *data) StoreEntry *entry = gopherState->entry; debug(10, 4) ("gopherTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); - if (entry->store_status == STORE_PENDING) { - if (entry->isEmpty()) { - fwdFail(gopherState->fwdState, - errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); - } - } + fwdFail(gopherState->fwdState, + errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); comm_close(fd); } @@ -780,24 +776,16 @@ gopherReadReply(int fd, char *buf, size_t len, comm_err_t flag, int xerrno, void if (ignoreErrno(errno)) { do_next_read = 1; - } else if (entry->isEmpty()) { + } else { ErrorState *err; err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; - err->url = xstrdup(storeUrl(entry)); - errorAppendEntry(entry, err); - comm_close(fd); - do_next_read = 0; - } else { + fwdFail(gopherState->fwdState, err); comm_close(fd); do_next_read = 0; } } else if (len == 0 && entry->isEmpty()) { - ErrorState *err; - err = errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE); - err->xerrno = errno; - err->url = xstrdup(gopherState->request); - errorAppendEntry(entry, err); + fwdFail(gopherState->fwdState, errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE)); comm_close(fd); do_next_read = 0; } else if (len == 0) { @@ -850,12 +838,12 @@ gopherSendComplete(int fd, char *buf, size_t size, comm_err_t errflag, int xerrn if (errflag) { ErrorState *err; - err = errorCon(ERR_CONNECT_FAIL, HTTP_SERVICE_UNAVAILABLE); + err = errorCon(ERR_WRITE_ERROR, HTTP_SERVICE_UNAVAILABLE); err->xerrno = errno; err->host = xstrdup(gopherState->req->host); err->port = gopherState->req->port; err->url = xstrdup(storeUrl(entry)); - errorAppendEntry(entry, err); + fwdFail(gopherState->fwdState, err); comm_close(fd); if (buf) @@ -963,18 +951,6 @@ gopherStart(FwdState * fwdState) /* Parse url. */ gopher_request_parse(fwdState->request, &gopherState->type_id, gopherState->request); -#if OLD_PARSE_ERROR_CODE - - if (...) { - ErrorState *err; - err = errorCon(ERR_INVALID_URL, HTTP_BAD_REQUEST); - err->url = xstrdup(storeUrl(entry)); - errorAppendEntry(entry, err); - gopherStateFree(-1, gopherState); - return; - } - -#endif comm_add_close_handler(fd, gopherStateFree, gopherState); if (((gopherState->type_id == GOPHER_INDEX) || (gopherState->type_id == GOPHER_CSO)) diff --git a/src/http.cc b/src/http.cc index 197e1740a1..a74d086917 100644 --- a/src/http.cc +++ b/src/http.cc @@ -1,6 +1,6 @@ /* - * $Id: http.cc,v 1.455 2005/08/31 19:15:36 wessels Exp $ + * $Id: http.cc,v 1.456 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 11 Hypertext Transfer Protocol (HTTP) * AUTHOR: Harvest Derived @@ -124,10 +124,8 @@ httpTimeout(int fd, void *data) debug(11, 4) ("httpTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); if (entry->store_status == STORE_PENDING) { - if (entry->isEmpty()) { - fwdFail(httpState->fwd, - errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); - } + fwdFail(httpState->fwd, + errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); } comm_close(fd); @@ -1004,24 +1002,16 @@ HttpStateData::readReply (int fd, char *readBuf, size_t len, comm_err_t flag, in if (ignoreErrno(errno)) { flags.do_next_read = 1; - } else if (entry->isEmpty()) { + } else { ErrorState *err; err = errorCon(ERR_READ_ERROR, HTTP_BAD_GATEWAY); - err->request = requestLink((HttpRequest *) request); err->xerrno = errno; fwdFail(fwd, err); flags.do_next_read = 0; comm_close(fd); - } else { - flags.do_next_read = 0; - comm_close(fd); } } else if (flag == COMM_OK && len == 0 && entry->isEmpty()) { - ErrorState *err; - err = errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_BAD_GATEWAY); - err->xerrno = errno; - err->request = requestLink((HttpRequest *) request); - fwdFail(fwd, err); + fwdFail(fwd, errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_BAD_GATEWAY)); eof = 1; flags.do_next_read = 0; comm_close(fd); @@ -1038,18 +1028,12 @@ HttpStateData::readReply (int fd, char *readBuf, size_t len, comm_err_t flag, in */ processReplyHeader(buf, len); else if (entry->getReply()->sline.status == HTTP_INVALID_HEADER && HttpVersion(0,9) != entry->getReply()->sline.version) { - ErrorState *err; - err = errorCon(ERR_INVALID_RESP, HTTP_BAD_GATEWAY); - err->request = requestLink((HttpRequest *) request); - fwdFail(fwd, err); + fwdFail(fwd, errorCon(ERR_INVALID_RESP, HTTP_BAD_GATEWAY)); flags.do_next_read = 0; } else { if (entry->mem_obj->getReply()->sline.status == HTTP_HEADER_TOO_LARGE) { - ErrorState *err; storeEntryReset(entry); - err = errorCon(ERR_TOO_BIG, HTTP_BAD_GATEWAY); - err->request = requestLink((HttpRequest *) request); - fwdFail(fwd, err); + fwdFail(fwd, errorCon(ERR_TOO_BIG, HTTP_BAD_GATEWAY)); fwd->flags.dont_retry = 1; } else { fwdComplete(fwd); @@ -1067,11 +1051,8 @@ HttpStateData::readReply (int fd, char *readBuf, size_t len, comm_err_t flag, in HttpVersion httpver = entry->getReply()->sline.version; if (s == HTTP_INVALID_HEADER && httpver != HttpVersion(0,9)) { - ErrorState *err; storeEntryReset(entry); - err = errorCon(ERR_INVALID_RESP, HTTP_BAD_GATEWAY); - err->request = requestLink((HttpRequest *) request); - fwdFail(fwd, err); + fwdFail(fwd, errorCon(ERR_INVALID_RESP, HTTP_BAD_GATEWAY)); comm_close(fd); return; } @@ -1210,8 +1191,6 @@ void HttpStateData::SendComplete(int fd, char *bufnotused, size_t size, comm_err_t errflag, void *data) { HttpStateData *httpState = static_cast(data); - StoreEntry *entry = httpState->entry; - ErrorState *err; debug(11, 5) ("httpSendComplete: FD %d: size %d: errflag %d.\n", fd, (int) size, errflag); #if URL_CHECKSUM_DEBUG @@ -1229,10 +1208,10 @@ HttpStateData::SendComplete(int fd, char *bufnotused, size_t size, comm_err_t er return; if (errflag) { + ErrorState *err; err = errorCon(ERR_WRITE_ERROR, HTTP_BAD_GATEWAY); err->xerrno = errno; - err->request = requestLink(httpState->orig_request); - errorAppendEntry(entry, err); + fwdFail(httpState->fwd, err); comm_close(fd); return; } else { @@ -1869,7 +1848,6 @@ httpSendRequestEntity(int fd, char *bufnotused, size_t size, comm_err_t errflag, { HttpStateData *httpState = static_cast(data); StoreEntry *entry = httpState->entry; - ErrorState *err; debug(11, 5) ("httpSendRequestEntity: FD %d: size %d: errflag %d.\n", fd, (int) size, errflag); @@ -1883,10 +1861,10 @@ httpSendRequestEntity(int fd, char *bufnotused, size_t size, comm_err_t errflag, return; if (errflag) { + ErrorState *err; err = errorCon(ERR_WRITE_ERROR, HTTP_BAD_GATEWAY); err->xerrno = errno; - err->request = requestLink(httpState->orig_request); - errorAppendEntry(entry, err); + fwdFail(httpState->fwd, err); comm_close(fd); return; } diff --git a/src/urn.cc b/src/urn.cc index ce5e6a7cc8..55e508870d 100644 --- a/src/urn.cc +++ b/src/urn.cc @@ -1,6 +1,6 @@ /* - * $Id: urn.cc,v 1.87 2005/08/31 19:15:36 wessels Exp $ + * $Id: urn.cc,v 1.88 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 52 URN Parsing * AUTHOR: Kostas Anagnostakis @@ -226,6 +226,7 @@ UrnState::setUriResFromRequest(HttpRequest *r) debug(52, 3) ("urnStart: Bad uri-res URL %s\n", urlres); ErrorState *err = errorCon(ERR_URN_RESOLVE, HTTP_NOT_FOUND); err->url = urlres; + err->request = requestLink(r); urlres = NULL; errorAppendEntry(entry, err); return; diff --git a/src/wais.cc b/src/wais.cc index d1e7eb11fb..9b487534f2 100644 --- a/src/wais.cc +++ b/src/wais.cc @@ -1,6 +1,6 @@ /* - * $Id: wais.cc,v 1.151 2005/08/31 19:15:36 wessels Exp $ + * $Id: wais.cc,v 1.152 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 24 WAIS Relay * AUTHOR: Harvest Derived @@ -87,10 +87,8 @@ waisTimeout(int fd, void *data) debug(24, 4) ("waisTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); if (entry->store_status == STORE_PENDING) { - if (!waisState->dataWritten) { - fwdFail(waisState->fwd, - errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); - } + fwdFail(waisState->fwd, + errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); } comm_close(fd); @@ -161,20 +159,13 @@ waisReadReply(int fd, char *buf, size_t len, comm_err_t flag, int xerrno, void * comm_read(fd, waisState->buf, read_sz, waisReadReply, waisState); } else { ErrorState *err; - EBIT_CLR(entry->flags, ENTRY_CACHABLE); - storeReleaseRequest(entry); err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; - err->request = requestLink(waisState->request); - errorAppendEntry(entry, err); + fwdFail(waisState->fwd, err); comm_close(fd); } } else if (flag == COMM_OK && len == 0 && !waisState->dataWritten) { - ErrorState *err; - err = errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE); - err->xerrno = errno; - err->request = requestLink(waisState->request); - errorAppendEntry(entry, err); + fwdFail(waisState->fwd, errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE)); comm_close(fd); } else if (flag == COMM_OK && len == 0) { /* Connection closed; retrieval done. */ @@ -211,8 +202,7 @@ waisSendComplete(int fd, char *bufnotused, size_t size, comm_err_t errflag, void ErrorState *err; err = errorCon(ERR_WRITE_ERROR, HTTP_SERVICE_UNAVAILABLE); err->xerrno = errno; - err->request = requestLink(waisState->request); - errorAppendEntry(entry, err); + fwdFail(waisState->fwd, err); comm_close(fd); } else { /* Schedule read reply. */ diff --git a/src/whois.cc b/src/whois.cc index 8ec8ab2317..3bb150b200 100644 --- a/src/whois.cc +++ b/src/whois.cc @@ -1,6 +1,6 @@ /* - * $Id: whois.cc,v 1.28 2003/09/01 03:49:40 robertc Exp $ + * $Id: whois.cc,v 1.29 2005/09/10 16:03:52 serassio Exp $ * * DEBUG: section 75 WHOIS protocol * AUTHOR: Duane Wessels, Kostas Anagnostakis @@ -153,16 +153,13 @@ WhoisState::readReply (int fd, char *buf, size_t len, comm_err_t flag, int xerrn if (ignoreErrno(errno)) { do_next_read = 1; - } else if (!dataWritten) { + } else { ErrorState *err; err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; fwdFail(fwd, err); comm_close(fd); do_next_read = 0; - } else { - comm_close(fd); - do_next_read = 0; } } else { storeTimestampsSet(entry);