in proxygen/lib/http/session/HTTPTransaction.cpp [1452:1520]
void HTTPTransaction::resumeIngress() {
VLOG(4) << "resumeIngress request " << *this;
DestructorGuard g(this);
if (!ingressPaused_ || isIngressComplete()) {
VLOG(4) << "can't resume ingress, ingressPaused=" << ingressPaused_
<< ", ingressComplete=" << isIngressComplete()
<< ", inResume_=" << inResume_ << " " << *this;
return;
}
ingressPaused_ = false;
transport_.resumeIngress(this);
if (inResume_) {
VLOG(4) << "skipping recursive resume loop " << *this;
return;
}
inResume_ = true;
SCOPE_EXIT {
updateReadTimeout();
inResume_ = false;
};
if (deferredIngress_ && (maxDeferredIngress_ <= deferredIngress_->size())) {
maxDeferredIngress_ = deferredIngress_->size();
}
// Process any deferred ingress callbacks
// Note: we recheck the ingressPaused_ state because a callback
// invoked by the resumeIngress() call above could have re-paused
// the transaction.
while (!ingressPaused_ && deferredIngress_ && !deferredIngress_->empty()) {
HTTPEvent& callback(deferredIngress_->front());
VLOG(5) << "Processing deferred ingress callback of type "
<< callback.getEvent() << " " << *this;
SCOPE_EXIT {
if (deferredIngress_) {
deferredIngress_->pop();
}
};
switch (callback.getEvent()) {
case HTTPEvent::Type::MESSAGE_BEGIN:
LOG(FATAL) << "unreachable";
break;
case HTTPEvent::Type::HEADERS_COMPLETE:
processIngressHeadersComplete(callback.getHeaders());
break;
case HTTPEvent::Type::BODY: {
unique_ptr<IOBuf> data = callback.getBody();
auto len = data->computeChainDataLength();
INVARIANT(recvWindow_.free(len));
processIngressBody(std::move(data), len);
} break;
case HTTPEvent::Type::CHUNK_HEADER:
processIngressChunkHeader(callback.getChunkLength());
break;
case HTTPEvent::Type::CHUNK_COMPLETE:
processIngressChunkComplete();
break;
case HTTPEvent::Type::TRAILERS_COMPLETE:
processIngressTrailers(callback.getTrailers());
break;
case HTTPEvent::Type::MESSAGE_COMPLETE:
processIngressEOM();
break;
case HTTPEvent::Type::UPGRADE:
processIngressUpgrade(callback.getUpgradeProtocol());
break;
}
}
}