diff options
| author | Willy Tarreau <w@1wt.eu> | 2020-06-02 19:33:08 +0200 |
|---|---|---|
| committer | Willy Tarreau <w@1wt.eu> | 2020-06-02 19:35:51 +0200 |
| commit | 83aae2537da93af4de4b496a0fc265fc2070bc85 (patch) | |
| tree | 22e8c2dfabccf219f394429df96c70be7d3d3b23 | |
| parent | c0901976c075f34dd51b4dabe7557d18127995f0 (diff) | |
| download | haproxy-20200602-rework-includes-7.tar.gz | |
REORG: includes: split common/h1.h into haproxy/h1{,-t}.h20200602-rework-includes-7
The file was split between its enums/structs and the functions. Some
wrong dependencies like dynbuf.h instead of buf.h were updated. Most
users only need the types.
| -rw-r--r-- | include/haproxy/h1-t.h | 139 | ||||
| -rw-r--r-- | include/haproxy/h1.h (renamed from include/common/h1.h) | 124 | ||||
| -rw-r--r-- | include/proto/h1_htx.h | 2 | ||||
| -rw-r--r-- | src/checks.c | 2 | ||||
| -rw-r--r-- | src/h1.c | 2 | ||||
| -rw-r--r-- | src/h1_htx.c | 2 | ||||
| -rw-r--r-- | src/hlua.c | 2 | ||||
| -rw-r--r-- | src/http_fetch.c | 2 | ||||
| -rw-r--r-- | src/http_htx.c | 2 | ||||
| -rw-r--r-- | src/mux_fcgi.c | 2 | ||||
| -rw-r--r-- | src/mux_h1.c | 2 | ||||
| -rw-r--r-- | src/mux_h2.c | 2 |
12 files changed, 157 insertions, 126 deletions
diff --git a/include/haproxy/h1-t.h b/include/haproxy/h1-t.h new file mode 100644 index 000000000..e18be04b5 --- /dev/null +++ b/include/haproxy/h1-t.h @@ -0,0 +1,139 @@ +/* + * include/haproxy/h1-t.h + * This file contains HTTP/1 protocol definitions. + * + * Copyright (C) 2000-2020 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 _HAPROXY_H1_T_H +#define _HAPROXY_H1_T_H + +#include <inttypes.h> +#include <haproxy/http.h> +#include <import/ist.h> + + +/* Possible states while parsing HTTP/1 messages (request|response) */ +enum h1m_state { + H1_MSG_RQBEFORE = 0, // request: leading LF, before start line + H1_MSG_RQBEFORE_CR = 1, // request: leading CRLF, before start line + /* these ones define a request start line */ + H1_MSG_RQMETH = 2, // parsing the Method + H1_MSG_RQMETH_SP = 3, // space(s) after the Method + H1_MSG_RQURI = 4, // parsing the Request URI + H1_MSG_RQURI_SP = 5, // space(s) after the Request URI + H1_MSG_RQVER = 6, // parsing the Request Version + H1_MSG_RQLINE_END = 7, // end of request line (CR or LF) + + H1_MSG_RPBEFORE = 8, // response: leading LF, before start line + H1_MSG_RPBEFORE_CR = 9, // response: leading CRLF, before start line + + /* these ones define a response start line */ + H1_MSG_RPVER = 10, // parsing the Response Version + H1_MSG_RPVER_SP = 11, // space(s) after the Response Version + H1_MSG_RPCODE = 12, // response code + H1_MSG_RPCODE_SP = 13, // space(s) after the response code + H1_MSG_RPREASON = 14, // response reason + H1_MSG_RPLINE_END = 15, // end of response line (CR or LF) + + /* common header processing */ + H1_MSG_HDR_FIRST = 16, // waiting for first header or last CRLF (no LWS possible) + H1_MSG_HDR_NAME = 17, // parsing header name + H1_MSG_HDR_COL = 18, // parsing header colon + H1_MSG_HDR_L1_SP = 19, // parsing header LWS (SP|HT) before value + H1_MSG_HDR_L1_LF = 20, // parsing header LWS (LF) before value + H1_MSG_HDR_L1_LWS = 21, // checking whether it's a new header or an LWS + H1_MSG_HDR_VAL = 22, // parsing header value + H1_MSG_HDR_L2_LF = 23, // parsing header LWS (LF) inside/after value + H1_MSG_HDR_L2_LWS = 24, // checking whether it's a new header or an LWS + + H1_MSG_LAST_LF = 25, // parsing last LF, last state for headers + + /* Body processing. */ + + H1_MSG_CHUNK_SIZE = 26, // parsing the chunk size (RFC7230 #4.1) + H1_MSG_DATA = 27, // skipping data chunk / content-length data + H1_MSG_CHUNK_CRLF = 28, // skipping CRLF after data chunk + H1_MSG_TRAILERS = 29, // trailers (post-data entity headers) + /* we enter this state when we've received the end of the current message */ + H1_MSG_DONE = 30, // message end received, waiting for resync or close + H1_MSG_TUNNEL = 31, // tunneled data after DONE +} __attribute__((packed)); + + +/* HTTP/1 message flags (32 bit), for use in h1m->flags only */ +#define H1_MF_NONE 0x00000000 +#define H1_MF_CLEN 0x00000001 // content-length present +#define H1_MF_CHNK 0x00000002 // chunk present, exclusive with c-l +#define H1_MF_RESP 0x00000004 // this message is the response message +#define H1_MF_TOLOWER 0x00000008 // turn the header names to lower case +#define H1_MF_VER_11 0x00000010 // message indicates version 1.1 or above +#define H1_MF_CONN_CLO 0x00000020 // message contains "connection: close" +#define H1_MF_CONN_KAL 0x00000040 // message contains "connection: keep-alive" +#define H1_MF_CONN_UPG 0x00000080 // message contains "connection: upgrade" +#define H1_MF_XFER_LEN 0x00000100 // message xfer size can be determined +#define H1_MF_XFER_ENC 0x00000200 // transfer-encoding is present +#define H1_MF_NO_PHDR 0x00000400 // don't add pseudo-headers in the header list +#define H1_MF_HDRS_ONLY 0x00000800 // parse headers only +#define H1_MF_CLEAN_CONN_HDR 0x00001000 // skip close/keep-alive values of connection headers during parsing +#define H1_MF_METH_CONNECT 0x00002000 // Set for a response to a CONNECT request +#define H1_MF_METH_HEAD 0x00004000 // Set for a response to a HEAD request + +/* Note: for a connection to be persistent, we need this for the request : + * - one of CLEN or CHNK + * - version 1.0 and KAL and not CLO + * - or version 1.1 and not CLO + * For the response it's the same except that UPG must not appear either. + * So in short, for a request it's (CLEN|CHNK) > 0 && !CLO && (VER_11 || KAL) + * and for a response it's (CLEN|CHNK) > 0 && !(CLO|UPG) && (VER_11 || KAL) + */ + + +/* basic HTTP/1 message state for use in parsers. The err_pos field is special, + * it is pre-set to a negative value (-1 or -2), and once non-negative it contains + * the relative position in the message of the first parse error. -2 is used to tell + * the parser that we want to block the invalid message. -1 is used to only perform + * a silent capture. + */ +struct h1m { + enum h1m_state state; // H1 message state (H1_MSG_*) + /* 24 bits available here */ + uint32_t flags; // H1 message flags (H1_MF_*) + uint64_t curr_len; // content-length or last chunk length + uint64_t body_len; // total known size of the body length + uint32_t next; // next byte to parse, relative to buffer's head + int err_pos; // position in the byte stream of the first error (H1 or H2) + int err_state; // state where the first error was met (H1 or H2) +}; + +/* basic H1 start line, describes either the request and the response */ +union h1_sl { /* useful start line pointers, relative to ->sol */ + struct { + struct ist m; /* METHOD */ + struct ist u; /* URI */ + struct ist v; /* VERSION */ + enum http_meth_t meth; /* method */ + } rq; /* request line : field, length */ + struct { + struct ist v; /* VERSION */ + struct ist c; /* CODE */ + struct ist r; /* REASON */ + uint16_t status; /* status code */ + } st; /* status line : field, length */ +}; + +#endif /* _HAPROXY_H1_T_H */ diff --git a/include/common/h1.h b/include/haproxy/h1.h index 1220e6cb3..7c1a44b42 100644 --- a/include/common/h1.h +++ b/include/haproxy/h1.h @@ -1,8 +1,8 @@ /* - * include/common/h1.h - * This file contains HTTP/1 protocol definitions. + * include/haproxy/h1.h + * These are the functions allowing to manipulate the HTTP/1 protocol elements * - * Copyright (C) 2000-2017 Willy Tarreau - w@1wt.eu + * Copyright (C) 2000-2020 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 @@ -19,126 +19,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _COMMON_H1_H -#define _COMMON_H1_H +#ifndef _HAPROXY_H1_H +#define _HAPROXY_H1_H #include <haproxy/base.h> -#include <haproxy/dynbuf.h> +#include <haproxy/buf.h> #include <haproxy/intops.h> +#include <haproxy/h1-t.h> #include <haproxy/http.h> #include <haproxy/http-hdr-t.h> #include <import/ist.h> -/* Possible states while parsing HTTP/1 messages (request|response) */ -enum h1m_state { - H1_MSG_RQBEFORE = 0, // request: leading LF, before start line - H1_MSG_RQBEFORE_CR = 1, // request: leading CRLF, before start line - /* these ones define a request start line */ - H1_MSG_RQMETH = 2, // parsing the Method - H1_MSG_RQMETH_SP = 3, // space(s) after the Method - H1_MSG_RQURI = 4, // parsing the Request URI - H1_MSG_RQURI_SP = 5, // space(s) after the Request URI - H1_MSG_RQVER = 6, // parsing the Request Version - H1_MSG_RQLINE_END = 7, // end of request line (CR or LF) - - H1_MSG_RPBEFORE = 8, // response: leading LF, before start line - H1_MSG_RPBEFORE_CR = 9, // response: leading CRLF, before start line - - /* these ones define a response start line */ - H1_MSG_RPVER = 10, // parsing the Response Version - H1_MSG_RPVER_SP = 11, // space(s) after the Response Version - H1_MSG_RPCODE = 12, // response code - H1_MSG_RPCODE_SP = 13, // space(s) after the response code - H1_MSG_RPREASON = 14, // response reason - H1_MSG_RPLINE_END = 15, // end of response line (CR or LF) - - /* common header processing */ - H1_MSG_HDR_FIRST = 16, // waiting for first header or last CRLF (no LWS possible) - H1_MSG_HDR_NAME = 17, // parsing header name - H1_MSG_HDR_COL = 18, // parsing header colon - H1_MSG_HDR_L1_SP = 19, // parsing header LWS (SP|HT) before value - H1_MSG_HDR_L1_LF = 20, // parsing header LWS (LF) before value - H1_MSG_HDR_L1_LWS = 21, // checking whether it's a new header or an LWS - H1_MSG_HDR_VAL = 22, // parsing header value - H1_MSG_HDR_L2_LF = 23, // parsing header LWS (LF) inside/after value - H1_MSG_HDR_L2_LWS = 24, // checking whether it's a new header or an LWS - - H1_MSG_LAST_LF = 25, // parsing last LF, last state for headers - - /* Body processing. */ - - H1_MSG_CHUNK_SIZE = 26, // parsing the chunk size (RFC7230 #4.1) - H1_MSG_DATA = 27, // skipping data chunk / content-length data - H1_MSG_CHUNK_CRLF = 28, // skipping CRLF after data chunk - H1_MSG_TRAILERS = 29, // trailers (post-data entity headers) - /* we enter this state when we've received the end of the current message */ - H1_MSG_DONE = 30, // message end received, waiting for resync or close - H1_MSG_TUNNEL = 31, // tunneled data after DONE -} __attribute__((packed)); - - -/* HTTP/1 message flags (32 bit), for use in h1m->flags only */ -#define H1_MF_NONE 0x00000000 -#define H1_MF_CLEN 0x00000001 // content-length present -#define H1_MF_CHNK 0x00000002 // chunk present, exclusive with c-l -#define H1_MF_RESP 0x00000004 // this message is the response message -#define H1_MF_TOLOWER 0x00000008 // turn the header names to lower case -#define H1_MF_VER_11 0x00000010 // message indicates version 1.1 or above -#define H1_MF_CONN_CLO 0x00000020 // message contains "connection: close" -#define H1_MF_CONN_KAL 0x00000040 // message contains "connection: keep-alive" -#define H1_MF_CONN_UPG 0x00000080 // message contains "connection: upgrade" -#define H1_MF_XFER_LEN 0x00000100 // message xfer size can be determined -#define H1_MF_XFER_ENC 0x00000200 // transfer-encoding is present -#define H1_MF_NO_PHDR 0x00000400 // don't add pseudo-headers in the header list -#define H1_MF_HDRS_ONLY 0x00000800 // parse headers only -#define H1_MF_CLEAN_CONN_HDR 0x00001000 // skip close/keep-alive values of connection headers during parsing -#define H1_MF_METH_CONNECT 0x00002000 // Set for a response to a CONNECT request -#define H1_MF_METH_HEAD 0x00004000 // Set for a response to a HEAD request - -/* Note: for a connection to be persistent, we need this for the request : - * - one of CLEN or CHNK - * - version 1.0 and KAL and not CLO - * - or version 1.1 and not CLO - * For the response it's the same except that UPG must not appear either. - * So in short, for a request it's (CLEN|CHNK) > 0 && !CLO && (VER_11 || KAL) - * and for a response it's (CLEN|CHNK) > 0 && !(CLO|UPG) && (VER_11 || KAL) - */ - - -/* basic HTTP/1 message state for use in parsers. The err_pos field is special, - * it is pre-set to a negative value (-1 or -2), and once non-negative it contains - * the relative position in the message of the first parse error. -2 is used to tell - * the parser that we want to block the invalid message. -1 is used to only perform - * a silent capture. - */ -struct h1m { - enum h1m_state state; // H1 message state (H1_MSG_*) - /* 24 bits available here */ - uint32_t flags; // H1 message flags (H1_MF_*) - uint64_t curr_len; // content-length or last chunk length - uint64_t body_len; // total known size of the body length - uint32_t next; // next byte to parse, relative to buffer's head - int err_pos; // position in the byte stream of the first error (H1 or H2) - int err_state; // state where the first error was met (H1 or H2) -}; - -/* basic H1 start line, describes either the request and the response */ -union h1_sl { /* useful start line pointers, relative to ->sol */ - struct { - struct ist m; /* METHOD */ - struct ist u; /* URI */ - struct ist v; /* VERSION */ - enum http_meth_t meth; /* method */ - } rq; /* request line : field, length */ - struct { - struct ist v; /* VERSION */ - struct ist c; /* CODE */ - struct ist r; /* REASON */ - uint16_t status; /* status code */ - } st; /* status line : field, length */ -}; - int h1_headers_to_hdr_list(char *start, const char *stop, struct http_hdr *hdr, unsigned int hdr_num, struct h1m *h1m, union h1_sl *slp); @@ -356,4 +248,4 @@ static inline struct h1m *h1m_init_res(struct h1m *h1m) return h1m; } -#endif /* _COMMON_H1_H */ +#endif /* _HAPROXY_H1_H */ diff --git a/include/proto/h1_htx.h b/include/proto/h1_htx.h index 02b9bdca7..6ea84465a 100644 --- a/include/proto/h1_htx.h +++ b/include/proto/h1_htx.h @@ -25,7 +25,7 @@ #include <haproxy/buf.h> #include <import/ist.h> -#include <common/h1.h> +#include <haproxy/h1-t.h> int h1_parse_msg_hdrs(struct h1m *h1m, union h1_sl *h1sl, struct htx *dsthtx, struct buffer *srcbuf, size_t ofs, size_t max); diff --git a/src/checks.c b/src/checks.c index 1c3957a03..fd711cd07 100644 --- a/src/checks.c +++ b/src/checks.c @@ -40,7 +40,7 @@ #include <haproxy/time.h> #include <haproxy/thread.h> #include <haproxy/http.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <common/htx.h> #include <types/global.h> @@ -12,7 +12,7 @@ #include <ctype.h> #include <haproxy/base.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <haproxy/http-hdr.h> #include <proto/channel.h> diff --git a/src/h1_htx.c b/src/h1_htx.c index 535fa1318..54ebe669f 100644 --- a/src/h1_htx.c +++ b/src/h1_htx.c @@ -12,7 +12,7 @@ #include <haproxy/base.h> #include <common/cfgparse.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <haproxy/http.h> #include <common/htx.h> diff --git a/src/hlua.c b/src/hlua.c index 3baf4e091..2e1c5cc5b 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -28,7 +28,7 @@ #include <haproxy/thread.h> #include <haproxy/regex.h> #include <haproxy/xref.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <common/standard.h> #include <types/cli.h> diff --git a/src/http_fetch.c b/src/http_fetch.c index a34f86989..ecda2b033 100644 --- a/src/http_fetch.c +++ b/src/http_fetch.c @@ -19,7 +19,7 @@ #include <haproxy/base.h> #include <haproxy/base64.h> #include <haproxy/chunk.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <haproxy/http.h> #include <common/htx.h> #include <haproxy/pool.h> diff --git a/src/http_htx.c b/src/http_htx.c index a2a7004cd..598bec032 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -19,7 +19,7 @@ #include <types/global.h> #include <common/cfgparse.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <haproxy/http.h> #include <common/htx.h> diff --git a/src/mux_fcgi.c b/src/mux_fcgi.c index 2f1417fab..fb7dfefdf 100644 --- a/src/mux_fcgi.c +++ b/src/mux_fcgi.c @@ -13,7 +13,7 @@ #include <haproxy/base.h> #include <common/cfgparse.h> #include <common/fcgi.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <common/htx.h> #include <import/ist.h> #include <haproxy/list.h> diff --git a/src/mux_h1.c b/src/mux_h1.c index 4c351153b..7e5ab5a46 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -12,7 +12,7 @@ #include <haproxy/base.h> #include <haproxy/istbuf.h> #include <common/cfgparse.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <common/h2.h> #include <common/htx.h> diff --git a/src/mux_h2.c b/src/mux_h2.c index 090db9776..8e6f2898e 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -13,7 +13,7 @@ #include <haproxy/base.h> #include <haproxy/istbuf.h> #include <common/cfgparse.h> -#include <common/h1.h> +#include <haproxy/h1.h> #include <common/h2.h> #include <common/hpack-dec.h> #include <common/hpack-enc.h> |
