Mercurial > hg > nginx
view src/http/v3/ngx_http_v3.c @ 8405:d2759e4cc437 quic
HTTP/3: split header parser in two functions.
The first one parses pseudo-headers and is analagous to the request line
parser in HTTP/1. The second one parses regular headers and is analogous to
the header parser in HTTP/1.
Additionally, error handling of client passing malformed uri is now fixed.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 19 May 2020 15:29:10 +0300 |
parents | b13176e717ba |
children | b0e81f49d7c0 |
line wrap: on
line source
/* * 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; for (n = 10; n > 1; n--) { if (value >> (7 * (n - 1))) { break; } } if (p == NULL) { return n + 1; } *p++ |= thresh; for ( /* void */ ; n > 1; n--) { *p++ = 0x80 | (value >> 7 * (n - 1)); } *p++ = value & 0x7f; return (uintptr_t) p; }