MAJOR: http: Remove the HTTP legacy code

First of all, all legacy HTTP analyzers and all functions exclusively used by
them were removed. So the most of the functions in proto_http.{c,h} were
removed. Only functions to deal with the HTTP transaction have been kept. Then,
http_msg and hdr_idx modules were entirely removed. And finally the structure
http_msg was lightened of all its useless information about the legacy HTTP. The
structure hdr_ctx was also removed because unused now, just like unused states
in the enum h1_state. Note that the memory pool "hdr_idx" was removed and
"http_txn" is now smaller.
diff --git a/include/proto/hdr_idx.h b/include/proto/hdr_idx.h
deleted file mode 100644
index f65b3c6..0000000
--- a/include/proto/hdr_idx.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * include/proto/hdr_idx.h
- * This file defines function prototypes for fast header indexation.
- *
- * Copyright (C) 2000-2011 Willy Tarreau - w@1wt.eu
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation, version 2.1
- * exclusively.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifndef _PROTO_HDR_IDX_H
-#define _PROTO_HDR_IDX_H
-
-#include <common/config.h>
-#include <types/hdr_idx.h>
-
-extern struct pool_head *pool_head_hdr_idx;
-
-/*
- * Initialize the list pointers.
- * list->size must already be set. If list->size is set and list->v is
- * non-null, list->v is also initialized..
- */
-static inline void hdr_idx_init(struct hdr_idx *list)
-{
-	if (list->size && list->v) {
-		register struct hdr_idx_elem e = { .len=0, .cr=0, .next=0};
-		list->v[0] = e;
-	}
-	list->tail = 0;
-	list->used = list->last = 1;
-}
-
-/*
- * Return index of the first entry in the list. Usually, it means the index of
- * the first header just after the request or response. If zero is returned, it
- * means that the list is empty.
- */
-static inline int hdr_idx_first_idx(const struct hdr_idx *list)
-{
-	return list->v[0].next;
-}
-
-/*
- * Return position of the first entry in the list. Usually, it means the
- * position of the first header just after the request, but it can also be the
- * end of the headers if the request has no header. hdr_idx_start_idx() should
- * be checked before to ensure there is a valid header.
- */
-static inline int hdr_idx_first_pos(const struct hdr_idx *list)
-{
-	return list->v[0].len + list->v[0].cr + 1;
-}
-
-/*
- * Sets the information about the start line. Its length and the presence of
- * the CR are registered so that hdr_idx_first_pos() knows exactly where to
- * find the first header.
- */
-static inline void hdr_idx_set_start(struct hdr_idx *list, int len, int cr)
-{
-	list->v[0].len = len;
-	list->v[0].cr = cr;
-}
-
-/*
- * Add a header entry to <list> after element <after>. <after> is ignored when
- * the list is empty or full. Common usage is to set <after> to list->tail.
- *
- * Returns the position of the new entry in the list (from 1 to size-1), or 0
- * if the array is already full. An effort is made to fill the array linearly,
- * but once the last entry has been used, we have to search for unused blocks,
- * which takes much more time. For this reason, it's important to size is
- * appropriately.
- */
-int hdr_idx_add(int len, int cr, struct hdr_idx *list, int after);
-
-#endif /* _PROTO_HDR_IDX_H */
-
-/*
- * Local variables:
- *  c-indent-level: 8
- *  c-basic-offset: 8
- * End:
- */
diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h
index 8683e26..e360a5a 100644
--- a/include/proto/proto_http.h
+++ b/include/proto/proto_http.h
@@ -23,6 +23,7 @@
 #define _PROTO_PROTO_HTTP_H
 
 #include <common/config.h>
+#include <common/htx.h>
 #include <types/proto_http.h>
 #include <types/stream.h>
 #include <types/task.h>
@@ -31,43 +32,6 @@
 
 extern struct pool_head *pool_head_uniqueid;
 
