private[this] def mkTTwitterRequest()

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