[MEDIUM] cookie: support client cookies with some contents appended to their value

In all cookie persistence modes but prefix, we now support cookies whose
value is suffixed with some contents after a vertical bar ('|'). This will
be used to pass an optional expiration date. So as of now we only consider
the part of the cookie value which is used before the vertical bar.
(cherry picked from commit a4486bf4e5b03b5a980d03fef799f6407b2c992d)
diff --git a/include/common/defaults.h b/include/common/defaults.h
index 84ab3d4..d1ce021 100644
--- a/include/common/defaults.h
+++ b/include/common/defaults.h
@@ -110,6 +110,12 @@
 #define COOKIE_DELIM    '~'
 #endif
 
+// this delimitor is used between a server's name and a last visit date in
+// cookies exchanged with the client.
+#ifndef COOKIE_DELIM_DATE
+#define COOKIE_DELIM_DATE       '|'
+#endif
+
 #define CONN_RETRIES    3
 
 #define	CHK_CONNTIME    2000
diff --git a/src/proto_http.c b/src/proto_http.c
index 4e4ac4d..bf81196 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -5922,10 +5922,14 @@
 				}
 			}
 
-			/* For cookies in prefix mode. The form is :
+			/* Persistence cookies in passive, rewrite or insert mode have the
+			 * following form :
 			 *
-			 *    Cookie: NAME=SRV~VALUE
+			 *    Cookie: NAME=SRV[|<lastseen>[|<firstseen>]]
 			 *
+			 * For cookies in prefix mode, the form is :
+			 *
+			 *    Cookie: NAME=SRV~VALUE
 			 */
 			if ((att_end - att_beg == t->be->cookie_len) && (t->be->cookie_name != NULL) &&
 			    (memcmp(att_beg, t->be->cookie_name, att_end - att_beg) == 0)) {
@@ -5952,10 +5956,21 @@
 					for (delim = val_beg; delim < val_end; delim++)
 						if (*delim == COOKIE_DELIM)
 							break;
-				}
-				else
+				} else {
+					char *vbar1;
 					delim = val_end;
-
+					/* Now check if the cookie contains a date field, which would
+					 * appear after a vertical bar ('|') just after the server name
+					 * and before the delimiter.
+					 */
+					vbar1 = memchr(val_beg, COOKIE_DELIM_DATE, val_end - val_beg);
+					if (vbar1) {
+						/* OK, so left of the bar is the server's cookie and
+						 * right is the last seen date.
+						 */
+						delim = vbar1++;
+					}
+				}
 
 				/* Here, we'll look for the first running server which supports the cookie.
 				 * This allows to share a same cookie between several servers, for example