Created
April 5, 2014 12:36
-
-
Save tatsuhiro-t/9991435 to your computer and use it in GitHub Desktop.
mruby-http2 patch to upgrade nghttp2 and support h2-11
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 1d9ddfc0c0bf041461a321313d1a6af7286fc23e Mon Sep 17 00:00:00 2001 | |
From: Tatsuhiro Tsujikawa <[email protected]> | |
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