1.修复规则命中后,请求端half未初始化

This commit is contained in:
fengweihao
2019-06-11 17:38:50 +08:00
parent 77eb5505e0
commit 104fe5af71

View File

@@ -144,7 +144,7 @@ tfe_h2_header_modify_field(struct tfe_h2_header *header, nghttp2_nv *hdrs, const
struct tfe_h2_field *h2_field = NULL, *peer_h2_field = NULL; struct tfe_h2_field *h2_field = NULL, *peer_h2_field = NULL;
TAILQ_FOREACH_SAFE(h2_field, &header->h2_field_list, next, peer_h2_field) TAILQ_FOREACH_SAFE(h2_field, &header->h2_field_list, next, peer_h2_field)
{ {
hdrs[nvlen].name = h2_field->nv.name; hdrs[nvlen].name = h2_field->nv.name;
hdrs[nvlen].namelen = h2_field->nv.namelen; hdrs[nvlen].namelen = h2_field->nv.namelen;
if (filed_value && (0==strcasecmp((const char*)h2_field->nv.name, field_name))) if (filed_value && (0==strcasecmp((const char*)h2_field->nv.name, field_name)))
@@ -442,7 +442,7 @@ void delete_stream_half_data(struct tfe_h2_half_private **data,
delete_nv_packet_data(&((*data)->header)); delete_nv_packet_data(&((*data)->header));
if (dir == CONN_DIR_DOWNSTREAM) if (dir == CONN_DIR_DOWNSTREAM)
{ {
struct tfe_http_req_spec *req_spec = &((*data)->half_public.req_spec); struct tfe_http_req_spec *req_spec = &((*data)->half_public.req_spec);
delete_http_req_spec(req_spec); delete_http_req_spec(req_spec);
} }
@@ -677,7 +677,7 @@ upstream_read_callback(nghttp2_session *session, int32_t stream_id,
ssize_t datalen = 0, inputlen=0; ssize_t datalen = 0, inputlen=0;
struct tfe_h2_payload *to_send_body = (struct tfe_h2_payload *)source->ptr; struct tfe_h2_payload *to_send_body = (struct tfe_h2_payload *)source->ptr;
if (!to_send_body->evbuf_body || 0==(inputlen = evbuffer_get_length(to_send_body->evbuf_body)) if (!to_send_body->evbuf_body || 0==(inputlen = evbuffer_get_length(to_send_body->evbuf_body))
||!(input = evbuffer_pullup(to_send_body->evbuf_body, MIN(length, inputlen)))) ||!(input = evbuffer_pullup(to_send_body->evbuf_body, MIN(length, inputlen))))
{ {
if ((to_send_body->flags & NGHTTP2_FLAG_END_STREAM) == 0) if ((to_send_body->flags & NGHTTP2_FLAG_END_STREAM) == 0)
@@ -771,7 +771,7 @@ nghttp2_frame_submit_built_req(struct tfe_h2_stream *h2_stream_info,
stream_id = nghttp2_submit_request(h2_stream_info->as_client, NULL, stream_id = nghttp2_submit_request(h2_stream_info->as_client, NULL,
tfe_h2_header_modify_field(h2_header, hdrs, ":path", plugin_built_req->url_storage), tfe_h2_header_modify_field(h2_header, hdrs, ":path", plugin_built_req->url_storage),
h2_header->nvlen, &data_prd, h2_session); h2_header->nvlen, &data_prd, h2_session);
if (stream_id < 0){ if (stream_id < 0){
TFE_LOG_ERROR(logger()->handle, "Could not submit request: %s", TFE_LOG_ERROR(logger()->handle, "Could not submit request: %s",
nghttp2_strerror(stream_id)); nghttp2_strerror(stream_id));
@@ -1138,12 +1138,12 @@ nghttp2_submit_complete_data(struct tfe_h2_stream *h2_stream_info,
{ {
int xret = -1; int xret = -1;
enum tfe_stream_action stream_action = ACTION_DROP_DATA; enum tfe_stream_action stream_action = ACTION_DROP_DATA;
struct tfe_h2_half_private *h2_half = tfe_h2_stream_get_half(h2_session, dir); struct tfe_h2_half_private *h2_half = tfe_h2_stream_get_half(h2_session, dir);
nghttp2_session *ngh2_session = tfe_h2_stream_get_nghttp2_session(h2_stream_info, dir); nghttp2_session *ngh2_session = tfe_h2_stream_get_nghttp2_session(h2_stream_info, dir);
enum tfe_http_event http_body_event = (dir==CONN_DIR_UPSTREAM?EV_HTTP_RESP_BODY_END: EV_HTTP_REQ_BODY_END); enum tfe_http_event http_body_event = (dir==CONN_DIR_UPSTREAM?EV_HTTP_RESP_BODY_END: EV_HTTP_REQ_BODY_END);
enum tfe_http_event http_event = (dir==CONN_DIR_UPSTREAM?EV_HTTP_RESP_END: EV_HTTP_REQ_END); enum tfe_http_event http_event = (dir==CONN_DIR_UPSTREAM?EV_HTTP_RESP_END: EV_HTTP_REQ_END);
if (h2_half->body_state != H2_READ_STATE_BEGIN) if (h2_half->body_state != H2_READ_STATE_BEGIN)
@@ -1644,7 +1644,11 @@ nghttp2_client_frame_submit_header(struct tfe_h2_stream *h2_stream_info,
if (req == NULL){ if (req == NULL){
return ACTION_FORWARD_DATA; return ACTION_FORWARD_DATA;
} }
/*Create C' half_private_resp**/
downstream_create_resp(h2_session, h2_stream_info->as_client, h2_stream_info->as_server,
h2_stream_info->tf_stream, h2_stream_info->thread_id);
nghttp2_session_set_next_stream_id(h2_stream_info->as_client, h2_session->ngh2_stream_id);
if (h2_session->plugin_built_resp) if (h2_session->plugin_built_resp)
{ {
stream_action = nghttp2_submit_built_response(h2_stream_info, h2_session); stream_action = nghttp2_submit_built_response(h2_stream_info, h2_session);
@@ -1655,10 +1659,6 @@ nghttp2_client_frame_submit_header(struct tfe_h2_stream *h2_stream_info,
{ {
return ACTION_FORWARD_DATA; return ACTION_FORWARD_DATA;
} }
/*Create C' half_private_resp**/
downstream_create_resp(h2_session, h2_stream_info->as_client, h2_stream_info->as_server,
h2_stream_info->tf_stream, h2_stream_info->thread_id);
nghttp2_session_set_next_stream_id(h2_stream_info->as_client, h2_session->ngh2_stream_id);
nghttp2_nv hdrs[headers->nvlen]; nghttp2_nv hdrs[headers->nvlen];
@@ -1666,7 +1666,7 @@ nghttp2_client_frame_submit_header(struct tfe_h2_stream *h2_stream_info,
if (method == (enum tfe_http_std_method)NGHTTP2_METHOD_POST || if (method == (enum tfe_http_std_method)NGHTTP2_METHOD_POST ||
method == (enum tfe_http_std_method)NGHTTP2_METHOD_PUT){ method == (enum tfe_http_std_method)NGHTTP2_METHOD_PUT){
if (h2_session->plugin_built_req) if (h2_session->plugin_built_req)
{ {
stream_action = (enum tfe_stream_action)ACTION_USER_DATA; stream_action = (enum tfe_stream_action)ACTION_USER_DATA;
return stream_action; return stream_action;
} }
@@ -1878,7 +1878,7 @@ nghttp2_on_stream_close(nghttp2_session *session, const nghttp2_frame *frame, co
h2_stream_info->stream_action != ACTION_DEFER_DATA) h2_stream_info->stream_action != ACTION_DEFER_DATA)
nghttp2_submit_header_by_not_modify(h2_stream_info, h2_session); nghttp2_submit_header_by_not_modify(h2_stream_info, h2_session);
goto end; goto end;
} }
finish: finish:
TAILQ_REMOVE(&h2_stream_info->h2_session_list, h2_session, next); TAILQ_REMOVE(&h2_stream_info->h2_session_list, h2_session, next);
if (h2_session->frame_ctx){ if (h2_session->frame_ctx){
@@ -2239,7 +2239,7 @@ create_serv_stream_data(nghttp2_session *session, int32_t stream_id,
if (half_private->frame_ctx == NULL){ if (half_private->frame_ctx == NULL){
TFE_LOG_ERROR(logger()->handle, "Failed at raising session begin event. "); TFE_LOG_ERROR(logger()->handle, "Failed at raising session begin event. ");
goto finish; goto finish;
} }
h2_session->frame_ctx = half_private->frame_ctx; h2_session->frame_ctx = half_private->frame_ctx;
http_frame_raise_session_begin(half_private->frame_ctx, h2_stream_info->tf_stream, http_frame_raise_session_begin(half_private->frame_ctx, h2_stream_info->tf_stream,
&h2_session->tfe_session, h2_stream_info->thread_id); &h2_session->tfe_session, h2_stream_info->thread_id);