| |
| /* |
| * 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_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; |
| } |