在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

@@ -825,7 +825,7 @@ nghttp2_submit_frame_settings(struct tfe_session_info_t *session_info,const nght
goto finish; goto finish;
} }
rv = nghttp2_submit_settings(session, settings.hd.flags, rv = nghttp2_submit_settings(session, settings.hd.flags,
nghttp2_iv_packet(settings, iv), settings.niv); nghttp2_iv_packet(settings, iv), settings.niv);
if (rv != 0) { if (rv != 0) {
stream_action = ACTION_FORWARD_DATA; stream_action = ACTION_FORWARD_DATA;
TFE_LOG_ERROR(logger()->handle, "dir(%d), Submit settings error: %s\n", TFE_LOG_ERROR(logger()->handle, "dir(%d), Submit settings error: %s\n",
@@ -1024,26 +1024,111 @@ finish:
} }
static int 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,
enum tfe_conn_dir dir) struct h2_stream_data_t *h2_stream)
{ {
struct http2_half_private *resp = NULL; 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;
struct h2_stream_data_t *h2_stream = NULL; struct h2_stream_data_t *h2_stream = NULL;
if (dir == CONN_DIR_DOWNSTREAM) if (dir == CONN_DIR_DOWNSTREAM)
goto finish; goto finish;
if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM){ 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, h2_stream = (struct h2_stream_data_t *)nghttp2_session_get_stream_user_data(session_info->as_client,
frame->hd.stream_id); frame->hd.stream_id);
if (!h2_stream){ if (!h2_stream){
TFE_LOG_ERROR(logger()->handle, "Upstream id %d, can't find stream information(addr = %p)", TFE_LOG_ERROR(logger()->handle, "Upstream id %d, can't find stream information(addr = %p)",
frame->hd.stream_id, session_info); frame->hd.stream_id, session_info);
goto finish; goto finish;
} }
resp = h2_stream->resp; resp = h2_stream->resp;
resp->body.padlen = frame->data.padlen; resp->body.padlen = frame->data.padlen;
if (resp->body_state != MANAGE_STAGE_COMPLETE){
submit_end_data(session_info, h2_stream);
}
} }
finish: finish:
return 0; return 0;
} }
@@ -1303,42 +1388,6 @@ nghttp2_headers_write_log(struct h2_stream_data_t *h2_stream, const char * str_s
return 0; 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 static int
nghttp2_server_submit_header(struct tfe_session_info_t *session_info, int32_t stream_id) 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_frame_callback nghttp2_frame_callback_array[] = {
[NGHTTP2_DATA] = nghttp2_set_padlen, [NGHTTP2_DATA] = nghttp2_submit_frame_data,
[NGHTTP2_HEADERS] = nghttp2_submit_frame_header, [NGHTTP2_HEADERS] = nghttp2_submit_frame_header,
[NGHTTP2_PRIORITY] = nghttp2_submit_frame_priority, [NGHTTP2_PRIORITY] = nghttp2_submit_frame_priority,
[NGHTTP2_RST_STREAM] = nghttp2_submit_frame_rst_stream, [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; 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 static int
nghttp2_on_stream_close(nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name, nghttp2_on_stream_close(nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name,
size_t namelen, const uint8_t *value, size_t namelen, const uint8_t *value,
size_t valuelen, uint8_t flags, void *user_data, enum tfe_conn_dir dir) 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 h2_stream_data_t *h2_stream = NULL;
struct http2_half_private *resp = NULL; struct http2_half_private *resp = NULL;
@@ -1839,9 +1841,9 @@ nghttp2_on_stream_close(nghttp2_session *session, const nghttp2_frame *frame, co
resp = h2_stream->resp; resp = h2_stream->resp;
if (error_code == 0 && resp->body_state != MANAGE_STAGE_COMPLETE){ if (error_code == 0 && resp->body_state != MANAGE_STAGE_COMPLETE){
xret = submit_end_data(session_info, h2_stream); if (resp->body_state == MANAGE_STAGE_INIT)
if (xret == 1) nghttp2_end_submit_header2(session_info, h2_stream);
goto end; goto end;
} }
finish: finish:
TAILQ_REMOVE(&session_info->list, h2_stream, next); TAILQ_REMOVE(&session_info->list, h2_stream, next);