diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2018-03-17 23:04:20 +0300 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2018-03-17 23:04:20 +0300 |
commit | c554dd1434e1378ac5f83a97b6d250b772941498 (patch) | |
tree | 71f2483b96c9038568d10ebbfd100ad3231f9183 /src/http/v2/ngx_http_v2_encode.c | |
parent | b84b67bc0f434747f3e13c5faf8ddf71acd11049 (diff) | |
download | nginx-c554dd1434e1378ac5f83a97b6d250b772941498.tar.gz nginx-c554dd1434e1378ac5f83a97b6d250b772941498.zip |
HTTP/2: externalized various constants and interfaces.
Diffstat (limited to 'src/http/v2/ngx_http_v2_encode.c')
-rw-r--r-- | src/http/v2/ngx_http_v2_encode.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/http/v2/ngx_http_v2_encode.c b/src/http/v2/ngx_http_v2_encode.c new file mode 100644 index 000000000..ac792084e --- /dev/null +++ b/src/http/v2/ngx_http_v2_encode.c @@ -0,0 +1,62 @@ + +/* + * Copyright (C) Nginx, Inc. + * Copyright (C) Valentin V. Bartenev + */ + + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_http.h> + + +static u_char *ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, + ngx_uint_t value); + + +u_char * +ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len, u_char *tmp, + ngx_uint_t lower) +{ + size_t hlen; + + hlen = ngx_http_v2_huff_encode(src, len, tmp, lower); + + if (hlen > 0) { + *dst = NGX_HTTP_V2_ENCODE_HUFF; + dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), hlen); + return ngx_cpymem(dst, tmp, hlen); + } + + *dst = NGX_HTTP_V2_ENCODE_RAW; + dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), len); + + if (lower) { + ngx_strlow(dst, src, len); + return dst + len; + } + + return ngx_cpymem(dst, src, len); +} + + +static u_char * +ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, ngx_uint_t value) +{ + if (value < prefix) { + *pos++ |= value; + return pos; + } + + *pos++ |= prefix; + value -= prefix; + + while (value >= 128) { + *pos++ = value % 128 + 128; + value /= 128; + } + + *pos++ = (u_char) value; + + return pos; +} |