Mercurial > hg > nginx
changeset 8491:6e1798a4a0d2 quic
HTTP/3: renamed ngx_http_v3.c to ngx_http_v3_encode.c.
The file contains only encoding functions.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Mon, 13 Jul 2020 12:38:08 +0300 |
parents | e24f7b50ba1d |
children | 65c1fc5fae15 |
files | auto/modules src/http/v3/ngx_http_v3.c src/http/v3/ngx_http_v3_encode.c |
diffstat | 3 files changed, 228 insertions(+), 228 deletions(-) [+] |
line wrap: on
line diff
--- a/auto/modules Mon Jul 13 12:33:00 2020 +0300 +++ b/auto/modules Mon Jul 13 12:38:08 2020 +0300 @@ -415,7 +415,7 @@ ngx_module_incs=src/http/v3 ngx_module_deps="src/http/v3/ngx_http_v3.h \ src/http/v3/ngx_http_v3_parse.h" - ngx_module_srcs="src/http/v3/ngx_http_v3.c \ + ngx_module_srcs="src/http/v3/ngx_http_v3_encode.c \ src/http/v3/ngx_http_v3_parse.c \ src/http/v3/ngx_http_v3_tables.c \ src/http/v3/ngx_http_v3_streams.c \
--- a/src/http/v3/ngx_http_v3.c Mon Jul 13 12:33:00 2020 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include <ngx_config.h> -#include <ngx_core.h> -#include <ngx_http.h> - - -uintptr_t -ngx_http_v3_encode_varlen_int(u_char *p, uint64_t value) -{ - if (value <= 63) { - if (p == NULL) { - return 1; - } - - *p++ = value; - return (uintptr_t) p; - } - - if (value <= 16383) { - if (p == NULL) { - return 2; - } - - *p++ = 0x40 | (value >> 8); - *p++ = value; - return (uintptr_t) p; - } - - if (value <= 1073741823) { - if (p == NULL) { - return 4; - } - - *p++ = 0x80 | (value >> 24); - *p++ = (value >> 16); - *p++ = (value >> 8); - *p++ = value; - return (uintptr_t) p; - } - - if (p == NULL) { - return 8; - } - - *p++ = 0xc0 | (value >> 56); - *p++ = (value >> 48); - *p++ = (value >> 40); - *p++ = (value >> 32); - *p++ = (value >> 24); - *p++ = (value >> 16); - *p++ = (value >> 8); - *p++ = value; - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, ngx_uint_t prefix) -{ - ngx_uint_t thresh, n; - - thresh = (1 << prefix) - 1; - - if (value < thresh) { - if (p == NULL) { - return 1; - } - - *p++ |= value; - return (uintptr_t) p; - } - - value -= thresh; - - if (p == NULL) { - for (n = 2; value >= 128; n++) { - value >>= 7; - } - - return n; - } - - *p++ |= thresh; - - while (value >= 128) { - *p++ = 0x80 | value; - value >>= 7; - } - - *p++ = value; - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_header_block_prefix(u_char *p, ngx_uint_t insert_count, - ngx_uint_t sign, ngx_uint_t delta_base) -{ - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, insert_count, 8) - + ngx_http_v3_encode_prefix_int(NULL, delta_base, 7); - } - - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, insert_count, 8); - - *p = sign ? 0x80 : 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, delta_base, 7); - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_header_ri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index) -{ - /* Indexed Header Field */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 6); - } - - *p = dynamic ? 0x80 : 0xc0; - - return ngx_http_v3_encode_prefix_int(p, index, 6); -} - - -uintptr_t -ngx_http_v3_encode_header_lri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index, - u_char *data, size_t len) -{ - /* Literal Header Field With Name Reference */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 4) - + ngx_http_v3_encode_prefix_int(NULL, len, 7) - + len; - } - - *p = dynamic ? 0x60 : 0x70; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 4); - - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7); - - if (data) { - p = ngx_cpymem(p, data, len); - } - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_header_l(u_char *p, ngx_str_t *name, ngx_str_t *value) -{ - /* Literal Header Field Without Name Reference */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, name->len, 3) - + name->len - + ngx_http_v3_encode_prefix_int(NULL, value->len, 7) - + value->len; - } - - *p = 0x30; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, name->len, 3); - - ngx_strlow(p, name->data, name->len); - p += name->len; - - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, value->len, 7); - - p = ngx_cpymem(p, value->data, value->len); - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_header_pbi(u_char *p, ngx_uint_t index) -{ - /* Indexed Header Field With Post-Base Index */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 4); - } - - *p = 0x10; - - return ngx_http_v3_encode_prefix_int(p, index, 4); -} - - -uintptr_t -ngx_http_v3_encode_header_lpbi(u_char *p, ngx_uint_t index, u_char *data, - size_t len) -{ - /* Literal Header Field With Post-Base Name Reference */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 3) - + ngx_http_v3_encode_prefix_int(NULL, len, 7) - + len; - } - - *p = 0x08; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 3); - - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7); - - if (data) { - p = ngx_cpymem(p, data, len); - } - - return (uintptr_t) p; -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/http/v3/ngx_http_v3_encode.c Mon Jul 13 12:38:08 2020 +0300 @@ -0,0 +1,227 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Nginx, Inc. + */ + + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_http.h> + + +uintptr_t +ngx_http_v3_encode_varlen_int(u_char *p, uint64_t value) +{ + if (value <= 63) { + if (p == NULL) { + return 1; + } + + *p++ = value; + return (uintptr_t) p; + } + + if (value <= 16383) { + if (p == NULL) { + return 2; + } + + *p++ = 0x40 | (value >> 8); + *p++ = value; + return (uintptr_t) p; + } + + if (value <= 1073741823) { + if (p == NULL) { + return 4; + } + + *p++ = 0x80 | (value >> 24); + *p++ = (value >> 16); + *p++ = (value >> 8); + *p++ = value; + return (uintptr_t) p; + } + + if (p == NULL) { + return 8; + } + + *p++ = 0xc0 | (value >> 56); + *p++ = (value >> 48); + *p++ = (value >> 40); + *p++ = (value >> 32); + *p++ = (value >> 24); + *p++ = (value >> 16); + *p++ = (value >> 8); + *p++ = value; + return (uintptr_t) p; +} + + +uintptr_t +ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, ngx_uint_t prefix) +{ + ngx_uint_t thresh, n; + + thresh = (1 << prefix) - 1; + + if (value < thresh) { + if (p == NULL) { + return 1; + } + + *p++ |= value; + return (uintptr_t) p; + } + + value -= thresh; + + if (p == NULL) { + for (n = 2; value >= 128; n++) { + value >>= 7; + } + + return n; + } + + *p++ |= thresh; + + while (value >= 128) { + *p++ = 0x80 | value; + value >>= 7; + } + + *p++ = value; + + return (uintptr_t) p; +} + + +uintptr_t +ngx_http_v3_encode_header_block_prefix(u_char *p, ngx_uint_t insert_count, + ngx_uint_t sign, ngx_uint_t delta_base) +{ + if (p == NULL) { + return ngx_http_v3_encode_prefix_int(NULL, insert_count, 8) + + ngx_http_v3_encode_prefix_int(NULL, delta_base, 7); + } + + *p = 0; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, insert_count, 8); + + *p = sign ? 0x80 : 0; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, delta_base, 7); + + return (uintptr_t) p; +} + + +uintptr_t +ngx_http_v3_encode_header_ri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index) +{ + /* Indexed Header Field */ + + if (p == NULL) { + return ngx_http_v3_encode_prefix_int(NULL, index, 6); + } + + *p = dynamic ? 0x80 : 0xc0; + + return ngx_http_v3_encode_prefix_int(p, index, 6); +} + + +uintptr_t +ngx_http_v3_encode_header_lri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index, + u_char *data, size_t len) +{ + /* Literal Header Field With Name Reference */ + + if (p == NULL) { + return ngx_http_v3_encode_prefix_int(NULL, index, 4) + + ngx_http_v3_encode_prefix_int(NULL, len, 7) + + len; + } + + *p = dynamic ? 0x60 : 0x70; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 4); + + *p = 0; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7); + + if (data) { + p = ngx_cpymem(p, data, len); + } + + return (uintptr_t) p; +} + + +uintptr_t +ngx_http_v3_encode_header_l(u_char *p, ngx_str_t *name, ngx_str_t *value) +{ + /* Literal Header Field Without Name Reference */ + + if (p == NULL) { + return ngx_http_v3_encode_prefix_int(NULL, name->len, 3) + + name->len + + ngx_http_v3_encode_prefix_int(NULL, value->len, 7) + + value->len; + } + + *p = 0x30; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, name->len, 3); + + ngx_strlow(p, name->data, name->len); + p += name->len; + + *p = 0; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, value->len, 7); + + p = ngx_cpymem(p, value->data, value->len); + + return (uintptr_t) p; +} + + +uintptr_t +ngx_http_v3_encode_header_pbi(u_char *p, ngx_uint_t index) +{ + /* Indexed Header Field With Post-Base Index */ + + if (p == NULL) { + return ngx_http_v3_encode_prefix_int(NULL, index, 4); + } + + *p = 0x10; + + return ngx_http_v3_encode_prefix_int(p, index, 4); +} + + +uintptr_t +ngx_http_v3_encode_header_lpbi(u_char *p, ngx_uint_t index, u_char *data, + size_t len) +{ + /* Literal Header Field With Post-Base Name Reference */ + + if (p == NULL) { + return ngx_http_v3_encode_prefix_int(NULL, index, 3) + + ngx_http_v3_encode_prefix_int(NULL, len, 7) + + len; + } + + *p = 0x08; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 3); + + *p = 0; + p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7); + + if (data) { + p = ngx_cpymem(p, data, len); + } + + return (uintptr_t) p; +}