Github user masaori335 commented on a diff in the pull request: https://github.com/apache/trafficserver/pull/460#discussion_r53414029 --- Diff: proxy/http2/Http2ConnectionState.cc --- @@ -992,43 +998,50 @@ Http2ConnectionState::send_headers_frame(FetchSM *fetch_sm) DebugHttp2Stream(ua_session, stream->get_id(), "Send HEADERS frame"); - // Write pseudo headers - payload_length += http2_write_psuedo_headers(resp_header, payload_buffer, buf_len, *(this->remote_indexing_table)); - - // If response body is empty, set END_STREAM flag to HEADERS frame - // Must check to ensure content-length is there. Otherwise the value defaults - // to 0 - if (resp_header->presence(MIME_PRESENCE_CONTENT_LENGTH) && resp_header->get_content_length() == 0) { - flags |= HTTP2_FLAGS_HEADERS_END_STREAM; + http2_convert_header_from_1_1_to_2(resp_header); + buf_len = resp_header->length_get() * 2; // Make it double just in case + buf = (uint8_t *)ats_malloc(buf_len); + if (buf == NULL) { + return; + } + header_blocks_size = http2_encode_header_blocks(resp_header, buf, buf_len, *(this->remote_hpack_handle)); + if (header_blocks_size < 0) { + ats_free(buf); + return; } - MIMEFieldIter field_iter; - bool cont = false; - do { - // Handle first sending frame is as HEADERS - Http2FrameType type = cont ? HTTP2_FRAME_TYPE_CONTINUATION : HTTP2_FRAME_TYPE_HEADERS; - - // Encode by HPACK naive - payload_length += http2_write_header_fragment(resp_header, field_iter, payload_buffer + payload_length, - buf_len - payload_length, *(this->remote_indexing_table), cont); - - // If buffer size is enough to send rest of headers, set END_HEADERS flag - if (buf_len >= payload_length && !cont) { - flags |= HTTP2_FLAGS_HEADERS_END_HEADERS; - } - - // Create HEADERS or CONTINUATION frame - Http2Frame headers(type, stream->get_id(), flags); - headers.alloc(buffer_size_index[type]); - http2_write_headers(payload_buffer, payload_length, headers.write()); + // Send a HEADERS frame + if (header_blocks_size <= BUFFER_SIZE_FOR_INDEX(buffer_size_index[HTTP2_FRAME_TYPE_HEADERS]) - HTTP2_FRAME_HEADER_LEN) { + payload_length = header_blocks_size; + flags |= HTTP2_FLAGS_HEADERS_END_HEADERS; + } else { + payload_length = BUFFER_SIZE_FOR_INDEX(buffer_size_index[HTTP2_FRAME_TYPE_HEADERS]) - HTTP2_FRAME_HEADER_LEN; + } + Http2Frame headers(HTTP2_FRAME_TYPE_HEADERS, stream->get_id(), flags); + headers.alloc(buffer_size_index[HTTP2_FRAME_TYPE_HEADERS]); + http2_write_headers(buf, payload_length, headers.write()); + headers.finalize(payload_length); + // xmit event + SCOPED_MUTEX_LOCK(lock, this->ua_session->mutex, this_ethread()); + this->ua_session->handleEvent(HTTP2_SESSION_EVENT_XMIT, &headers); + sent += payload_length; + + // Send CONTINUATION frames + while (sent < header_blocks_size) { + DebugSsn(this->ua_session, "http2_cs", "[%" PRId64 "] Send CONTINUATION frame.", this->ua_session->connection_id()); --- End diff -- It is better to use `DebugHttp2Stream`.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---