def encodeString()

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