While using Squid as an httpd-accelerator and general front-end server
for SSL handling and distributing requests, I added a few small features
that I needed. I am sending this patch to the list in case anybody else
is interested in these humble improvements.

The added options are:
- peer option 'httpd' sends normal HTTP requests to that peer instead of
  proxy requests.
- peer option 'immortal' prevents the peer from ever being marked dead.
- global option 'forward_retries' allows the previously hardcoded number
  of retries (10) to be changed.
- global option 'httpd_accel_with_icp' turns on ICP without turning on
  full proxy mode.

Regards, Karsten

P.S. Please CC any replies to me, as I am not subscribed to the list.
diff -ru squid-2.5.STABLE5-20040329/src/access_log.c 
squid-2.5.5-intrical/src/access_log.c
--- squid-2.5.STABLE5-20040329/src/access_log.c Mon Jul 28 20:59:28 2003
+++ squid-2.5.5-intrical/src/access_log.c       Mon Mar 29 14:21:46 2004
@@ -290,6 +290,41 @@
     safe_free(user2);
 }
 
+static void
+accessLogCombined(AccessLogEntry *al)
+{
+    const char *client = NULL;
+    char *user1, *user2;
+    const char *agent = NULL, *refer = NULL;
+
+    if (Config.onoff.log_fqdn)
+       client = fqdncache_gethostbyaddr(al->cache.caddr, 0);
+    if (client == NULL)
+       client = inet_ntoa(al->cache.caddr);
+    user1 = accessLogFormatName(al->cache.authuser);
+    user2 = accessLogFormatName(al->cache.rfc931);
+    if (al->req_hdr) {
+        refer = httpHeaderGetStr(al->req_hdr, HDR_REFERER);
+        agent = httpHeaderGetStr(al->req_hdr, HDR_USER_AGENT);
+    }
+    logfilePrintf(logfile, "%s %s %s [%s] \"%s %s HTTP/%d.%d\" %d %ld \"%s\" \"%s\" 
%s:%s",
+       client,
+       user2 ? user2 : dash_str,
+       user1 ? user1 : dash_str,
+       mkhttpdlogtime(&squid_curtime),
+       al->private.method_str,
+       al->url,
+       al->http.version.major, al->http.version.minor,
+       al->http.code,
+       (long int) al->cache.size,
+       refer ? refer : "",
+       agent ? agent : "",
+       log_tags[al->cache.code],
+       hier_strings[al->hier.code]);
+    safe_free(user1);
+    safe_free(user2);
+}
+
 void
 accessLogLog(AccessLogEntry * al)
 {
@@ -306,7 +341,9 @@
     if (al->hier.host[0] == '\0')
        xstrncpy(al->hier.host, dash_str, SQUIDHOSTNAMELEN);
 
-    if (Config.onoff.common_log)
+    if (Config.onoff.combined_log)
+        accessLogCombined(al);
+    else if (Config.onoff.common_log)
        accessLogCommon(al);
     else
        accessLogSquid(al);
diff -ru squid-2.5.STABLE5-20040329/src/cache_cf.c squid-2.5.5-intrical/src/cache_cf.c
--- squid-2.5.STABLE5-20040329/src/cache_cf.c   Sun Dec  7 06:19:36 2003
+++ squid-2.5.5-intrical/src/cache_cf.c Wed Mar 31 15:49:47 2004
@@ -1473,6 +1473,10 @@
            p->options.allow_miss = 1;
        } else if (!strncasecmp(token, "max-conn=", 9)) {
            p->max_conn = atoi(token + 9);
+       } else if (!strcasecmp(token, "httpd")) {
+           p->options.httpd = 1;
+       } else if (!strcasecmp(token, "immortal")) {
+           p->options.immortal = 1;
        } else {
            debug(3, 0) ("parse_peer: token='%s'\n", token);
            self_destruct();
diff -ru squid-2.5.STABLE5-20040329/src/cf.data.pre 
squid-2.5.5-intrical/src/cf.data.pre
--- squid-2.5.STABLE5-20040329/src/cf.data.pre  Wed Feb 11 10:01:21 2004
+++ squid-2.5.5-intrical/src/cf.data.pre        Wed Mar 31 16:26:20 2004
@@ -276,6 +276,8 @@
                     max-conn
                     htcp
                     carp-load-factor
+                    httpd
+                    immortal
 
                     use 'proxy-only' to specify that objects fetched
                     from this cache should not be saved locally.
@@ -373,6 +375,17 @@
                     cache as one participating in a CARP array.
                     The 'f' values for all CARP parents must add
                     up to 1.0.
+
+                    use 'httpd' for peers that aren't actualy proxy servers,
+                    and thus don't understand proxy requests. This will
+                    cause the protocol, hostname and port to be omitted
+                    when forwarding a request to this peer. This is mostly
+                    useful in accelerator mode when configuring back-end
+                    servers as peers.
+                
+                    use 'immortal' to prevent the peer from ever being
+                    marked as DEAD. This is mainly useful in httpd accel mode
+                    when you have configured your backend servers as peers.
                 
 
        NOTE: non-ICP/HTCP neighbors must be specified as 'parent'.
@@ -910,6 +923,20 @@
        information that Squid-specific log analyzers use.
 DOC_END
 
+NAME: emulate_httpd_combined_log
+COMMENT: on|off
+TYPE: onoff
+DEFAULT: off
+LOC: Config.onoff.combined_log
+DOC_START
+       The cache can emulate the combined log file format which
+       many 'httpd' programs use. The combined log format is similar
+       to the common log format enabled by setting 'emulate_httpd_log',
+       but includes Referer and User-Agent information. If both
+       'emulate_http_combined_log' and 'emulate_httpd_log' are set,
+       combined log format takes precedence.
+DOC_END
+
 NAME: log_ip_on_direct
 COMMENT: on|off
 TYPE: onoff
@@ -2575,6 +2602,16 @@
        setting)
 DOC_END
 
