diff --git a/platform/src/tcp_stream.cpp b/platform/src/tcp_stream.cpp index 986dab3..b115476 100644 --- a/platform/src/tcp_stream.cpp +++ b/platform/src/tcp_stream.cpp @@ -155,6 +155,7 @@ struct tfe_stream_write_ctx * tfe_stream_write_frag_start(const struct tfe_strea { return NULL; } + this_conn->w_ctx.dir = dir; this_conn->w_ctx._stream = _stream; this_conn->on_writing = 1; diff --git a/plugin/protocol/http/src/http_entry.cpp b/plugin/protocol/http/src/http_entry.cpp index aa9c82e..6769875 100644 --- a/plugin/protocol/http/src/http_entry.cpp +++ b/plugin/protocol/http/src/http_entry.cpp @@ -87,9 +87,15 @@ static int __write_http_half_to_line(const struct tfe_stream * stream, * and has been call body_begin, construct the header */ if (hf_private->evbuf_body != NULL && hf_private->write_ctx == NULL) { - /* Alloc stream write ctx */ - hf_private->write_ctx = tfe_stream_write_frag_start(stream, dir); - if (unlikely(hf_private->write_ctx == NULL)) return -1; + printf("frag write start, stream = %p, hf_private = %p\n", stream, hf_private); + + /* Still need to send data(not call body_end()), need to write frag start + * Otherwise, means the body is ready, send out directly without frag */ + if(hf_private->message_status < STATUS_COMPLETE) + { + hf_private->write_ctx = tfe_stream_write_frag_start(stream, dir); + assert(hf_private->write_ctx != NULL); + } ret = __write_http_half(hf_private, stream, dir); if (unlikely(ret < 0)) return ret; diff --git a/plugin/protocol/http/src/http_half.cpp b/plugin/protocol/http/src/http_half.cpp index af3a836..d208c64 100644 --- a/plugin/protocol/http/src/http_half.cpp +++ b/plugin/protocol/http/src/http_half.cpp @@ -656,6 +656,8 @@ int hf_ops_body_end(struct tfe_http_half * half) hf_private->body_status = STATUS_COMPLETE; hf_private->message_status = STATUS_COMPLETE; + + printf("frag write end, stream = %p, hf_private = %p\n", hf_private->session->hc_private->stream, hf_private); return 0; } @@ -853,6 +855,7 @@ void hs_ops_response_set(struct tfe_http_session * session, struct tfe_http_half assert(hs_private->hf_private_resp_user == NULL); hs_private->hf_private_resp_user = hf_private; + hf_private->session = hs_private; } struct tfe_http_half * hs_ops_request_create(struct tfe_http_session * session,