|
@@ -56,6 +56,7 @@ Http2Session::Http2Session(http_session_type type) {
|
|
|
}
|
|
}
|
|
|
else if (type == HTTP_SERVER) {
|
|
else if (type == HTTP_SERVER) {
|
|
|
nghttp2_session_server_new(&session, cbs, NULL);
|
|
nghttp2_session_server_new(&session, cbs, NULL);
|
|
|
|
|
+ state = HSS_WANT_RECV;
|
|
|
}
|
|
}
|
|
|
nghttp2_session_set_user_data(session, this);
|
|
nghttp2_session_set_user_data(session, this);
|
|
|
submited = NULL;
|
|
submited = NULL;
|
|
@@ -111,7 +112,7 @@ int Http2Session::GetSendData(char** data, size_t* len) {
|
|
|
// grpc server send grpc-status in HTTP2 header frame
|
|
// grpc server send grpc-status in HTTP2 header frame
|
|
|
framehd.flags = HTTP2_FLAG_NONE;
|
|
framehd.flags = HTTP2_FLAG_NONE;
|
|
|
|
|
|
|
|
-#ifdef TEST_PROTOBUF
|
|
|
|
|
|
|
+ /*
|
|
|
// @test protobuf
|
|
// @test protobuf
|
|
|
// message StringMessage {
|
|
// message StringMessage {
|
|
|
// string str = 1;
|
|
// string str = 1;
|
|
@@ -127,7 +128,7 @@ int Http2Session::GetSendData(char** data, size_t* len) {
|
|
|
msghd.length += protobuf_taglen;
|
|
msghd.length += protobuf_taglen;
|
|
|
framehd.length += protobuf_taglen;
|
|
framehd.length += protobuf_taglen;
|
|
|
*len += protobuf_taglen;
|
|
*len += protobuf_taglen;
|
|
|
-#endif
|
|
|
|
|
|
|
+ */
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
grpc_message_hd_pack(&msghd, frame_hdbuf + HTTP2_FRAME_HDLEN);
|
|
grpc_message_hd_pack(&msghd, frame_hdbuf + HTTP2_FRAME_HDLEN);
|
|
@@ -142,7 +143,8 @@ int Http2Session::GetSendData(char** data, size_t* len) {
|
|
|
void* content = submited->Content();
|
|
void* content = submited->Content();
|
|
|
int content_length = submited->ContentLength();
|
|
int content_length = submited->ContentLength();
|
|
|
if (content_length == 0) {
|
|
if (content_length == 0) {
|
|
|
- state = HSS_SEND_DONE;
|
|
|
|
|
|
|
+ // skip send_data
|
|
|
|
|
+ goto send_done;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
state = HSS_SEND_DATA;
|
|
state = HSS_SEND_DATA;
|
|
@@ -151,6 +153,7 @@ int Http2Session::GetSendData(char** data, size_t* len) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else if (state == HSS_SEND_DATA) {
|
|
else if (state == HSS_SEND_DATA) {
|
|
|
|
|
+send_done:
|
|
|
state = HSS_SEND_DONE;
|
|
state = HSS_SEND_DONE;
|
|
|
if (submited->ContentType() == APPLICATION_GRPC) {
|
|
if (submited->ContentType() == APPLICATION_GRPC) {
|
|
|
if (type == HTTP_SERVER && stream_closed) {
|
|
if (type == HTTP_SERVER && stream_closed) {
|
|
@@ -170,7 +173,7 @@ int Http2Session::GetSendData(char** data, size_t* len) {
|
|
|
|
|
|
|
|
int Http2Session::FeedRecvData(const char* data, size_t len) {
|
|
int Http2Session::FeedRecvData(const char* data, size_t len) {
|
|
|
printd("nghttp2_session_mem_recv %d\n", len);
|
|
printd("nghttp2_session_mem_recv %d\n", len);
|
|
|
- state = HSS_RECVING;
|
|
|
|
|
|
|
+ state = HSS_WANT_RECV;
|
|
|
size_t ret = nghttp2_session_mem_recv(session, (const uint8_t*)data, len);
|
|
size_t ret = nghttp2_session_mem_recv(session, (const uint8_t*)data, len);
|
|
|
if (ret != len) {
|
|
if (ret != len) {
|
|
|
error = ret;
|
|
error = ret;
|
|
@@ -178,16 +181,6 @@ int Http2Session::FeedRecvData(const char* data, size_t len) {
|
|
|
return (int)ret;
|
|
return (int)ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-bool Http2Session::WantRecv() {
|
|
|
|
|
- if (stream_id == -1) return true;
|
|
|
|
|
- if (stream_closed) return false;
|
|
|
|
|
- if (state == HSS_RECV_DATA ||
|
|
|
|
|
- state == HSS_RECV_PING) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- return true;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
int Http2Session::SubmitRequest(HttpRequest* req) {
|
|
int Http2Session::SubmitRequest(HttpRequest* req) {
|
|
|
submited = req;
|
|
submited = req;
|
|
|
|
|
|
|
@@ -239,7 +232,6 @@ int Http2Session::SubmitRequest(HttpRequest* req) {
|
|
|
// nghttp2_data_provider data_prd;
|
|
// nghttp2_data_provider data_prd;
|
|
|
// data_prd.read_callback = data_source_read_callback;
|
|
// data_prd.read_callback = data_source_read_callback;
|
|
|
//stream_id = nghttp2_submit_request(session, NULL, &nvs[0], nvs.size(), &data_prd, NULL);
|
|
//stream_id = nghttp2_submit_request(session, NULL, &nvs[0], nvs.size(), &data_prd, NULL);
|
|
|
- stream_closed = 0;
|
|
|
|
|
state = HSS_SEND_HEADERS;
|
|
state = HSS_SEND_HEADERS;
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -256,13 +248,9 @@ int Http2Session::SubmitResponse(HttpResponse* res) {
|
|
|
res->headers["content-type"] = http_content_type_str(APPLICATION_GRPC);
|
|
res->headers["content-type"] = http_content_type_str(APPLICATION_GRPC);
|
|
|
}
|
|
}
|
|
|
//res->headers["accept-encoding"] = "identity";
|
|
//res->headers["accept-encoding"] = "identity";
|
|
|
- //hss->state = HSS_RECV_PING;
|
|
|
|
|
- //break;
|
|
|
|
|
//res->headers["grpc-accept-encoding"] = "identity";
|
|
//res->headers["grpc-accept-encoding"] = "identity";
|
|
|
//res->headers["grpc-status"] = "0";
|
|
//res->headers["grpc-status"] = "0";
|
|
|
-#ifdef TEST_PROTOBUF
|
|
|
|
|
- res->status_code = HTTP_STATUS_OK;
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ //res->status_code = HTTP_STATUS_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
std::vector<nghttp2_nv> nvs;
|
|
std::vector<nghttp2_nv> nvs;
|
|
@@ -296,7 +284,6 @@ int Http2Session::SubmitResponse(HttpResponse* res) {
|
|
|
// avoid DATA_SOURCE_COPY, we do not use nghttp2_submit_data
|
|
// avoid DATA_SOURCE_COPY, we do not use nghttp2_submit_data
|
|
|
// data_prd.read_callback = data_source_read_callback;
|
|
// data_prd.read_callback = data_source_read_callback;
|
|
|
//nghttp2_submit_response(session, stream_id, &nvs[0], nvs.size(), &data_prd);
|
|
//nghttp2_submit_response(session, stream_id, &nvs[0], nvs.size(), &data_prd);
|
|
|
- stream_closed = 0;
|
|
|
|
|
state = HSS_SEND_HEADERS;
|
|
state = HSS_SEND_HEADERS;
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -317,14 +304,6 @@ int Http2Session::InitRequest(HttpRequest* req) {
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int Http2Session::GetError() {
|
|
|
|
|
- return error;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-const char* Http2Session::StrError(int error) {
|
|
|
|
|
- return nghttp2_http2_strerror(error);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
nghttp2_session_callbacks* Http2Session::cbs = NULL;
|
|
nghttp2_session_callbacks* Http2Session::cbs = NULL;
|
|
|
|
|
|
|
|
int on_header_callback(nghttp2_session *session,
|
|
int on_header_callback(nghttp2_session *session,
|
|
@@ -396,19 +375,6 @@ int on_frame_recv_callback(nghttp2_session *session,
|
|
|
printd("on_frame_recv_callback\n");
|
|
printd("on_frame_recv_callback\n");
|
|
|
print_frame_hd(&frame->hd);
|
|
print_frame_hd(&frame->hd);
|
|
|
Http2Session* hss = (Http2Session*)userdata;
|
|
Http2Session* hss = (Http2Session*)userdata;
|
|
|
- switch (frame->hd.type) {
|
|
|
|
|
- case NGHTTP2_DATA:
|
|
|
|
|
- case NGHTTP2_HEADERS:
|
|
|
|
|
- hss->stream_id = frame->hd.stream_id;
|
|
|
|
|
- if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
|
|
|
|
|
- printd("on_stream_closed stream_id=%d\n", hss->stream_id);
|
|
|
|
|
- hss->stream_closed = 1;
|
|
|
|
|
- }
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
switch (frame->hd.type) {
|
|
switch (frame->hd.type) {
|
|
|
case NGHTTP2_DATA:
|
|
case NGHTTP2_DATA:
|
|
|
hss->state = HSS_RECV_DATA;
|
|
hss->state = HSS_RECV_DATA;
|
|
@@ -425,6 +391,12 @@ int on_frame_recv_callback(nghttp2_session *session,
|
|
|
default:
|
|
default:
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
+ hss->stream_id = frame->hd.stream_id;
|
|
|
|
|
+ hss->stream_closed = 0;
|
|
|
|
|
+ if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
|
|
|
|
|
+ printd("on_stream_closed stream_id=%d\n", hss->stream_id);
|
|
|
|
|
+ hss->stream_closed = 1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|