void HTTPTransaction::onIngressHeadersComplete()

in proxygen/lib/http/session/HTTPTransaction.cpp [194:242]


void HTTPTransaction::onIngressHeadersComplete(
    std::unique_ptr<HTTPMessage> msg) {
  DestructorGuard g(this);
  msg->setSeqNo(seqNo_);
  if (isUpstream() && !isPushed() && msg->isResponse()) {
    lastResponseStatus_ = msg->getStatusCode();
  }
  if (!validateIngressStateTransition(
          HTTPTransactionIngressSM::Event::onHeaders)) {
    return;
  }
  if (msg->isRequest()) {
    headRequest_ = (msg->getMethod() == HTTPMethod::HEAD);
  }

  if ((msg->isRequest() && msg->getMethod() != HTTPMethod::CONNECT) ||
      (msg->isResponse() && !headRequest_ &&
       !RFC2616::responseBodyMustBeEmpty(msg->getStatusCode()))) {
    // CONNECT payload has no defined semantics
    const auto& contentLen =
        msg->getHeaders().getSingleOrEmpty(HTTP_HEADER_CONTENT_LENGTH);
    if (!contentLen.empty()) {
      try {
        expectedIngressContentLengthRemaining_ =
            folly::to<uint64_t>(contentLen);
      } catch (const folly::ConversionError& ex) {
        LOG(ERROR) << "Invalid content-length: " << contentLen
                   << ", ex=" << ex.what() << " " << *this;
      }
      if (expectedIngressContentLengthRemaining_) {
        expectedIngressContentLength_ =
            expectedIngressContentLengthRemaining_.value();
      }
    }
  }
  if (transportCallback_) {
    transportCallback_->headerBytesReceived(msg->getIngressHeaderSize());
  }
  updateIngressCompressionInfo(transport_.getCodec().getCompressionInfo());
  if (mustQueueIngress()) {
    checkCreateDeferredIngress();
    deferredIngress_->emplace(
        id_, HTTPEvent::Type::HEADERS_COMPLETE, std::move(msg));
    VLOG(4) << "Queued ingress event of type "
            << HTTPEvent::Type::HEADERS_COMPLETE << " " << *this;
  } else {
    processIngressHeadersComplete(std::move(msg));
  }
}