in finagle-thrift/src/main/scala/com/twitter/finagle/thrift/TTwitterClientFilter.scala [40:117]
private[this] def mkTTwitterRequest(baseRequest: ThriftClientRequest): ThriftClientRequest = {
val header = new thrift.RequestHeader
val overriddenClientId = ClientId.overridden
val finalClientId = overriddenClientId.orElse(clientId)
finalClientId match {
case Some(clientId) =>
header.setClient_id(new thrift.ClientId(clientId.name))
case None =>
}
val traceId = Trace.id
header.setSpan_id(traceId.spanId.toLong)
traceId._parentId.foreach { id => header.setParent_span_id(id.toLong) }
header.setTrace_id(traceId.traceId.toLong)
header.setFlags(traceId.flags.toLong)
traceId.sampled match {
case Some(s) => header.setSampled(s)
case None => header.unsetSampled()
}
val contexts = Contexts.broadcast.marshal().iterator
val ctxs = new ArrayList[thrift.RequestContext]()
if (contexts.hasNext) {
while (contexts.hasNext) {
val (k, buf) = contexts.next()
// Note: we need to skip the caller-provided client id here,
// since the existing value is derived from whatever code
// calls into here. This should never happen in practice;
// however if the ClientIdContext handler failed to load for
// some reason, a pass-through context would be used instead.
if (k != ClientId.clientIdCtx.marshalId) {
val c = new thrift.RequestContext(
Buf.ByteBuffer.Owned.extract(k),
Buf.ByteBuffer.Owned.extract(buf)
)
ctxs.add(c)
}
}
}
val finalClientIdBuf = overriddenClientId
.map(id => Buf.Utf8(id.name))
.orElse(clientIdBuf)
finalClientIdBuf match {
case Some(buf) =>
val ctx = new thrift.RequestContext(
Buf.ByteBuffer.Owned.extract(ClientId.clientIdCtx.marshalId),
Buf.ByteBuffer.Owned.extract(buf)
)
ctxs.add(ctx)
case None => // skip
}
if (!ctxs.isEmpty)
header.setContexts(ctxs)
val dtab = Dtab.local
if (dtab.nonEmpty) {
val delegations = new ArrayList[thrift.Delegation](dtab.size)
for (Dentry(src, dst) <- dtab)
delegations.add(new thrift.Delegation(src.show, dst.show))
header.setDelegations(delegations)
}
new ThriftClientRequest(
ByteArrays.concat(
OutputBuffer.messageToArray(header, protocolFactory),
baseRequest.message
),
baseRequest.oneway
)
}