+NAME: httpd_accel_with_icp
+COMMENT: on|off
+TYPE: onoff
+DEFAULT: off
+LOC: Config.onoff.accel_with_icp
+DOC_START
+       If you want to enable ICP in accelerator mode, change this to 'on'.
+       ICP is automatically enabled if httpd_accel_with_proxy is set.
+DOC_END
+
 NAME: httpd_accel_uses_host_header
 COMMENT: on|off
 TYPE: onoff
@@ -3188,6 +3225,14 @@
 
        Note: This is in addition to the request reforwarding which
        takes place if Squid fails to get a satisfying response.
+DOC_END
+
+NAME: forward_retries
+TYPE: int
+LOC: Config.retry.forward
+DEFAULT: 10
+DOC_START
+       This sets the number of retries for forwarding connections.
 DOC_END
 
 NAME: snmp_port
diff -ru squid-2.5.STABLE5-20040329/src/client_side.c 
squid-2.5.5-intrical/src/client_side.c
--- squid-2.5.STABLE5-20040329/src/client_side.c        Thu Feb 19 07:51:16 2004
+++ squid-2.5.5-intrical/src/client_side.c      Mon Mar 29 14:21:46 2004
@@ -844,6 +844,7 @@
            memBufDefInit(&mb);
            packerToMemInit(&p, &mb);
            httpHeaderPackInto(&request->header, &p);
+           http->al.req_hdr = &request->header;
            http->al.http.method = request->method;
            http->al.http.version = request->http_ver;
            http->al.headers.request = xstrdup(mb.buf);
diff -ru squid-2.5.STABLE5-20040329/src/forward.c squid-2.5.5-intrical/src/forward.c
--- squid-2.5.STABLE5-20040329/src/forward.c    Thu Feb 19 02:44:55 2004
+++ squid-2.5.5-intrical/src/forward.c  Mon Mar 29 14:21:46 2004
@@ -133,7 +133,7 @@
        return 0;
     if (fwdState->entry->mem_obj->inmem_hi > 0)
        return 0;
-    if (fwdState->n_tries > 10)
+    if (fwdState->n_tries > Config.retry.forward)
        return 0;
     if (fwdState->origin_tries > 2)
        return 0;
diff -ru squid-2.5.STABLE5-20040329/src/http.c squid-2.5.5-intrical/src/http.c
--- squid-2.5.STABLE5-20040329/src/http.c       Fri Mar 19 21:56:55 2004
+++ squid-2.5.5-intrical/src/http.c     Wed Mar 31 16:05:29 2004
@@ -1048,7 +1048,7 @@
     httpState->fd = fd;
     if (fwd->servers)
        httpState->peer = fwd->servers->peer;   /* might be NULL */
