Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tatsuhiro-t/9991435 to your computer and use it in GitHub Desktop.
Save tatsuhiro-t/9991435 to your computer and use it in GitHub Desktop.
mruby-http2 patch to upgrade nghttp2 and support h2-11
From 1d9ddfc0c0bf041461a321313d1a6af7286fc23e Mon Sep 17 00:00:00 2001
From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Date: Sat, 5 Apr 2014 21:34:45 +0900
Subject: [PATCH] Update nghttp2 to latest, supporting h2-11
---
mrbgem.rake | 2 +-
src/mrb_http2.c | 1 +
src/mrb_http2.h | 6 ++++--
src/mrb_http2_client.c | 13 ++++++-------
src/mrb_http2_server.c | 12 ++++++------
5 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/mrbgem.rake b/mrbgem.rake
index b2bae5b..d33ecd9 100644
--- a/mrbgem.rake
+++ b/mrbgem.rake
@@ -10,7 +10,7 @@ MRuby::Gem::Specification.new('mruby-http2') do |spec|
nghttp2_dir = "#{build_dir}/nghttp2"
nghttp2_lib = "#{build_dir}/nghttp2/lib/.libs"
libnghttp2a = "#{nghttp2_lib}/libnghttp2.a"
- nghttp2_ver = "8ccb6e463d52928f6704b5a749107065f9468dc2"
+ nghttp2_ver = "5b55874d4d583d51d957fbadda6aa75a5c621b02"
def run_command env, command
STDOUT.sync = true
diff --git a/src/mrb_http2.c b/src/mrb_http2.c
index e5841d4..f8f074f 100644
--- a/src/mrb_http2.c
+++ b/src/mrb_http2.c
@@ -53,6 +53,7 @@ void mrb_http2_create_nv(mrb_state *mrb, nghttp2_nv *nv, const uint8_t *name,
nv->namelen = namelen;
nv->value = (uint8_t *)value;
nv->valuelen = valuelen;
+ nv->flags = NGHTTP2_NV_FLAG_NONE;
}
// add nghttp2_nv into existing nghttp2_nv array
diff --git a/src/mrb_http2.h b/src/mrb_http2.h
index 4faec30..846abad 100644
--- a/src/mrb_http2.h
+++ b/src/mrb_http2.h
@@ -63,10 +63,12 @@
#define ARRLEN(x) (sizeof(x)/sizeof(x[0]))
#define MAKE_NV(NAME, VALUE) \
{(uint8_t*)NAME, (uint8_t*)VALUE, \
- (uint16_t)(sizeof(NAME) - 1), (uint16_t)(sizeof(VALUE) - 1) }
+ (uint16_t)(sizeof(NAME) - 1), (uint16_t)(sizeof(VALUE) - 1), \
+ NGHTTP2_NV_FLAG_NONE}
#define MAKE_NV_CS(NAME, VALUE) \
{(uint8_t*)NAME, (uint8_t*)VALUE, \
- (uint16_t)(sizeof(NAME) - 1), (uint16_t)(strlen(VALUE)) }
+ (uint16_t)(sizeof(NAME) - 1), (uint16_t)(strlen(VALUE)), \
+ NGHTTP2_NV_FLAG_NONE}
int mrb_http2_get_nv_id(nghttp2_nv *nva, size_t nvlen, const char *key);
void mrb_http2_create_nv(mrb_state *mrb, nghttp2_nv *nv, const uint8_t *name,
diff --git a/src/mrb_http2_client.c b/src/mrb_http2_client.c
index 1cb0a41..62a20af 100644
--- a/src/mrb_http2_client.c
+++ b/src/mrb_http2_client.c
@@ -345,7 +345,7 @@ static int on_frame_recv_callback(nghttp2_session *session,
//static int on_header_callback(nghttp2_session *session, const nghttp2_frame *frame, void *user_data)
static int on_header_callback(nghttp2_session *session,
const nghttp2_frame *frame, const uint8_t *name, size_t namelen,
- const uint8_t *value, size_t valuelen, void *user_data)
+ const uint8_t *value, size_t valuelen, uint8_t flags, void *user_data)
{
struct mrb_http2_conn_t *conn = (struct mrb_http2_conn_t*)user_data;
@@ -614,7 +614,6 @@ static void mrb_http2_ctl_poll(mrb_state *mrb, struct pollfd *pollfd,
static void mrb_http2_submit_request(mrb_state *mrb,
struct mrb_http2_conn_t *conn, struct mrb_http2_request_t *req)
{
- int pri = 0;
int rv;
const nghttp2_nv nva[] = {
MAKE_NV(":method", "GET"),
@@ -625,7 +624,7 @@ static void mrb_http2_submit_request(mrb_state *mrb,
MAKE_NV("accept-encoding", GZIP),
MAKE_NV("user-agent", MRUBY_HTTP2_NAME"/"MRUBY_HTTP2_VERSION)
};
- rv = nghttp2_submit_request(conn->session, pri, nva,
+ rv = nghttp2_submit_request(conn->session, NULL, nva,
sizeof(nva)/sizeof(nva[0]), NULL, req);
if(rv != 0) {
mrb_raisef(mrb, E_RUNTIME_ERROR, "http2_submit_request: %S",
@@ -709,8 +708,8 @@ static mrb_value mrb_http2_fetch_uri(mrb_state *mrb,
conn.ssl = ssl;
conn.want_io = IO_NONE;
- SSL_write(ssl, NGHTTP2_CLIENT_CONNECTION_HEADER,
- NGHTTP2_CLIENT_CONNECTION_HEADER_LEN);
+ SSL_write(ssl, NGHTTP2_CLIENT_CONNECTION_PREFACE,
+ NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN);
mrb_http2_make_non_block(mrb, fd);
mrb_http2_set_tcp_nodelay(mrb, fd);
@@ -789,8 +788,8 @@ static mrb_value mrb_http2_get_uri(mrb_state *mrb, mrb_http2_context_t *ctx)
ctx->conn->ssl = ssl;
ctx->conn->want_io = IO_NONE;
- SSL_write(ssl, NGHTTP2_CLIENT_CONNECTION_HEADER,
- NGHTTP2_CLIENT_CONNECTION_HEADER_LEN);
+ SSL_write(ssl, NGHTTP2_CLIENT_CONNECTION_PREFACE,
+ NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN);
mrb_http2_make_non_block(mrb, fd);
mrb_http2_set_tcp_nodelay(mrb, fd);
diff --git a/src/mrb_http2_server.c b/src/mrb_http2_server.c
index 592f1ef..fbdd6fc 100644
--- a/src/mrb_http2_server.c
+++ b/src/mrb_http2_server.c
@@ -320,7 +320,7 @@ static char* percent_decode(mrb_state *mrb, const uint8_t *value, size_t valuele
}
static ssize_t file_read_callback(nghttp2_session *session,
- int32_t stream_id, uint8_t *buf, size_t length, int *eof,
+ int32_t stream_id, uint8_t *buf, size_t length, uint32_t *data_flags,
nghttp2_data_source *source, void *user_data)
{
int fd = source->fd;
@@ -332,7 +332,7 @@ static ssize_t file_read_callback(nghttp2_session *session,
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
}
if(r == 0) {
- *eof = 1;
+ *data_flags |= NGHTTP2_DATA_FLAG_EOF;
}
TRACER;
return r;
@@ -437,7 +437,7 @@ static int error_reply(app_context *app_ctx, nghttp2_session *session,
static int server_on_header_callback(nghttp2_session *session,
const nghttp2_frame *frame, const uint8_t *name, size_t namelen,
- const uint8_t *value, size_t valuelen, void *user_data)
+ const uint8_t *value, size_t valuelen, uint8_t flags, void *user_data)
{
http2_session_data *session_data = (http2_session_data *)user_data;
mrb_state *mrb = session_data->app_ctx->server->mrb;
@@ -808,7 +808,7 @@ static http2_session_data* create_http2_session_data(mrb_state *mrb,
BUFFEREVENT_SSL_ACCEPTING, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS);
}
- session_data->handshake_leftlen = NGHTTP2_CLIENT_CONNECTION_HEADER_LEN;
+ session_data->handshake_leftlen = NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN;
rv = getnameinfo(addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
if(rv != 0) {
session_data->client_addr = mrb_http2_strcopy(mrb, "(unknown)", strlen("(unknown)"));
@@ -898,10 +898,10 @@ static void mrb_http2_server_handshake_readcb(struct bufferevent *bev, void *ptr
uint8_t data[24];
struct evbuffer *input = bufferevent_get_input(session_data->bev);
int readlen = evbuffer_remove(input, data, session_data->handshake_leftlen);
- const char *conhead = NGHTTP2_CLIENT_CONNECTION_HEADER;
+ const char *conhead = NGHTTP2_CLIENT_CONNECTION_PREFACE;
TRACER;
- if(memcmp(conhead + NGHTTP2_CLIENT_CONNECTION_HEADER_LEN
+ if(memcmp(conhead + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN
- session_data->handshake_leftlen, data, readlen) != 0) {
delete_http2_session_data(session_data);
return;
--
1.9.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment