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));
}
}