-    if (httpState->peer) {
+    if (httpState->peer && !httpState->peer->options.httpd) {
        proxy_req = requestCreate(orig_req->method,
            PROTO_NONE, storeUrl(httpState->entry));
        xstrncpy(proxy_req->host, httpState->peer->host, SQUIDHOSTNAMELEN);
@@ -1058,6 +1058,11 @@
        httpState->request = requestLink(proxy_req);
        httpState->orig_request = requestLink(orig_req);
        proxy_req->flags.proxying = 1;
+    } else {
+       httpState->request = requestLink(orig_req);
+       httpState->orig_request = requestLink(orig_req);
+    }
+    if (httpState->peer) {
        /*
         * This NEIGHBOR_PROXY_ONLY check probably shouldn't be here.
         * We might end up getting the object from somewhere else if,
@@ -1070,9 +1075,6 @@
        if (httpState->peer->options.no_delay)
            delaySetNoDelay(fd);
 #endif
-    } else {
-       httpState->request = requestLink(orig_req);
-       httpState->orig_request = requestLink(orig_req);
     }
     /*
      * register the handler to free HTTP state data when the FD closes
diff -ru squid-2.5.STABLE5-20040329/src/icp_v2.c squid-2.5.5-intrical/src/icp_v2.c
--- squid-2.5.STABLE5-20040329/src/icp_v2.c     Sat May  5 01:37:42 2001
+++ squid-2.5.5-intrical/src/icp_v2.c   Mon Mar 29 14:21:46 2004
@@ -407,7 +407,7 @@
     int x;
     socklen_t len;
     wordlist *s;
-    if (Config2.Accel.on && !Config.onoff.accel_with_proxy)
+    if (Config2.Accel.on && !Config.onoff.accel_with_proxy && 
!Config.onoff.accel_with_icp)
        return;
     if ((port = Config.Port.icp) <= 0)
        return;
diff -ru squid-2.5.STABLE5-20040329/src/main.c squid-2.5.5-intrical/src/main.c
--- squid-2.5.STABLE5-20040329/src/main.c       Thu Dec 18 10:10:30 2003
+++ squid-2.5.5-intrical/src/main.c     Mon Mar 29 14:21:46 2004
@@ -383,7 +383,7 @@
 #endif
     serverConnectionsOpen();
     if (theOutIcpConnection >= 0) {
-       if (!Config2.Accel.on || Config.onoff.accel_with_proxy)
+       if (!Config2.Accel.on || Config.onoff.accel_with_proxy || 
Config.onoff.accel_with_icp)
            neighbors_open(theOutIcpConnection);
        else
            debug(1, 1) ("ICP port disabled in httpd_accelerator mode\n");
@@ -546,7 +546,7 @@
 #endif
     serverConnectionsOpen();
     if (theOutIcpConnection >= 0) {
-       if (!Config2.Accel.on || Config.onoff.accel_with_proxy)
+       if (!Config2.Accel.on || Config.onoff.accel_with_proxy || 
Config.onoff.accel_with_icp)
            neighbors_open(theOutIcpConnection);
        else
            debug(1, 1) ("ICP port disabled in httpd_accelerator mode\n");
diff -ru squid-2.5.STABLE5-20040329/src/neighbors.c 
squid-2.5.5-intrical/src/neighbors.c
--- squid-2.5.STABLE5-20040329/src/neighbors.c  Sun Nov 30 07:53:00 2003
+++ squid-2.5.5-intrical/src/neighbors.c        Wed Mar 31 16:16:10 2004
@@ -504,7 +504,7 @@
        } else {
            /* Neighbor is dead; ping it anyway, but don't expect a reply */
            /* log it once at the threshold */
-           if (p->stats.logged_state == PEER_ALIVE) {
+           if (p->stats.logged_state == PEER_ALIVE && !p->options.immortal) {
                debug(15, 1) ("Detected DEAD %s: %s/%d/%d\n",
                    neighborTypeStr(p),
                    p->host, p->http_port, p->icp.port);
@@ -1046,12 +1046,14 @@
        debug(15, 2) ("TCP connection to %s/%d dead\n", p->host, p->http_port);
        return;
     }
-    p->tcp_up--;
-    if (!p->tcp_up) {
-       debug(15, 1) ("Detected DEAD %s: %s/%d/%d\n",
-           neighborTypeStr(p),
-           p->host, p->http_port, p->icp.port);
-       p->stats.logged_state = PEER_DEAD;
+    if (!p->options.immortal) {
+       p->tcp_up--;
+       if (!p->tcp_up) {
+           debug(15, 1) ("Detected DEAD %s: %s/%d/%d\n",
+               neighborTypeStr(p),
+               p->host, p->http_port, p->icp.port);
+           p->stats.logged_state = PEER_DEAD;
+       }
     }
 }
 
diff -ru squid-2.5.STABLE5-20040329/src/structs.h squid-2.5.5-intrical/src/structs.h
--- squid-2.5.STABLE5-20040329/src/structs.h    Thu Feb  5 06:42:28 2004
+++ squid-2.5.5-intrical/src/structs.h  Wed Mar 31 16:11:52 2004
@@ -566,10 +566,12 @@
        int source_ping;
 #endif
        int common_log;
+       int combined_log;
        int log_mime_hdrs;
        int log_fqdn;
        int announce;
        int accel_with_proxy;
+       int accel_with_icp;
        int mem_pools;
        int test_reachability;
        int half_closed_clients;
@@ -643,6 +645,7 @@
     char *errorDirectory;
     struct {
        int maxtries;
+       int forward;
     } retry;
     struct {
        size_t limit;
@@ -1047,6 +1050,7 @@
        char *request;
        char *reply;
     } headers;
+    HttpHeader *req_hdr;
     struct {
        const char *method_str;
     } private;
@@ -1276,6 +1280,8 @@
        unsigned int no_delay:1;
 #endif
        unsigned int allow_miss:1;
+       unsigned int httpd:1;
+       unsigned int immortal:1;
     } options;
     int weight;
     struct {

Reply via email to