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