aboutsummaryrefslogtreecommitdiff
path: root/src/http/v2/ngx_http_v2_encode.c
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2018-03-17 23:04:20 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2018-03-17 23:04:20 +0300
commitc554dd1434e1378ac5f83a97b6d250b772941498 (patch)
tree71f2483b96c9038568d10ebbfd100ad3231f9183 /src/http/v2/ngx_http_v2_encode.c
parentb84b67bc0f434747f3e13c5faf8ddf71acd11049 (diff)
downloadnginx-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.c62
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;
+}