-int process_cli(struct stream *s);
-int process_srv_data(struct stream *s);
-int process_srv_conn(struct stream *s);
-int http_wait_for_request(struct stream *s, struct channel *req, int an_bit);
-int http_process_req_common(struct stream *s, struct channel *req, int an_bit, struct proxy *px);
-int http_process_request(struct stream *s, struct channel *req, int an_bit);
-int http_process_tarpit(struct stream *s, struct channel *req, int an_bit);
-int http_wait_for_request_body(struct stream *s, struct channel *req, int an_bit);
-int http_send_name_header(struct stream *s, struct proxy* be, const char* svr_name);
-int http_wait_for_response(struct stream *s, struct channel *rep, int an_bit);
-int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, struct proxy *px);
-int http_request_forward_body(struct stream *s, struct channel *req, int an_bit);
-int http_response_forward_body(struct stream *s, struct channel *res, int an_bit);
-int http_upgrade_v09_to_v10(struct http_txn *txn);
-void http_msg_analyzer(struct http_msg *msg, struct hdr_idx *idx);
-void http_txn_reset_req(struct http_txn *txn);
-void http_txn_reset_res(struct http_txn *txn);
-const char *http_parse_reqline(struct http_msg *msg,
-                               enum h1_state state, const char *ptr, const char *end,
-                               unsigned int *ret_ptr, enum h1_state *ret_state);
-const char *http_parse_stsline(struct http_msg *msg,
-                               enum h1_state state, const char *ptr, const char *end,
-                               unsigned int *ret_ptr, enum h1_state *ret_state);
-int http_forward_trailers(struct http_msg *msg);
-int http_legacy_replace_header(struct hdr_idx *idx, struct http_msg *msg,
-                               const char *name, unsigned int name_len,
-                               const char *str, struct my_regex *re,
-                               struct buffer *output);
-int http_legacy_replace_full_header(struct hdr_idx *idx, struct http_msg *msg,
-                                    const char *name, unsigned int name_len,
-                                    const char *str, struct my_regex *re,
-                                    struct buffer *output);
-
-/* Export HTX analyzers and helpers */
-// FIXME: Rename all these functions http_* once legacy code will be removed
-struct htx;
-
 int htx_wait_for_request(struct stream *s, struct channel *req, int an_bit);
 int htx_process_req_common(struct stream *s, struct channel *req, int an_bit, struct proxy *px);
 int htx_process_request(struct stream *s, struct channel *req, int an_bit);
@@ -92,171 +56,20 @@
 void htx_return_srv_error(struct stream *s, struct stream_interface *si);
 struct buffer *htx_error_message(struct stream *s);
 
-void debug_hdr(const char *dir, struct stream *s, const char *start, const char *end);
-int apply_filter_to_req_headers(struct stream *s, struct channel *req, struct hdr_exp *exp);
-int apply_filter_to_req_line(struct stream *s, struct channel *req, struct hdr_exp *exp);
-int apply_filters_to_request(struct stream *s, struct channel *req, struct proxy *px);
-int apply_filters_to_response(struct stream *s, struct channel *rtr, struct proxy *px);
-void manage_client_side_cookies(struct stream *s, struct channel *req);
-void manage_server_side_cookies(struct stream *s, struct channel *rtr);
-void check_request_for_cacheability(struct stream *s, struct channel *chn);
-void check_response_for_cacheability(struct stream *s, struct channel *rtr);
-int stats_check_uri(struct stream_interface *si, struct http_txn *txn, struct proxy *backend);
-int http_find_full_header2(const char *name, int len,
-                           char *sol, struct hdr_idx *idx,
-                           struct hdr_ctx *ctx);
-int http_find_header2(const char *name, int len,
-		      char *sol, struct hdr_idx *idx,
-		      struct hdr_ctx *ctx);
-int http_find_next_header(char *sol, struct hdr_idx *idx,
-                          struct hdr_ctx *ctx);
-int http_remove_header2(struct http_msg *msg, struct hdr_idx *idx, struct hdr_ctx *ctx);
-int http_header_add_tail2(struct http_msg *msg, struct hdr_idx *hdr_idx, const char *text, int len);
-int http_replace_req_line(int action, const char *replace, int len, struct proxy *px, struct stream *s);
-void http_set_status(unsigned int status, const char *reason, struct stream *s);
-int http_transform_header_str(struct stream* s, struct http_msg *msg, const char* name,
-                              unsigned int name_len, const char *str, struct my_regex *re,
-                              int action);
-int http_handle_stats(struct stream *s, struct channel *req);
-enum rule_result http_req_get_intercept_rule(struct proxy *px, struct list *rules,
-					     struct stream *s, int *deny_status);
-enum rule_result http_res_get_intercept_rule(struct proxy *px, struct list *rules,
-					     struct stream *s);
-int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s, struct http_txn *txn);
-void http_perform_server_redirect(struct stream *s, struct stream_interface *si);
-void http_return_srv_error(struct stream *s, struct stream_interface *si);
-void http_capture_headers(char *som, struct hdr_idx *idx,
-			  char **cap, struct cap_hdr *cap_hdr);
-void http_capture_bad_message(struct proxy *proxy, struct stream *s,
-                              struct http_msg *msg,
-			      enum h1_state state, struct proxy *other_end);
-unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hlen,
-			  struct hdr_idx *idx, int occ,
-			  struct hdr_ctx *ctx, char **vptr, size_t *vlen);
-unsigned int http_get_fhdr(const struct http_msg *msg, const char *hname, int hlen,
-			   struct hdr_idx *idx, int occ,
-			   struct hdr_ctx *ctx, char **vptr, size_t *vlen);
-char *http_txn_get_path(const struct http_txn *txn);
-
 struct http_txn *http_alloc_txn(struct stream *s);
 void http_init_txn(struct stream *s);
 void http_end_txn(struct stream *s);
 void http_reset_txn(struct stream *s);
