]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Author: Alex Rousskov <rousskov@measurement-factory.com>
authorAmos Jeffries <amosjeffries@squid-cache.org>
Sat, 12 Apr 2008 14:09:29 +0000 (08:09 -0600)
committerAmos Jeffries <amosjeffries@squid-cache.org>
Sat, 12 Apr 2008 14:09:29 +0000 (08:09 -0600)
Bug 2186 pt 2: DIRECT/<ip> mixed with DIRECT/<hostname>

src/forward.cc
src/forward.h

index 9a928776ccf69253bb9ed9ad91153c93b7e0b360..cfcacf0be1d41887383ffb56b233ed9e90fbe2b6 100644 (file)
@@ -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
index be43dfe6a11e4d3bf64b225f49f9202b57b729bf..ad9b0f15e7eef4cb3610bf041ddfbcb2369ef1ee 100644 (file)
@@ -62,6 +62,7 @@ private:
     void start(Pointer aSelf);
 
     static void logReplyStatus(int tries, http_status status);
+    void updateHierarchyInfo();
     void completed();
     void retryOrBail();