From 2d65a8a9418731ba2459d766fc7f510d9537701b Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Sat, 12 Apr 2008 08:09:29 -0600 Subject: [PATCH] Author: Alex Rousskov Bug 2186 pt 2: DIRECT/ mixed with DIRECT/ --- src/forward.cc | 50 +++++++++++++++++++++++++++++++++++++++----------- src/forward.h | 1 + 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/forward.cc b/src/forward.cc index 9a928776cc..cfcacf0be1 100644 --- a/src/forward.cc +++ b/src/forward.cc @@ -681,7 +681,7 @@ FwdState::connectDone(int aServerFD, comm_err_t status, int xerrno) assert(server_fd == aServerFD); if (Config.onoff.log_ip_on_direct && status != COMM_ERR_DNS && fs->code == HIER_DIRECT) - hierarchyNote(&request->hier, fs->code, fd_table[server_fd].ipaddr); + updateHierarchyInfo(); if (status == COMM_ERR_DNS) { /* @@ -741,7 +741,7 @@ FwdState::connectTimeout(int fd) assert(fd == server_fd); if (Config.onoff.log_ip_on_direct && fs->code == HIER_DIRECT && fd_table[fd].ipaddr[0]) - hierarchyNote(&request->hier, fs->code, fd_table[fd].ipaddr); + updateHierarchyInfo(); if (entry->isEmpty()) { ErrorState *anErr = errorCon(ERR_CONNECT_FAIL, HTTP_GATEWAY_TIMEOUT, request); @@ -815,12 +815,10 @@ FwdState::connectStart() server_fd = fd; n_tries++; - if (!fs->_peer) { + if (!fs->_peer) origin_tries++; - hierarchyNote(&request->hier, fs->code, request->host); - } else { - hierarchyNote(&request->hier, fs->code, fs->_peer->host); - } + + updateHierarchyInfo(); comm_add_close_handler(fd, fwdServerClosedWrapper, this); @@ -879,9 +877,7 @@ FwdState::connectStart() commSetTimeout(fd, ctimeout, fwdConnectTimeoutWrapper, this); - if (fs->_peer) { - hierarchyNote(&request->hier, fs->code, fs->_peer->host); - } else { + if (!fs->_peer) { #if LINUX_TPROXY if (request->flags.tproxy) { @@ -914,9 +910,9 @@ FwdState::connectStart() } #endif - hierarchyNote(&request->hier, fs->code, request->host); } + updateHierarchyInfo(); commConnectStart(fd, host, port, fwdConnectDoneWrapper, this); } @@ -1200,6 +1196,38 @@ FwdState::serversFree(FwdServer ** FSVR) } } +// updates HierarchyLogEntry, guessing nextHop and its format +void +FwdState::updateHierarchyInfo() +{ + assert(request); + + FwdServer *fs = servers; + assert(fs); + + // some callers use one condition, some use the other; are they the same? + assert((fs->code == HIER_DIRECT) == !fs->_peer); + + const char *nextHop = NULL; + + if (fs->_peer) { + // went to peer, log peer domain name + nextHop = fs->_peer->host; + } else { + // went DIRECT, must honor log_ip_on_direct + + // XXX: or should we use request->host_addr here? how? + assert(server_fd >= 0); + nextHop = fd_table[server_fd].ipaddr; + if (!Config.onoff.log_ip_on_direct || !nextHop[0]) + nextHop = request->GetHost(); // domain name + } + + assert(nextHop); + hierarchyNote(&request->hier, fs->code, nextHop); +} + + /**** PRIVATE NON-MEMBER FUNCTIONS ********************************************/ static void diff --git a/src/forward.h b/src/forward.h index be43dfe6a1..ad9b0f15e7 100644 --- a/src/forward.h +++ b/src/forward.h @@ -62,6 +62,7 @@ private: void start(Pointer aSelf); static void logReplyStatus(int tries, http_status status); + void updateHierarchyInfo(); void completed(); void retryOrBail(); -- 2.47.2