]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3301: ERR_DNS_FAIL never shown
authorAmos Jeffries <squid3@treenet.co.nz>
Mon, 28 Nov 2011 01:39:47 +0000 (18:39 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Mon, 28 Nov 2011 01:39:47 +0000 (18:39 -0700)
errors/templates/ERR_CANNOT_FORWARD
src/PeerSelectState.h
src/forward.cc
src/peer_select.cc
src/tunnel.cc

index 6abe3ce1a58385724621fafe3abe9af1124ce4ec..63fc1fc2efbaaf74fc4e6fde4bbbf57afce02bf8 100644 (file)
@@ -27,7 +27,6 @@ body
 
 <p>Some possible problems are:</p>
 <ul>
-<li id="missing-dns">The domain name <q>%H</q> might not be found in DNS.</li>
 <li id="network-down">An Internet connection needed to access this domains origin servers may be down.</li>
 <li id="no-peer">All configured parent caches may be currently unreachable.</li>
 <li id="permission-denied">The administrator may not allow this cache to make direct connections to origin servers.</li>
index 7a323ac9c0083794cad8d60f0b9d7297281a29fd..639f041a4f2435873f12c65f1483cc15336be308 100644 (file)
@@ -43,8 +43,9 @@
 
 class HttpRequest;
 class StoreEntry;
+class ErrorState;
 
-typedef void PSC(Comm::ConnectionList *, void *);
+typedef void PSC(Comm::ConnectionList *, ErrorState *, void *);
 
 SQUIDCEXTERN void peerSelect(Comm::ConnectionList *, HttpRequest *, StoreEntry *, PSC *, void *data);
 SQUIDCEXTERN void peerSelectInit(void);
@@ -79,6 +80,7 @@ public:
     int direct;   // TODO: fold always_direct/never_direct/prefer_direct into this now that ACL can do a multi-state result.
     PSC *callback;
     void *callback_data;
+    ErrorState *lastError;
 
     Comm::ConnectionList *paths;    ///< the callers paths array. to be filled with our final results.
     FwdServer *servers;    ///< temporary linked list of peers we will pass back.
index 0ee278c7ae0812042a2b0fabe7e3218b10f6a7c5..5e69efb06f2ef8c66be794e8c785593abab955c4 100644 (file)
@@ -402,9 +402,11 @@ FwdState::complete()
 /**** CALLBACK WRAPPERS ************************************************************/
 
 static void
-fwdPeerSelectionCompleteWrapper(Comm::ConnectionList * unused, void *data)
+fwdPeerSelectionCompleteWrapper(Comm::ConnectionList * unused, ErrorState *err, void *data)
 {
     FwdState *fwd = (FwdState *) data;
+    if (err)
+        fwd->fail(err);
     fwd->startConnectionOrFail();
 }
 
index a4546e2feed1ce055ba51016121b8c5270d94f79..c822b9db6563784d122c860b108c7f8aa107978c 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "squid.h"
 #include "DnsLookupDetails.h"
+#include "errorpage.h"
 #include "event.h"
 #include "PeerSelectState.h"
 #include "Store.h"
@@ -104,6 +105,8 @@ peerSelectStateFree(ps_state * psstate)
         psstate->entry = NULL;
     }
 
+    delete psstate->lastError;
+
     cbdataFree(psstate);
 }
 
@@ -259,7 +262,8 @@ peerSelectDnsPaths(ps_state *psstate)
 
     void *cbdata;
     if (cbdataReferenceValidDone(psstate->callback_data, &cbdata)) {
-        callback(psstate->paths, cbdata);
+        callback(psstate->paths, psstate->lastError, cbdata);
+        psstate->lastError = NULL; // FwdState has taken control over the ErrorState object.
     }
 
     peerSelectStateFree(psstate);
@@ -311,6 +315,13 @@ peerSelectDnsResults(const ipcache_addrs *ia, const DnsLookupDetails &details, v
         }
     } else {
         debugs(44, 3, HERE << "Unknown host: " << fs->_peer ? fs->_peer->host : psstate->request->GetHost());
+        // discard any previous error.
+        delete psstate->lastError;
+        psstate->lastError = NULL;
+        if (fs->code == HIER_DIRECT) {
+            psstate->lastError = new ErrorState(ERR_DNS_FAIL, HTTP_SERVICE_UNAVAILABLE, psstate->request);
+            psstate->lastError->dnsError = details.error;
+        }
     }
 
     psstate->servers = fs->next;
@@ -893,6 +904,7 @@ ps_state::ps_state() : request (NULL),
         direct(DIRECT_UNKNOWN),
         callback (NULL),
         callback_data (NULL),
+        lastError(NULL),
         servers (NULL),
         first_parent_miss(),
         closest_parent_miss(),
index e188f51d916689ee60bb6d16c8e82f481485d3b5..67c0b5e0e4574d9f10777dce1d73bcedc157f7a2 100644 (file)
@@ -697,20 +697,23 @@ tunnelRelayConnectRequest(const Comm::ConnectionPointer &srv, void *data)
 }
 
 static void
-tunnelPeerSelectComplete(Comm::ConnectionList *peer_paths, void *data)
+tunnelPeerSelectComplete(Comm::ConnectionList *peer_paths, ErrorState *err, void *data)
 {
     TunnelStateData *tunnelState = (TunnelStateData *)data;
 
     if (peer_paths == NULL || peer_paths->size() < 1) {
         debugs(26, 3, HERE << "No paths found. Aborting CONNECT");
-        ErrorState *err;
-        err = new ErrorState(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE, tunnelState->request);
-        *tunnelState->status_ptr = HTTP_SERVICE_UNAVAILABLE;
+        if (!err) {
+            err = new ErrorState(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE, tunnelState->request);
+        }
+        *tunnelState->status_ptr = err->httpStatus;
         err->callback = tunnelErrorComplete;
         err->callback_data = tunnelState;
         errorSend(tunnelState->client.conn, err);
         return;
     }
+    delete err;
+
     debugs(26, 3, HERE << "paths=" << peer_paths->size() << ", p[0]={" << (*peer_paths)[0] << "}, serverDest[0]={" <<
            tunnelState->serverDestinations[0] << "}");