in finagle-mux/src/main/scala/com/twitter/finagle/mux/transport/Message.scala [444:508]
def encodeString(str: String): Buf = Buf.Utf8(str)
private def decodeTreq(tag: Int, br: ByteReader): Treq = {
if (br.remaining < 1)
throwBadMessageException("short Treq")
var nkeys = br.readByte().toInt
if (nkeys < 0)
throwBadMessageException("Treq: too many keys")
var trace3: Option[(SpanId, SpanId, SpanId)] = None
var traceFlags = 0L
while (nkeys > 0) {
if (br.remaining < 2)
throwBadMessageException("short Treq (header)")
val key = br.readByte()
val vsize = br.readByte().toInt match {
case s if s < 0 => s + 256
case s => s
}
if (br.remaining < vsize)
throwBadMessageException("short Treq (vsize)")
// TODO: technically we should probably check for duplicate
// keys, but for now, just pick the latest one.
key match {
// NOTE: Treq is deprecated and therefore won't support 128bit TraceID. see Tdispatch/Rdispatch.
case Treq.Keys.TraceId =>
if (vsize != 24)
throwBadMessageException(s"bad traceid size $vsize")
trace3 = Some(
(
SpanId(br.readLongBE()), // spanId
SpanId(br.readLongBE()), // parentId
SpanId(br.readLongBE())
) // traceId
)
case Treq.Keys.TraceFlag =>
// We only know about bit=0, so discard
// everything but the last byte
if (vsize > 1)
br.readBytes(vsize - 1)
if (vsize > 0)
traceFlags = br.readByte().toLong
case _ =>
// discard:
br.readBytes(vsize)
}
nkeys -= 1
}
val id = trace3 match {
case Some((spanId, parentId, traceId)) =>
Some(TraceId(Some(traceId), Some(parentId), spanId, None, Flags(traceFlags)))
case None => None
}
Treq(tag, id, br.readAll())
}