http2 able to send test.html to nghttp2
Signed-off-by: Andy Green <andy.green@linaro.org>
diff --git a/lib/hpack.c b/lib/hpack.c
index 1bda810..bd4f462 100644
--- a/lib/hpack.c
+++ b/lib/hpack.c
@@ -468,3 +468,98 @@
return 0;
}
+
+static int lws_http2_num(int starting_bits, unsigned long num, unsigned char **p, unsigned char *end)
+{
+ int mask = (1 << starting_bits) - 1;
+
+ if (num < mask) {
+ *((*p)++) |= num;
+ return *p >= end;
+ }
+
+ *((*p)++) |= mask;
+ if (*p >= end)
+ return 1;
+
+ num -= mask;
+ while (num >= 128) {
+ *((*p)++) = 0x80 | (num & 0x7f);
+ if (*p >= end)
+ return 1;
+ num >>= 7;
+ }
+
+ return 0;
+}
+
+int lws_add_http2_header_by_name(struct libwebsocket_context *context,
+ struct libwebsocket *wsi,
+ const unsigned char *name,
+ const unsigned char *value,
+ int length,
+ unsigned char **p,
+ unsigned char *end)
+{
+ int len;
+
+ lwsl_info("%s: %p %s:%s\n", __func__, *p, name, value);
+
+ len = strlen((char *)name);
+ if (len)
+ if (name[len - 1] == ':')
+ len--;
+
+ if (end - *p < len + length + 8)
+ return 1;
+
+ *((*p)++) = 0; /* not indexed, literal name */
+
+ **p = 0; /* non-HUF */
+ if (lws_http2_num(7, len, p, end))
+ return 1;
+ memcpy(*p, name, len);
+ *p += len;
+
+ *(*p) = 0; /* non-HUF */
+ if (lws_http2_num(7, length, p, end))
+ return 1;
+
+ memcpy(*p, value, length);
+ *p += length;
+
+ return 0;
+}
+
+int lws_add_http2_header_by_token(struct libwebsocket_context *context,
+ struct libwebsocket *wsi,
+ enum lws_token_indexes token,
+ const unsigned char *value,
+ int length,
+ unsigned char **p,
+ unsigned char *end)
+{
+ const unsigned char *name;
+
+ name = lws_token_to_string(token);
+ if (!name)
+ return 1;
+
+ return lws_add_http2_header_by_name(context, wsi, name, value, length, p, end);
+}
+
+int lws_add_http2_header_status(struct libwebsocket_context *context,
+ struct libwebsocket *wsi,
+ unsigned int code,
+ unsigned char **p,
+ unsigned char *end)
+{
+ unsigned char status[10];
+ int n;
+
+ n = sprintf((char *)status, "%u", code);
+ if (lws_add_http2_header_by_token(context, wsi, WSI_TOKEN_HTTP_COLON_STATUS, status, n, p, end))
+ return 1;
+
+ return 0;
+}
\ No newline at end of file