All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.finagle.http-netty4.Bijections.scala Maven / Gradle / Ivy

The newest version!
package com.twitter.finagle.http4

import com.twitter.finagle.http.HeaderMap
import com.twitter.finagle.netty4.{ByteBufAsBuf, BufAsByteBuf}
import com.twitter.finagle.{http => FinagleHttp}
import io.netty.handler.codec.{http => NettyHttp}

private[http4] object Bijections {

  object netty {
    def headersToFinagle(headers: NettyHttp.HttpHeaders): FinagleHttp.HeaderMap =
      new Netty4HeaderMap(headers)

    def versionToFinagle(v: NettyHttp.HttpVersion): FinagleHttp.Version = v match {
      case NettyHttp.HttpVersion.HTTP_1_0 => FinagleHttp.Version.Http10
      case NettyHttp.HttpVersion.HTTP_1_1 => FinagleHttp.Version.Http11
      case _ => FinagleHttp.Version.Http11
    }

    def methodToFinagle(m: NettyHttp.HttpMethod): FinagleHttp.Method =
      FinagleHttp.Method(m.name)

    def statusToFinagle(s: NettyHttp.HttpResponseStatus): FinagleHttp.Status =
      FinagleHttp.Status.fromCode(s.code)

    def requestToFinagle(r: NettyHttp.FullHttpRequest): FinagleHttp.Request = {
      val result = FinagleHttp.Request(
        method = methodToFinagle(r.method),
        uri = r.uri,
        version = versionToFinagle(r.protocolVersion)
      )
      writeNettyHeadersToFinagle(r.headers, result.headerMap)
      result.content = ByteBufAsBuf.Owned(r.content)
      result
    }

    private[this] def writeNettyHeadersToFinagle(head: NettyHttp.HttpHeaders, out: HeaderMap): Unit = {
      val itr = head.iteratorAsString()
      while (itr.hasNext) {
        val entry = itr.next()
        out.add(entry.getKey, entry.getValue)
      }
    }

    def responseToFinagle(rep: NettyHttp.HttpResponse): FinagleHttp.Response = rep match {
      case full: NettyHttp.FullHttpResponse =>
        val resp = FinagleHttp.Response(
          versionToFinagle(rep.protocolVersion),
          statusToFinagle(rep.status)
        )
        writeNettyHeadersToFinagle(rep.headers, resp.headerMap)
        resp.content = ByteBufAsBuf.Owned(full.content)

        resp

      // note: HttpContent chunks are handled in the dispatcher
      case invalid =>
        throw new IllegalArgumentException("unexpected response type: " + invalid.toString)
    }
  }

  object finagle {

    def headersToNetty(h: FinagleHttp.HeaderMap): NettyHttp.HttpHeaders = h match {
      case map: Netty4HeaderMap =>
        map.underlying

      case _ =>
        val result = new NettyHttp.DefaultHttpHeaders()
        h.foreach { case (k,v) =>
          result.add(k, v)
        }
        result
    }

    def statusToNetty(s: FinagleHttp.Status): NettyHttp.HttpResponseStatus =
      NettyHttp.HttpResponseStatus.valueOf(s.code)

    def versionToNetty(v: FinagleHttp.Version): NettyHttp.HttpVersion = v match {
      case FinagleHttp.Version.Http10 => NettyHttp.HttpVersion.HTTP_1_0
      case FinagleHttp.Version.Http11 => NettyHttp.HttpVersion.HTTP_1_1
    }

    def responseToNetty(r: FinagleHttp.Response): NettyHttp.FullHttpResponse =
      new NettyHttp.DefaultFullHttpResponse(
        versionToNetty(r.version),
        statusToNetty(r.status),
        BufAsByteBuf.Owned(r.content),
        headersToNetty(r.headerMap),
        NettyHttp.EmptyHttpHeaders.INSTANCE // only chunked messages have trailing headers
      )

    def methodToNetty(m: FinagleHttp.Method): NettyHttp.HttpMethod =
      NettyHttp.HttpMethod.valueOf(m.toString)

    def requestToNetty(r: FinagleHttp.Request): NettyHttp.FullHttpRequest =
      new NettyHttp.DefaultFullHttpRequest(
        versionToNetty(r.version),
        methodToNetty(r.method),
        r.uri,
        BufAsByteBuf.Owned(r.content),
        headersToNetty(r.headerMap),
        NettyHttp.EmptyHttpHeaders.INSTANCE // only chunked messages have trailing headers
      )
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy