From 598da41537937f68a0808879fbbc1a72b1998e68 Mon Sep 17 00:00:00 2001 From: willy tarreau Date: Sun, 18 Dec 2005 01:07:29 +0100 Subject: [PATCH] * released 1.2.5-pre1 * build fixes for appsession * documentation for appsession --- doc/haproxy-en.txt | 36 ++++++++++++++++++++++++++++++++---- doc/haproxy-fr.txt | 8 ++++---- haproxy.c | 44 ++------------------------------------------ include/appsession.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/hashpjw.c | 4 ++-- 5 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 include/appsession.h diff --git a/doc/haproxy-en.txt b/doc/haproxy-en.txt index 2cb73d2bbd..ab14dcf1e4 100644 --- a/doc/haproxy-en.txt +++ b/doc/haproxy-en.txt @@ -100,6 +100,7 @@ the following ones : - debug - quiet - pidfile + - stats 1.1) Event logging ------------------ @@ -623,6 +624,33 @@ Example : the 'SERVERID' cookie can be either 'server01' or 'server02' Warning : the syntax has changed since version 1.0 ! --------- +2.11) Application Cookies +------------------------- +Since 1.2.4 it is possible to catch the cookie that comes from an +application server in order to apply "application session stickyness". +The server's response is searched for 'appsession' cookie, the first +'len' bytes are used for matching and it is stored for a period of +'timeout'. +The syntax is: + + appsession len timeout + +- is the cookie, the server uses for it's session-handling +- how many bytes/characters should be used for matching equal + sessions +- after this inactivaty time, in ms, the cookie will be deleted + from the sessionstore + +The appsession is only per 'listen' section possible. + +Example : +--------- + listen http_proxy :80 + mode http + appsession JSESSIONID len 52 timeout 300000 + . + . + 3) Autonomous load balancer =========================== @@ -1448,8 +1476,8 @@ Example : mode http cookie SERVERID insert nocache indirect balance roundrobin - server 192.168.1.1:80 cookie server01 check - server 192.168.1.2:80 cookie server02 check + server srv1 192.168.1.1:80 cookie server01 check + server srv2 192.168.1.2:80 cookie server02 check The other solution brought by versions 1.1.30 and 1.2.3 is to reuse a cookie from the server, and prefix the server's name to it. In this case, don't forget @@ -1460,8 +1488,8 @@ request will have its cookie fixed. mode http cookie JSESSIONID prefix balance roundrobin - server 192.168.1.1:80 cookie srv1 check - server 192.168.1.2:80 cookie srv2 check + server srv1 192.168.1.1:80 cookie srv1 check + server srv2 192.168.1.2:80 cookie srv2 check option httpclose diff --git a/doc/haproxy-fr.txt b/doc/haproxy-fr.txt index 28687bb716..1db2bc4674 100644 --- a/doc/haproxy-fr.txt +++ b/doc/haproxy-fr.txt @@ -1497,8 +1497,8 @@ Exemple : mode http cookie SERVERID insert nocache indirect balance roundrobin - server 192.168.1.1:80 cookie server01 check - server 192.168.1.2:80 cookie server02 check + server srv1 192.168.1.1:80 cookie server01 check + server srv2 192.168.1.2:80 cookie server02 check L'autre solution apportée par les versions 1.1.30 et 1.2.3 est de réutiliser un cookie en provenance du serveur et de lui préfixer l'identifiant du serveur. @@ -1510,8 +1510,8 @@ puisse corriger le nom du cookie dans toutes les futures requ mode http cookie JSESSIONID prefix balance roundrobin - server 192.168.1.1:80 cookie srv1 check - server 192.168.1.2:80 cookie srv2 check + server srv1 192.168.1.1:80 cookie srv1 check + server srv2 192.168.1.2:80 cookie srv2 check option httpclose diff --git a/haproxy.c b/haproxy.c index 87c4145749..1445d1b3b1 100644 --- a/haproxy.c +++ b/haproxy.c @@ -61,45 +61,7 @@ #include #endif -#define TBLSIZ 10 -#define TBLCHKINT 5000 /* The time between two calls of appsession_refresh in ms */ - -/* - These Parts are copied from - - http://www.oreilly.com/catalog/masteralgoc/index.html - Mastering Algorithms with C - By Kyle Loudon - ISBN: 1-56592-453-3 - Publishd by O'Reilly - - We have added our own struct to these function. - */ - -#include -#include -#include -/* end of copied parts */ - -struct app_pool { - void **sessid; - void **serverid; - int ses_waste, ses_use, ses_msize; - int ser_waste, ser_use, ser_msize; -}; - -struct app_pool apools; -int have_appsession; - -/* Callback for hash_lookup */ -int match_str(const void *key1, const void *key2); - -/* Callback for destroy */ -void destroy(void *data); - -#if defined(DEBUG_HASH) -static void print_table(const CHTbl *htbl); -#endif +#include "include/appsession.h" #define HAPROXY_VERSION "1.2.4" #define HAPROXY_DATE "2005/01/22" @@ -2956,12 +2918,11 @@ int process_cli(struct session *t) { srv = srv->next; }/* end while(srv) */ }/* end else of if (asession_temp->serverid == NULL) */ - - method_checked = 1; }/* end if(strncasecmp(request_line,t->proxy->appsession_name,apssesion_name_len) == 0) */ else { //fprintf(stderr,">>>>>>>>>>>>>>>>>>>>>>NO SESSION\n"); } + method_checked = 1; }/* end if(!method_checked ...) */ else{ //printf("No Methode-Header with Session-String\n"); @@ -3311,7 +3272,6 @@ int process_cli(struct session *t) { }/* end else if server == NULL */ tv_delayfrom(&asession_temp->expire, &now, t->proxy->appsession_timeout); - break; }/* end if ((t->proxy->appsession_name != NULL) ... */ } diff --git a/include/appsession.h b/include/appsession.h new file mode 100644 index 0000000000..8a31034598 --- /dev/null +++ b/include/appsession.h @@ -0,0 +1,44 @@ +#ifndef _APPSESS_H +#define _APPSESS_H + +#define TBLSIZ 10 +#define TBLCHKINT 5000 /* The time between two calls of appsession_refresh in ms */ + +/* + These Parts are copied from + + http://www.oreilly.com/catalog/masteralgoc/index.html + Mastering Algorithms with C + By Kyle Loudon + ISBN: 1-56592-453-3 + Publishd by O'Reilly + + We have added our own struct to these function. + */ + +#include +#include +#include +/* end of copied parts */ + +struct app_pool { + void **sessid; + void **serverid; + int ses_waste, ses_use, ses_msize; + int ser_waste, ser_use, ser_msize; +}; + +struct app_pool apools; +int have_appsession; + +/* Callback for hash_lookup */ +int match_str(const void *key1, const void *key2); + +/* Callback for destroy */ +void destroy(void *data); + +#if defined(DEBUG_HASH) +static void print_table(const CHTbl *htbl); +#endif + +#endif diff --git a/src/hashpjw.c b/src/hashpjw.c index ef7f209b14..a207eb91d8 100644 --- a/src/hashpjw.c +++ b/src/hashpjw.c @@ -28,7 +28,7 @@ int hashpjw(const void *key) { const char *ptr; unsigned int val; - AppSess *appsession_temp; + appsess *appsession_temp; /***************************************************************************** * * @@ -37,7 +37,7 @@ int hashpjw(const void *key) { *****************************************************************************/ val = 0; - appsession_temp = (AppSess *)key; + appsession_temp = (appsess *)key; ptr = appsession_temp->sessid; while (*ptr != '\0') { -- 2.39.5