in mcrouter/ServerOnRequest.h [130:184]
void send(
Callback&& ctx,
Request&& req,
ReplyFunction<Callback, Request> replyFn,
const CaretMessageInfo* headerInfo = nullptr,
const folly::IOBuf* reqBuffer = nullptr) {
/*
* If we don't have an AclChecker specialized
* for this router, don't bother running Acl checks
*/
if constexpr (decltype(aclChecker_)::value) {
if (aclChecker_(std::move(ctx), std::move(req))) {
return;
}
}
// We just reuse buffers iff:
// 1) enablePassThroughMode_ is true.
// 2) headerInfo is not NULL.
// 3) reqBuffer is not NULL.
const folly::IOBuf* reusableRequestBuffer =
(enablePassThroughMode_ && headerInfo) ? reqBuffer : nullptr;
auto rctx = std::make_unique<ServerRequestContext<Callback, Request>>(
std::move(ctx), std::move(req), reusableRequestBuffer);
auto& reqRef = rctx->req;
auto& ctxRef = rctx->ctx;
// if we are reusing the request buffer, adjust the start offset and set
// it to the request.
if (reusableRequestBuffer) {
auto& reqBufferRef = rctx->reqBuffer;
reqBufferRef.trimStart(headerInfo->headerSize);
reqRef.setSerializedBuffer(reqBufferRef);
}
auto cb = [this, sctx = std::move(rctx), replyFn = std::move(replyFn)](
const Request&, ReplyT<Request>&& reply) mutable {
if (remoteThread_) {
eventBase_.runInEventBaseThread([sctx = std::move(sctx),
replyFn = std::move(replyFn),
reply = std::move(reply)]() mutable {
replyFn(std::move(sctx->ctx), std::move(reply), false /* flush */);
});
} else {
replyFn(std::move(sctx->ctx), std::move(reply), false /* flush */);
}
};
folly::Optional<std::string> peerIp;
if (retainSourceIp_ && (peerIp = ctxRef.getPeerSocketAddressStr())) {
client_.send(reqRef, std::move(cb), *peerIp);
} else {
client_.send(reqRef, std::move(cb));
}
}