在nghttp2_callback_array函数中对流结束信息进行处理
在close函数中对命中规则且只有head头数据进行注册
This commit is contained in:
fengweihao
2019-04-03 10:43:16 +08:00
committed by zhengchao
parent a22e0ed630
commit 77d2e3fb53

View File

@@ -1024,7 +1024,89 @@ finish:
}
static int
nghttp2_set_padlen(struct tfe_session_info_t *session_info,const nghttp2_frame *frame,
nghttp2_end_submit_header2(struct tfe_session_info_t *session_info,
struct h2_stream_data_t *h2_stream)
{
int xret = -1;
int32_t stream_id = 0;
nghttp2_nv hdrs[128] = {0};
struct http2_headers headers;
struct http2_half_private *resp = h2_stream->resp;
enum tfe_stream_action stream_action = ACTION_DROP_DATA;
headers = resp->headers;
if (headers.nvlen <= 0){
goto finish;
}
stream_id = nghttp2_submit_headers(session_info->as_server, headers.flag,
h2_stream->stream_id, NULL, nghttp2_nv_packet(&headers, hdrs),
headers.nvlen, h2_stream);
if (stream_id < 0){
printf("Fatal headers error: %s\n", nghttp2_strerror(stream_id));
stream_action = ACTION_FORWARD_DATA;
}
delete_nv_packet_data(&headers);
if (stream_action == ACTION_DROP_DATA){
xret = nghttp2_session_send(session_info->as_server);
if (xret != 0) {
stream_action = ACTION_FORWARD_DATA;
TFE_LOG_ERROR(logger()->handle, "Fatal upstream send error: %s\n",nghttp2_strerror(xret));
}
}
finish:
session_info->stream_action = stream_action;
return 0;
}
static int
submit_end_data(struct tfe_session_info_t *session_info,
struct h2_stream_data_t *h2_stream)
{
int xret = -1;
enum tfe_stream_action stream_action = ACTION_DROP_DATA;
struct http2_half_private *resp = h2_stream->resp;
if (resp->body_state == MANAGE_STAGE_INIT){
nghttp2_end_submit_header2(session_info, h2_stream);
//return 1;
}
if (resp->body_state != MANAGE_STAGE_INIT){
if (resp->event_cb) {
resp->event_cb(resp, EV_HTTP_RESP_BODY_END, NULL, 0,
resp->event_cb_user);
}
if (resp->event_cb) {
resp->event_cb(resp, EV_HTTP_RESP_END, NULL, 0,
resp->event_cb_user);
}
}
struct data_t *body = &resp->body;
body->flags |= NGHTTP2_FLAG_END_STREAM;
resp->body_state = MANAGE_STAGE_COMPLETE;
resp->message_state = MANAGE_STAGE_COMPLETE;
stream_action = server_frame_submit_data(session_info, h2_stream, CONN_DIR_UPSTREAM);
if (stream_action == ACTION_DROP_DATA){
xret = nghttp2_session_send(session_info->as_server);
if (xret != 0) {
stream_action = ACTION_FORWARD_DATA;
TFE_LOG_ERROR(logger()->handle, "Fatal upstream send error: %s\n",nghttp2_strerror(xret));
}
}
TFE_LOG_INFO(logger()->handle, "%s, 1, End of stream submit, stream_id:%d, action:%d", session_info->tf_stream->str_stream_info,
h2_stream->stream_id, session_info->stream_action);
if (stream_action == ACTION_USER_DATA)
stream_action = ACTION_DROP_DATA;
session_info->stream_action = stream_action;
return 1;
}
static int
nghttp2_submit_frame_data(struct tfe_session_info_t *session_info,const nghttp2_frame *frame,
enum tfe_conn_dir dir)
{
struct http2_half_private *resp = NULL;
@@ -1032,6 +1114,7 @@ nghttp2_set_padlen(struct tfe_session_info_t *session_info,const nghttp2_frame *
if (dir == CONN_DIR_DOWNSTREAM)
goto finish;
if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM){
h2_stream = (struct h2_stream_data_t *)nghttp2_session_get_stream_user_data(session_info->as_client,
frame->hd.stream_id);
@@ -1042,8 +1125,10 @@ nghttp2_set_padlen(struct tfe_session_info_t *session_info,const nghttp2_frame *
}
resp = h2_stream->resp;
resp->body.padlen = frame->data.padlen;
if (resp->body_state != MANAGE_STAGE_COMPLETE){
submit_end_data(session_info, h2_stream);
}
}
finish:
return 0;
}
@@ -1303,42 +1388,6 @@ nghttp2_headers_write_log(struct h2_stream_data_t *h2_stream, const char * str_s
return 0;
}
static int
nghttp2_end_submit_header2(struct tfe_session_info_t *session_info,
struct h2_stream_data_t *h2_stream)
{
int xret = -1;
int32_t stream_id = 0;
nghttp2_nv hdrs[128] = {0};
struct http2_headers headers;
struct http2_half_private *resp = h2_stream->resp;
enum tfe_stream_action stream_action = ACTION_DROP_DATA;
headers = resp->headers;
if (headers.nvlen <= 0){
goto finish;
}
stream_id = nghttp2_submit_headers(session_info->as_server, headers.flag,
h2_stream->stream_id, NULL, nghttp2_nv_packet(&headers, hdrs),
headers.nvlen, h2_stream);
if (stream_id < 0){
printf("Fatal headers error: %s\n", nghttp2_strerror(stream_id));
stream_action = ACTION_FORWARD_DATA;
}
delete_nv_packet_data(&headers);
if (stream_action == ACTION_DROP_DATA){
xret = nghttp2_session_send(session_info->as_server);
if (xret != 0) {
stream_action = ACTION_FORWARD_DATA;
TFE_LOG_ERROR(logger()->handle, "Fatal upstream send error: %s\n",nghttp2_strerror(xret));
}
}
finish:
session_info->stream_action = stream_action;
return 0;
}
static int
nghttp2_server_submit_header(struct tfe_session_info_t *session_info, int32_t stream_id)
{
@@ -1649,7 +1698,7 @@ nghttp2_submit_frame_header(struct tfe_session_info_t *session_info,const nghttp
}
nghttp2_frame_callback nghttp2_frame_callback_array[] = {
[NGHTTP2_DATA] = nghttp2_set_padlen,
[NGHTTP2_DATA] = nghttp2_submit_frame_data,
[NGHTTP2_HEADERS] = nghttp2_submit_frame_header,
[NGHTTP2_PRIORITY] = nghttp2_submit_frame_priority,
[NGHTTP2_RST_STREAM] = nghttp2_submit_frame_rst_stream,
@@ -1766,58 +1815,11 @@ nghttp2_data_send(nghttp2_session *session, const nghttp2_frame *frame, const ui
return (ssize_t)length;
}
static int
submit_end_data(struct tfe_session_info_t *session_info,
struct h2_stream_data_t *h2_stream)
{
int xret = -1;
enum tfe_stream_action stream_action = ACTION_DROP_DATA;
struct http2_half_private *resp = h2_stream->resp;
if (resp->body_state == MANAGE_STAGE_INIT){
nghttp2_end_submit_header2(session_info, h2_stream);
//return 1;
}
if (resp->body_state != MANAGE_STAGE_INIT){
if (resp->event_cb) {
resp->event_cb(resp, EV_HTTP_RESP_BODY_END, NULL, 0,
resp->event_cb_user);
}
if (resp->event_cb) {
resp->event_cb(resp, EV_HTTP_RESP_END, NULL, 0,
resp->event_cb_user);
}
}
struct data_t *body = &resp->body;
body->flags |= NGHTTP2_FLAG_END_STREAM;
resp->body_state = MANAGE_STAGE_COMPLETE;
resp->message_state = MANAGE_STAGE_COMPLETE;
stream_action = server_frame_submit_data(session_info, h2_stream, CONN_DIR_UPSTREAM);
if (stream_action == ACTION_DROP_DATA){
xret = nghttp2_session_send(session_info->as_server);
if (xret != 0) {
stream_action = ACTION_FORWARD_DATA;
TFE_LOG_ERROR(logger()->handle, "Fatal upstream send error: %s\n",nghttp2_strerror(xret));
}
}
TFE_LOG_INFO(logger()->handle, "%s, 1, End of stream submit, stream_id:%d, action:%d", session_info->tf_stream->str_stream_info,
h2_stream->stream_id, session_info->stream_action);
if (stream_action == ACTION_USER_DATA)
stream_action = ACTION_DROP_DATA;
session_info->stream_action = stream_action;
return 1;
}
static int
nghttp2_on_stream_close(nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name,
size_t namelen, const uint8_t *value,
size_t valuelen, uint8_t flags, void *user_data, enum tfe_conn_dir dir)
{
int xret = -1;
struct h2_stream_data_t *h2_stream = NULL;
struct http2_half_private *resp = NULL;
@@ -1839,8 +1841,8 @@ nghttp2_on_stream_close(nghttp2_session *session, const nghttp2_frame *frame, co
resp = h2_stream->resp;
if (error_code == 0 && resp->body_state != MANAGE_STAGE_COMPLETE){
xret = submit_end_data(session_info, h2_stream);
if (xret == 1)
if (resp->body_state == MANAGE_STAGE_INIT)
nghttp2_end_submit_header2(session_info, h2_stream);
goto end;
}
finish: