* released 1.2.5-pre1
* build fixes for appsession
* documentation for appsession
diff --git a/doc/haproxy-en.txt b/doc/haproxy-en.txt
index 2cb73d2..ab14dcf 100644
--- a/doc/haproxy-en.txt
+++ b/doc/haproxy-en.txt
@@ -100,6 +100,7 @@
- debug
- quiet
- pidfile <file>
+ - stats
1.1) Event logging
------------------
@@ -623,6 +624,33 @@
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 <SESSIONCOOKIE> len <MATCHLENGTH> timeout <HOLDTIME>
+
+- <SESSIONCOOKIE> is the cookie, the server uses for it's session-handling
+- <MATCHLENGTH> how many bytes/characters should be used for matching equal
+ sessions
+- <HOLDTIME> 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 @@
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 @@
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 28687bb..1db2bc4 100644
--- a/doc/haproxy-fr.txt
+++ b/doc/haproxy-fr.txt
@@ -1497,8 +1497,8 @@
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 @@
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 87c4145..1445d1b 100644
--- a/haproxy.c
+++ b/haproxy.c
@@ -61,45 +61,7 @@
#include <strings.h>
#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/list.h>
-#include <include/chtbl.h>
-#include <include/hashpjw.h>
-/* 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 @@
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 @@
}/* 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 0000000..8a31034
--- /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/list.h>
+#include <include/chtbl.h>
+#include <include/hashpjw.h>
+/* 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 ef7f209..a207eb9 100644
--- a/src/hashpjw.c
+++ b/src/hashpjw.c
@@ -28,7 +28,7 @@
const char *ptr;
unsigned int val;
- AppSess *appsession_temp;
+ appsess *appsession_temp;
/*****************************************************************************
* *
@@ -37,7 +37,7 @@
*****************************************************************************/
val = 0;
- appsession_temp = (AppSess *)key;
+ appsession_temp = (appsess *)key;
ptr = appsession_temp->sessid;
while (*ptr != '\0') {