diff --git a/contrib/hpack/decode.c b/contrib/hpack/decode.c index bc38f92f7..c924e4843 100644 --- a/contrib/hpack/decode.c +++ b/contrib/hpack/decode.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #define MAX_RQ_SIZE 65536 #define MAX_HDR_NUM 1000 diff --git a/contrib/hpack/gen-enc.c b/contrib/hpack/gen-enc.c index 36b132bd7..3fc5ef986 100644 --- a/contrib/hpack/gen-enc.c +++ b/contrib/hpack/gen-enc.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include "../../src/hpack-tbl.c" struct idxhdr { diff --git a/include/common/hpack-dec.h b/include/haproxy/hpack-dec.h similarity index 94% rename from include/common/hpack-dec.h rename to include/haproxy/hpack-dec.h index 1926574c5..4fb1a3658 100644 --- a/include/common/hpack-dec.h +++ b/include/haproxy/hpack-dec.h @@ -1,7 +1,7 @@ /* * HPACK decompressor (RFC7541) * - * Copyright (C) 2014-2017 Willy Tarreau + * Copyright (C) 2014-2020 Willy Tarreau * Copyright (C) 2017 HAProxy Technologies * * Permission is hereby granted, free of charge, to any person obtaining @@ -30,7 +30,7 @@ #include #include -#include +#include int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, struct http_hdr *list, int list_size, diff --git a/include/common/hpack-enc.h b/include/haproxy/hpack-enc.h similarity index 99% rename from include/common/hpack-enc.h rename to include/haproxy/hpack-enc.h index ede8d2845..7511c5da0 100644 --- a/include/common/hpack-enc.h +++ b/include/haproxy/hpack-enc.h @@ -1,7 +1,7 @@ /* * HPACK compressor (RFC7541) * - * Copyright (C) 2014-2017 Willy Tarreau + * Copyright (C) 2014-2020 Willy Tarreau * Copyright (C) 2017 HAProxy Technologies * * Permission is hereby granted, free of charge, to any person obtaining @@ -29,10 +29,10 @@ #define _COMMON_HPACK_ENC_H #include +#include #include #include #include -#include int hpack_encode_header(struct buffer *out, const struct ist n, const struct ist v); diff --git a/include/common/hpack-huff.h b/include/haproxy/hpack-huff.h similarity index 89% rename from include/common/hpack-huff.h rename to include/haproxy/hpack-huff.h index 04276d2c5..f93910312 100644 --- a/include/common/hpack-huff.h +++ b/include/haproxy/hpack-huff.h @@ -1,7 +1,7 @@ /* * Huffman decoding and encoding for HPACK (RFC7541) * - * Copyright (C) 2014-2017 Willy Tarreau + * Copyright (C) 2014-2020 Willy Tarreau * Copyright (C) 2017 HAProxy Technologies * * Permission is hereby granted, free of charge, to any person obtaining @@ -24,12 +24,12 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _PROTO_HPACK_HUFF_H -#define _PROTO_HPACK_HUFF_H +#ifndef _HAPROXY_HPACK_HUFF_H +#define _HAPROXY_HPACK_HUFF_H #include int huff_enc(const char *s, char *out); int huff_dec(const uint8_t *huff, int hlen, char *out, int olen); -#endif +#endif /* _HAPROXY_HPACK_HUFF_H */ diff --git a/include/common/hpack-tbl.h b/include/haproxy/hpack-tbl-t.h similarity index 63% rename from include/common/hpack-tbl.h rename to include/haproxy/hpack-tbl-t.h index b0ab4ff4f..7c8eb3224 100644 --- a/include/common/hpack-tbl.h +++ b/include/haproxy/hpack-tbl-t.h @@ -1,7 +1,7 @@ /* - * HPACK header table management (RFC7541) - type definitions and prototypes + * HPACK header table management (RFC7541) - type definitions * - * Copyright (C) 2014-2017 Willy Tarreau + * Copyright (C) 2014-2020 Willy Tarreau * Copyright (C) 2017 HAProxy Technologies * * Permission is hereby granted, free of charge, to any person obtaining @@ -24,14 +24,10 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _COMMON_HPACK_TBL_H -#define _COMMON_HPACK_TBL_H +#ifndef _HAPROXY_HPACK_TBL_T_H +#define _HAPROXY_HPACK_TBL_T_H -#include -#include -#include -#include -#include +#include /* Dynamic Headers Table, usable for tables up to 4GB long and values of 64kB-1. * The model can be improved by using offsets relative to the table entry's end @@ -132,137 +128,5 @@ enum { /* static header table as in RFC7541 Appendix A. [0] unused. */ #define HPACK_SHT_SIZE 62 -extern const struct http_hdr hpack_sht[HPACK_SHT_SIZE]; -extern struct pool_head *pool_head_hpack_tbl; -/* when built outside of haproxy, HPACK_STANDALONE must be defined, and - * pool_head_hpack_tbl->size must be set to the DHT size. - */ -#ifndef HPACK_STANDALONE -#define hpack_alloc(pool) pool_alloc(pool) -#define hpack_free(pool, ptr) pool_free(pool, ptr) -#else -#define hpack_alloc(pool) malloc(pool->size) -#define hpack_free(pool, ptr) free(ptr) -#endif - -extern int __hpack_dht_make_room(struct hpack_dht *dht, unsigned int needed); -extern int hpack_dht_insert(struct hpack_dht *dht, struct ist name, struct ist value); - -/* return a pointer to the entry designated by index (starting at 1) or - * NULL if this index is not there. - */ -static inline const struct hpack_dte *hpack_get_dte(const struct hpack_dht *dht, uint16_t idx) -{ - idx--; - - if (idx >= dht->used) - return NULL; - - if (idx <= dht->head) - idx = dht->head - idx; - else - idx = dht->head - idx + dht->wrap; - - return &dht->dte[idx]; -} - -/* returns non-zero if is valid for table */ -static inline int hpack_valid_idx(const struct hpack_dht *dht, uint32_t idx) -{ - return idx < dht->used + HPACK_SHT_SIZE; -} - -/* return a pointer to the header name for entry . */ -static inline struct ist hpack_get_name(const struct hpack_dht *dht, const struct hpack_dte *dte) -{ - struct ist ret = { - .ptr = (void *)dht + dte->addr, - .len = dte->nlen, - }; - return ret; -} - -/* return a pointer to the header value for entry . */ -static inline struct ist hpack_get_value(const struct hpack_dht *dht, const struct hpack_dte *dte) -{ - struct ist ret = { - .ptr = (void *)dht + dte->addr + dte->nlen, - .len = dte->vlen, - }; - return ret; -} - -/* takes an idx, returns the associated name */ -static inline struct ist hpack_idx_to_name(const struct hpack_dht *dht, uint32_t idx) -{ - const struct hpack_dte *dte; - - if (idx < HPACK_SHT_SIZE) - return hpack_sht[idx].n; - - dte = hpack_get_dte(dht, idx - HPACK_SHT_SIZE + 1); - if (!dte) - return ist("### ERR ###"); // error - - return hpack_get_name(dht, dte); -} - -/* takes an idx, returns the associated value */ -static inline struct ist hpack_idx_to_value(const struct hpack_dht *dht, uint32_t idx) -{ - const struct hpack_dte *dte; - - if (idx < HPACK_SHT_SIZE) - return hpack_sht[idx].v; - - dte = hpack_get_dte(dht, idx - HPACK_SHT_SIZE + 1); - if (!dte) - return ist("### ERR ###"); // error - - return hpack_get_value(dht, dte); -} - -/* Purges table dht until a header field of bytes fits according to - * the protocol (adding 32 bytes overhead). Returns non-zero on success, zero - * on failure (ie: table empty but still not sufficient). - */ -static inline int hpack_dht_make_room(struct hpack_dht *dht, unsigned int needed) -{ - if (dht->used * 32 + dht->total + needed + 32 <= dht->size) - return 1; - else if (!dht->used) - return 0; - - return __hpack_dht_make_room(dht, needed); -} - -/* allocate a dynamic headers table of bytes and return it initialized */ -static inline void hpack_dht_init(struct hpack_dht *dht, uint32_t size) -{ - dht->size = size; - dht->total = 0; - dht->used = 0; -} - -/* allocate a dynamic headers table from the pool and return it initialized */ -static inline struct hpack_dht *hpack_dht_alloc() -{ - struct hpack_dht *dht; - - if (unlikely(!pool_head_hpack_tbl)) - return NULL; - - dht = hpack_alloc(pool_head_hpack_tbl); - if (dht) - hpack_dht_init(dht, pool_head_hpack_tbl->size); - return dht; -} - -/* free a dynamic headers table */ -static inline void hpack_dht_free(struct hpack_dht *dht) -{ - hpack_free(pool_head_hpack_tbl, dht); -} - -#endif /* _COMMON_HPACK_TBL_H */ +#endif /* _HAPROXY_HPACK_TBL_T_H */ diff --git a/include/haproxy/hpack-tbl.h b/include/haproxy/hpack-tbl.h new file mode 100644 index 000000000..a75ab068c --- /dev/null +++ b/include/haproxy/hpack-tbl.h @@ -0,0 +1,171 @@ +/* + * HPACK header table management (RFC7541) - prototypes + * + * Copyright (C) 2014-2020 Willy Tarreau + * Copyright (C) 2017 HAProxy Technologies + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef _HAPROXY_HPACK_TBL_H +#define _HAPROXY_HPACK_TBL_H + +#include +#include +#include +#include + +/* when built outside of haproxy, HPACK_STANDALONE must be defined, and + * pool_head_hpack_tbl->size must be set to the DHT size. + */ +#ifndef HPACK_STANDALONE +#include +#define hpack_alloc(pool) pool_alloc(pool) +#define hpack_free(pool, ptr) pool_free(pool, ptr) +#else +#include +#include +#define hpack_alloc(pool) malloc(pool->size) +#define hpack_free(pool, ptr) free(ptr) +#endif + +extern const struct http_hdr hpack_sht[HPACK_SHT_SIZE]; +extern struct pool_head *pool_head_hpack_tbl; + +extern int __hpack_dht_make_room(struct hpack_dht *dht, unsigned int needed); +extern int hpack_dht_insert(struct hpack_dht *dht, struct ist name, struct ist value); + +/* return a pointer to the entry designated by index (starting at 1) or + * NULL if this index is not there. + */ +static inline const struct hpack_dte *hpack_get_dte(const struct hpack_dht *dht, uint16_t idx) +{ + idx--; + + if (idx >= dht->used) + return NULL; + + if (idx <= dht->head) + idx = dht->head - idx; + else + idx = dht->head - idx + dht->wrap; + + return &dht->dte[idx]; +} + +/* returns non-zero if is valid for table */ +static inline int hpack_valid_idx(const struct hpack_dht *dht, uint32_t idx) +{ + return idx < dht->used + HPACK_SHT_SIZE; +} + +/* return a pointer to the header name for entry . */ +static inline struct ist hpack_get_name(const struct hpack_dht *dht, const struct hpack_dte *dte) +{ + struct ist ret = { + .ptr = (void *)dht + dte->addr, + .len = dte->nlen, + }; + return ret; +} + +/* return a pointer to the header value for entry . */ +static inline struct ist hpack_get_value(const struct hpack_dht *dht, const struct hpack_dte *dte) +{ + struct ist ret = { + .ptr = (void *)dht + dte->addr + dte->nlen, + .len = dte->vlen, + }; + return ret; +} + +/* takes an idx, returns the associated name */ +static inline struct ist hpack_idx_to_name(const struct hpack_dht *dht, uint32_t idx) +{ + const struct hpack_dte *dte; + + if (idx < HPACK_SHT_SIZE) + return hpack_sht[idx].n; + + dte = hpack_get_dte(dht, idx - HPACK_SHT_SIZE + 1); + if (!dte) + return ist("### ERR ###"); // error + + return hpack_get_name(dht, dte); +} + +/* takes an idx, returns the associated value */ +static inline struct ist hpack_idx_to_value(const struct hpack_dht *dht, uint32_t idx) +{ + const struct hpack_dte *dte; + + if (idx < HPACK_SHT_SIZE) + return hpack_sht[idx].v; + + dte = hpack_get_dte(dht, idx - HPACK_SHT_SIZE + 1); + if (!dte) + return ist("### ERR ###"); // error + + return hpack_get_value(dht, dte); +} + +/* Purges table dht until a header field of bytes fits according to + * the protocol (adding 32 bytes overhead). Returns non-zero on success, zero + * on failure (ie: table empty but still not sufficient). + */ +static inline int hpack_dht_make_room(struct hpack_dht *dht, unsigned int needed) +{ + if (dht->used * 32 + dht->total + needed + 32 <= dht->size) + return 1; + else if (!dht->used) + return 0; + + return __hpack_dht_make_room(dht, needed); +} + +/* allocate a dynamic headers table of bytes and return it initialized */ +static inline void hpack_dht_init(struct hpack_dht *dht, uint32_t size) +{ + dht->size = size; + dht->total = 0; + dht->used = 0; +} + +/* allocate a dynamic headers table from the pool and return it initialized */ +static inline struct hpack_dht *hpack_dht_alloc() +{ + struct hpack_dht *dht; + + if (unlikely(!pool_head_hpack_tbl)) + return NULL; + + dht = hpack_alloc(pool_head_hpack_tbl); + if (dht) + hpack_dht_init(dht, pool_head_hpack_tbl->size); + return dht; +} + +/* free a dynamic headers table */ +static inline void hpack_dht_free(struct hpack_dht *dht) +{ + hpack_free(pool_head_hpack_tbl, dht); +} + +#endif /* _HAPROXY_HPACK_TBL_H */ diff --git a/src/hpack-dec.c b/src/hpack-dec.c index aa73f9b21..8f8e02bcc 100644 --- a/src/hpack-dec.c +++ b/src/hpack-dec.c @@ -31,9 +31,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/hpack-enc.c b/src/hpack-enc.c index 21e28f654..62c665202 100644 --- a/src/hpack-enc.c +++ b/src/hpack-enc.c @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include diff --git a/src/hpack-huff.c b/src/hpack-huff.c index 19ea16348..005dcc474 100644 --- a/src/hpack-huff.c +++ b/src/hpack-huff.c @@ -30,7 +30,7 @@ #include #include -#include +#include struct huff { uint32_t c; /* code point */ diff --git a/src/hpack-tbl.c b/src/hpack-tbl.c index 31c24b21f..8c56a0ddb 100644 --- a/src/hpack-tbl.c +++ b/src/hpack-tbl.c @@ -30,8 +30,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/src/mux_h2.c b/src/mux_h2.c index 8c72f8165..adc789ad2 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -15,9 +15,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include