--- Pound-2.3.2-orig/config.c Fri May 18 11:34:53 2007 +++ Pound-2.3.2/config.c Sun Jun 24 00:08:37 2007 @@ -242,6 +242,8 @@ svc->sess_type = SESS_BASIC; else if(!strcasecmp(cp, "HEADER")) svc->sess_type = SESS_HEADER; + else if(!strcasecmp(cp, "HOSTNAME")) + svc->sess_type = SESS_HOST; else { logmsg(LOG_ERR, "line %d: Unknown Session type \"%s\" - aborted", n_lin, cp); exit(1); @@ -263,7 +265,7 @@ logmsg(LOG_ERR, "line %d: Session type not defined - aborted", n_lin); exit(1); } - if(svc->sess_ttl <= 0) { + if((svc->sess_ttl <= 0) && (svc->sess_type!=SESS_HOST)){ logmsg(LOG_ERR, "line %d: Session TTL not defined - aborted", n_lin); exit(1); } diff -U3 Pound-2.3.2-orig/pound.h Pound-2.3.2/pound.h --- Pound-2.3.2-orig/pound.h Fri May 18 11:34:53 2007 +++ Pound-2.3.2/pound.h Fri Jun 08 15:44:20 2007 @@ -275,7 +275,7 @@ /* back-end types */ typedef enum { BACK_END, REDIRECTOR } BE_TYPE; -typedef enum { SESS_NONE, SESS_IP, SESS_COOKIE, SESS_PARM, SESS_HEADER, SESS_BASIC } SESS_TYPE; +typedef enum { SESS_NONE, SESS_IP, SESS_COOKIE, SESS_PARM, SESS_HEADER, SESS_BASIC, SESS_HOST } SESS_TYPE; /* back-end definition */ typedef struct _backend { diff -U3 Pound-2.3.2-orig\svc.c Pound-2.3.2\svc.c --- Pound-2.3.2-orig/svc.c Fri May 18 11:34:53 2007 +++ Pound-2.3.2/svc.c Fri Jun 15 09:53:28 2007 @@ -469,6 +469,37 @@ return 1; } +/** This is redundant, but prevents an API change of requiring v_host to be + * passed from thr_http to get_backend */ +static int +get_HOSTNAME(char *res, const SERVICE *svc, char **const headers) +{ + int i, n; + char buf[MAXBUF]; + + for(i = 0; i < (MAXHEADERS - 1); i++) { + if(headers[i] == NULL) + continue; + /** Use same logic as thr_http for Host detection */ + switch(check_header(headers[i], buf)) { + case HEADER_HOST: + n = strlen(buf); + if (n > KEY_SIZE) + n = KEY_SIZE; + strncpy(res, buf, n); + res[n] = '\0'; + /* Calculate hash */ + n = 0; + for (i = 0; i < strlen(res); i++) { + n+= (int)res[i]; + } + return n; + } + } + res[0] = '\0'; + return 0; +} + static int get_HEADERS(char *res, const SERVICE *svc, char **const headers) { @@ -539,6 +570,14 @@ svc->sessions = t_add(svc->sessions, key, &res, sizeof(res)); } else memcpy(&res, vp, sizeof(res)); + break; + /** Hostname detection - no session storage; always use map to hash */ + case SESS_HOST: + if(ret_val = get_HOSTNAME(key, svc, headers)) { + res = rand_backend(svc->backends, ret_val % svc->tot_pri); + } else { + res = rand_backend(svc->backends, random() % svc->tot_pri); + } break; case SESS_PARM: if(get_REQUEST(key, svc, request)) {