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.
---

Reply via email to