-void http_end_txn_clean_session(struct stream *s);
-void http_resync_states(struct stream *s);
-void http_parse_connection_header(struct http_txn *txn, struct http_msg *msg, int to_del);
-void http_change_connection_header(struct http_txn *txn, struct http_msg *msg, int wanted);
-void http_adjust_conn_mode(struct stream *s, struct http_txn *txn, struct http_msg *msg);
-
-int http_msg_forward_body(struct stream *s, struct http_msg *msg);
-int http_msg_forward_chunked_body(struct stream *s, struct http_msg *msg);
-
-void http_reply_and_close(struct stream *s, short status, struct buffer *msg);
-struct buffer *http_error_message(struct stream *s);
-
-/* to be used when contents change in an HTTP message */
-#define http_msg_move_end(msg, bytes) do { \
-		unsigned int _bytes = (bytes);	\
-		(msg)->next += (_bytes);	\
-		(msg)->sov += (_bytes);		\
-		(msg)->eoh += (_bytes);		\
-	} while (0)
-
-
-/* Return the amount of bytes that need to be rewound before buf->p to access
- * the current message's headers. The purpose is to be able to easily fetch
- * the message's beginning before headers are forwarded, as well as after.
- * The principle is that msg->eoh and msg->eol are immutable while msg->sov
- * equals the sum of the two before forwarding and is zero after forwarding,
- * so the difference cancels the rewinding.
- */
-static inline int http_hdr_rewind(const struct http_msg *msg)
-{
-	return msg->eoh + msg->eol - msg->sov;
-}
-
-/* Return the amount of bytes that need to be rewound before buf->p to access
- * the current message's URI. The purpose is to be able to easily fetch
- * the message's beginning before headers are forwarded, as well as after.
- */
-static inline int http_uri_rewind(const struct http_msg *msg)
-{
-	return http_hdr_rewind(msg) - msg->sl.rq.u;
-}
-
-/* Return the amount of bytes that need to be rewound before buf->p to access
- * the current message's BODY. The purpose is to be able to easily fetch
- * the message's beginning before headers are forwarded, as well as after.
- */
-static inline int http_body_rewind(const struct http_msg *msg)
-{
-	return http_hdr_rewind(msg) - msg->eoh - msg->eol;
-}
-
-/* Return the amount of bytes that need to be rewound before buf->p to access
- * the current message's DATA. The difference with the function above is that
- * if a chunk is present and has already been parsed, its size is skipped so
- * that the byte pointed to is the first byte of actual data. The function is
- * safe for use in state HTTP_MSG_DATA regardless of whether the headers were
- * already forwarded or not.
- */
-static inline int http_data_rewind(const struct http_msg *msg)
-{
-	return http_body_rewind(msg) - msg->sol;
-}
-
-/* Return the maximum amount of bytes that may be read after the beginning of
- * the message body, according to the advertised length. The function is safe
- * for use between HTTP_MSG_BODY and HTTP_MSG_DATA regardless of whether the
- * headers were already forwarded or not.
- */
-static inline int http_body_bytes(const struct http_msg *msg)
-{
-	int len;
-
-	len = ci_data(msg->chn) - msg->sov - msg->sol;
-	if (len > msg->body_len)
-		len = msg->body_len;
-	return len;
-}
 
 /* for debugging, reports the HTTP/1 message state name (legacy version) */
 static inline const char *h1_msg_state_str(enum h1_state msg_state)
 {
 	switch (msg_state) {
 	case HTTP_MSG_RQBEFORE:    return "MSG_RQBEFORE";
-	case HTTP_MSG_RQBEFORE_CR: return "MSG_RQBEFORE_CR";
-	case HTTP_MSG_RQMETH:      return "MSG_RQMETH";
-	case HTTP_MSG_RQMETH_SP:   return "MSG_RQMETH_SP";
-	case HTTP_MSG_RQURI:       return "MSG_RQURI";
-	case HTTP_MSG_RQURI_SP:    return "MSG_RQURI_SP";
-	case HTTP_MSG_RQVER:       return "MSG_RQVER";
-	case HTTP_MSG_RQLINE_END:  return "MSG_RQLINE_END";
 	case HTTP_MSG_RPBEFORE:    return "MSG_RPBEFORE";
-	case HTTP_MSG_RPBEFORE_CR: return "MSG_RPBEFORE_CR";
-	case HTTP_MSG_RPVER:       return "MSG_RPVER";
-	case HTTP_MSG_RPVER_SP:    return "MSG_RPVER_SP";
-	case HTTP_MSG_RPCODE:      return "MSG_RPCODE";
-	case HTTP_MSG_RPCODE_SP:   return "MSG_RPCODE_SP";
-	case HTTP_MSG_RPREASON:    return "MSG_RPREASON";
-	case HTTP_MSG_RPLINE_END:  return "MSG_RPLINE_END";
-	case HTTP_MSG_HDR_FIRST:   return "MSG_HDR_FIRST";
-	case HTTP_MSG_HDR_NAME:    return "MSG_HDR_NAME";
-	case HTTP_MSG_HDR_COL:     return "MSG_HDR_COL";
-	case HTTP_MSG_HDR_L1_SP:   return "MSG_HDR_L1_SP";
-	case HTTP_MSG_HDR_L1_LF:   return "MSG_HDR_L1_LF";
-	case HTTP_MSG_HDR_L1_LWS:  return "MSG_HDR_L1_LWS";
-	case HTTP_MSG_HDR_VAL:     return "MSG_HDR_VAL";
-	case HTTP_MSG_HDR_L2_LF:   return "MSG_HDR_L2_LF";
-	case HTTP_MSG_HDR_L2_LWS:  return "MSG_HDR_L2_LWS";
-	case HTTP_MSG_LAST_LF:     return "MSG_LAST_LF";
 	case HTTP_MSG_ERROR:       return "MSG_ERROR";
 	case HTTP_MSG_BODY:        return "MSG_BODY";
-	case HTTP_MSG_100_SENT:    return "MSG_100_SENT";
-	case HTTP_MSG_CHUNK_SIZE:  return "MSG_CHUNK_SIZE";
 	case HTTP_MSG_DATA:        return "MSG_DATA";
-	case HTTP_MSG_CHUNK_CRLF:  return "MSG_CHUNK_CRLF";
-	case HTTP_MSG_TRAILERS:    return "MSG_TRAILERS";
 	case HTTP_MSG_ENDING:      return "MSG_ENDING";
 	case HTTP_MSG_DONE:        return "MSG_DONE";
 	case HTTP_MSG_CLOSING:     return "MSG_CLOSING";
diff --git a/include/types/hdr_idx.h b/include/types/hdr_idx.h
deleted file mode 100644
index 809ea83..0000000
--- a/include/types/hdr_idx.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-  include/types/hdr_idx.h
-  This file defines everything related to fast header indexation.
-
-  Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu
-  
-  This library is free software; you can redistribute it and/or
-  modify it under the terms of the GNU Lesser General Public
-  License as published by the Free Software Foundation, version 2.1
-  exclusively.
-
-  This library is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public
-  License along with this library; if not, write to the Free Software
-  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-*/
-
-
-/*
- * The type of structure described here is a finite linked list used to
- * reference small number of objects of small size. This is typically used
- * to index HTTP headers within one request or response, in order to be able
- * to add, remove, modify and check them in an efficient way. The overhead is
- * very low : 32 bits are used per list element. This is enough to reference
- * 32k headers of at most 64kB each, with one bit to indicate if the header
- * is terminated by 1 or 2 chars. It may also evolve towards something like
- * 1k headers of at most 64B for the name and 32kB of data + CR/CRLF.
- *
- * A future evolution of this concept may allow for fast header manipulation
- * without data movement through the use of vectors. This is not yet possible
- * in this version, whose goal is only to avoid parsing whole lines for each
- * consultation.
- *
- */
-
-
-#ifndef _TYPES_HDR_IDX_H
-#define _TYPES_HDR_IDX_H
-
-/*
- * This describes one element of the hdr_idx array.
- * It's a tiny linked list of at most 32k 32bit elements. The first one has a
- * special meaning, it's used as the head of the list and cannod be removed.
- * That way, we know that 'next==0' is not possible so we use it to indicate
- * an end of list. Also, [0]->next always designates the head of the list. The
- * first allocatable element is at 1. By convention, [0]->len indicates how
- * many chars should be skipped in the original buffer before finding the first
- * header.
- *
- */
-
-struct hdr_idx_elem {
-        unsigned len  :16; /* length of this header not counting CRLF. 0=unused entry. */
-        unsigned cr   : 1; /* CR present (1=CRLF, 0=LF). Total line size=len+cr+1. */
-        unsigned next :15; /* offset of next header if len>0. 0=end of list. */
-};
-
-/*
- * This structure provides necessary information to store, find, remove
- * index entries from a list. This list cannot reference more than 32k
- * elements of 64k each.
- */
-struct hdr_idx {
-	struct hdr_idx_elem *v;     /* the array itself */
-	short size;                 /* size of the array including the head */
-	short used;                 /* # of elements really used (1..size) */
-	short last;                 /* length of the allocated area (1..size) */
-	signed short tail;          /* last used element, 0..size-1 */
-};
-
-
-
-#endif /* _TYPES_HDR_IDX_H */
-
-/*
- * Local variables:
- *  c-indent-level: 8
- *  c-basic-offset: 8
- * End:
- */
diff --git a/include/types/proto_http.h b/include/types/proto_http.h
index d4fa652..205bd5f 100644
--- a/include/types/proto_http.h
+++ b/include/types/proto_http.h
@@ -29,7 +29,6 @@
 #include <common/regex.h>
 
 #include <types/channel.h>
-#include <types/hdr_idx.h>
 #include <types/filters.h>
 //#include <types/sample.h>
 
@@ -188,110 +187,30 @@
  */
 enum h1_state {
 	HTTP_MSG_RQBEFORE     =  0, // request: leading LF, before start line
-	HTTP_MSG_RQBEFORE_CR  =  1, // request: leading CRLF, before start line
-	/* these ones define a request start line */
-	HTTP_MSG_RQMETH       =  2, // parsing the Method
-	HTTP_MSG_RQMETH_SP    =  3, // space(s) after the Method
-	HTTP_MSG_RQURI        =  4, // parsing the Request URI
-	HTTP_MSG_RQURI_SP     =  5, // space(s) after the Request URI
-	HTTP_MSG_RQVER        =  6, // parsing the Request Version
-	HTTP_MSG_RQLINE_END   =  7, // end of request line (CR or LF)
-
-	HTTP_MSG_RPBEFORE     =  8, // response: leading LF, before start line
-	HTTP_MSG_RPBEFORE_CR  =  9, // response: leading CRLF, before start line
-
-	/* these ones define a response start line */
-	HTTP_MSG_RPVER        = 10, // parsing the Response Version
-	HTTP_MSG_RPVER_SP     = 11, // space(s) after the Response Version
-	HTTP_MSG_RPCODE       = 12, // response code
-	HTTP_MSG_RPCODE_SP    = 13, // space(s) after the response code
-	HTTP_MSG_RPREASON     = 14, // response reason
-	HTTP_MSG_RPLINE_END   = 15, // end of response line (CR or LF)
-
-	/* common header processing */
-	HTTP_MSG_HDR_FIRST    = 16, // waiting for first header or last CRLF (no LWS possible)
-	HTTP_MSG_HDR_NAME     = 17, // parsing header name
-	HTTP_MSG_HDR_COL      = 18, // parsing header colon
-	HTTP_MSG_HDR_L1_SP    = 19, // parsing header LWS (SP|HT) before value
-	HTTP_MSG_HDR_L1_LF    = 20, // parsing header LWS (LF) before value
-	HTTP_MSG_HDR_L1_LWS   = 21, // checking whether it's a new header or an LWS
-	HTTP_MSG_HDR_VAL      = 22, // parsing header value
-	HTTP_MSG_HDR_L2_LF    = 23, // parsing header LWS (LF) inside/after value
-	HTTP_MSG_HDR_L2_LWS   = 24, // checking whether it's a new header or an LWS
-
-	HTTP_MSG_LAST_LF      = 25, // parsing last LF
+	HTTP_MSG_RPBEFORE     =  1, // response: leading LF, before start line
 
 	/* error state : must be before HTTP_MSG_BODY so that (>=BODY) always indicates
 	 * that data are being processed.
 	 */
-	HTTP_MSG_ERROR        = 26, // an error occurred
+	HTTP_MSG_ERROR        =  2, // an error occurred
 	/* Body processing.
 	 * The state HTTP_MSG_BODY is a delimiter to know if we're waiting for headers
 	 * or body. All the sub-states below also indicate we're processing the body,
 	 * with some additional information.
 	 */
-	HTTP_MSG_BODY         = 27, // parsing body at end of headers
-	HTTP_MSG_100_SENT     = 28, // parsing body after a 100-Continue was sent
-	HTTP_MSG_CHUNK_SIZE   = 29, // parsing the chunk size (RFC7230 #4.1)
-	HTTP_MSG_DATA         = 30, // skipping data chunk / content-length data
-	HTTP_MSG_CHUNK_CRLF   = 31, // skipping CRLF after data chunk
-	HTTP_MSG_TRAILERS     = 32, // trailers (post-data entity headers)
+	HTTP_MSG_BODY         =  3, // parsing body at end of headers
+	HTTP_MSG_DATA         =  4, // skipping data chunk / content-length data
 	/* we enter this state when we've received the end of the current message */
-	HTTP_MSG_ENDING       = 33, // message end received, wait that the filters end too
-	HTTP_MSG_DONE         = 34, // message end received, waiting for resync or close
-	HTTP_MSG_CLOSING      = 35, // shutdown_w done, not all bytes sent yet
-	HTTP_MSG_CLOSED       = 36, // shutdown_w done, all bytes sent
-	HTTP_MSG_TUNNEL       = 37, // tunneled data after DONE
+	HTTP_MSG_ENDING       =  5, // message end received, wait that the filters end too
+	HTTP_MSG_DONE         =  6, // message end received, waiting for resync or close
+	HTTP_MSG_CLOSING      =  7, // shutdown_w done, not all bytes sent yet
+	HTTP_MSG_CLOSED       =  8, // shutdown_w done, all bytes sent
+	HTTP_MSG_TUNNEL       =  9, // tunneled data after DONE
 } __attribute__((packed));
 
 
-/* This is an HTTP message, as described in RFC7230. It can be either a request
- * message or a response message.
- *
- * The values there are a little bit obscure, because their meaning can change
- * during the parsing. Please read carefully doc/internal/body-parsing.txt if
- * you need to manipulate them. Quick reminder :
- *
- *  - eoh (End of Headers)   : relative offset in the buffer of first byte that
- *                             is not part of a completely processed header.
- *                             During parsing, it points to last header seen
- *                             for states after START. When in HTTP_MSG_BODY,
- *                             eoh points to the first byte of the last CRLF
- *                             preceding data. Relative to buffer's origin.
- *                             This value then remains unchanged till the end
- *                             so that we can rewind the buffer to change some
- *                             headers if needed (eg: http-send-name-header).
- *
- *  - sov (start of value)   : Before HTTP_MSG_BODY, points to the value of
- *                             the header being parsed. Starting from
- *                             HTTP_MSG_BODY, will point to the start of the
- *                             body (relative to buffer's origin). It can be
- *                             negative when forwarding data. It stops growing
- *                             once data start to leave the buffer.
- *
- *  - next (parse pointer)   : next relative byte to be parsed. Always points
- *                             to a byte matching the current state.
- *
- *  - sol (start of line)    : start of current line before MSG_BODY. Starting
- *                             from MSG_BODY and until MSG_TRAILERS, contains
- *                             the length of the last parsed chunk size so that
- *                             when added to sov it always points to the
- *                             beginning of the current data chunk.
- *                             in MSG_TRAILERS state, it contains the length of
- *                             the last parsed part of the trailer headers.
- *
- *  - eol (End of Line)      : Before HTTP_MSG_BODY, relative offset in the
- *                             buffer of the first byte which marks the end of
- *                             the line current (LF or CRLF).
- *                             From HTTP_MSG_BODY to the end, contains the
- *                             length of the last CRLF (1 for a plain LF, or 2
- *                             for a true CRLF). So eoh+eol always contain the
- *                             exact size of the header size.
- *
- * Note that all offsets are relative to the origin of the buffer (buf->p)
- * which always points to the beginning of the message (request or response).
- * Since a message may not wrap, pointer computations may be one without any
- * care for wrapping (no addition overflow nor subtract underflow).
+/* This is the state of an HTTP seen from the analyzers point of view. It can be
+ * either a request message or a response message.
  */
 struct http_msg {
 	enum h1_state msg_state;               /* where we are in the current message parsing */
@@ -299,39 +218,12 @@
 	unsigned char flags;                   /* flags describing the message (HTTP version, ...) */
 	/* 5 bytes unused here */
 	struct channel *chn;                   /* pointer to the channel transporting the message */
-	unsigned int next;                     /* pointer to next byte to parse, relative to buf->p */
-	int sov;                               /* current header: start of value ; data: start of body */
-	unsigned int eoh;                      /* End Of Headers, relative to buffer */
-	unsigned int sol;                      /* start of current line during parsing otherwise zero */
-	unsigned int eol;                      /* end of line */
-	int err_pos;                           /* err handling: -2=block, -1=pass, 0+=detected */
-	union {                                /* useful start line pointers, relative to ->sol */
-		struct {
-			int l;                 /* request line length (not including CR) */
-			int m_l;               /* METHOD length (method starts at buf->p) */
-			int u, u_l;            /* URI, length */
-			int v, v_l;            /* VERSION, length */
-		} rq;                          /* request line : field, length */
-		struct {
-			int l;                 /* status line length (not including CR) */
-			int v_l;               /* VERSION length (version starts at buf->p) */
-			int c, c_l;            /* CODE, length */
-			int r, r_l;            /* REASON, length */
-		} st;                          /* status line : field, length */
-	} sl;                                  /* start line */
-	unsigned long long chunk_len;          /* cache for last chunk size or content-length header value */
-	unsigned long long body_len;           /* total known length of the body, excluding encoding */
 };
 
-struct proxy;
-struct http_txn;
-struct stream;
-
 /* This is an HTTP transaction. It contains both a request message and a
  * response message (which can be empty).
  */
 struct http_txn {
-	struct hdr_idx hdr_idx;         /* array of header indexes (max: global.tune.max_http_hdr) */
 	struct http_msg rsp;            /* HTTP response message */
 	struct http_msg req;            /* HTTP request message */
 	unsigned int flags;             /* transaction flags */
@@ -349,24 +241,6 @@
 	struct http_auth_data auth;	/* HTTP auth data */
 };
 
-
-/* This structure is used by http_find_header() to return values of headers.
- * The header starts at <line>, the value (excluding leading and trailing white
- * spaces) at <line>+<val> for <vlen> bytes, followed by optional <tws> trailing
- * white spaces, and sets <line>+<del> to point to the last delimitor (colon or
- * comma) before this value. <prev> points to the index of the header whose next
- * is this one.
- */
-struct hdr_ctx {
-	char *line;
-	int  idx;
-	int  val;  /* relative to line, may skip some leading white spaces */
-	int  vlen; /* relative to line+val, stops before trailing white spaces */
-	int  tws;  /* added to vlen if some trailing white spaces are present */
-	int  del;  /* relative to line */
-	int  prev; /* index of previous header */
-};
-
 extern struct pool_head *pool_head_http_txn;
 
 #endif /* _TYPES_PROTO_HTTP_H */
diff --git a/include/types/sample.h b/include/types/sample.h
index 015c5ae..e5c2c29 100644
--- a/include/types/sample.h
+++ b/include/types/sample.h
@@ -133,7 +133,7 @@
 	SMP_USE_TXFIN = 1 << SMP_SRC_TXFIN,  /* final information about the transaction (eg: #comp rate) */
 	SMP_USE_SSFIN = 1 << SMP_SRC_SSFIN,  /* final information about the stream (eg: #requests, final flags) */
 
-	/* This composite one is useful to detect if an hdr_idx needs to be allocated */
+	/* This composite one is useful to detect if an http_txn needs to be allocated */
 	SMP_USE_HTTP_ANY = SMP_USE_HRQHV | SMP_USE_HRQHP | SMP_USE_HRQBO |
 	                   SMP_USE_HRSHV | SMP_USE_HRSHP | SMP_USE_HRSBO,
 };