def encode()

in finagle-netty4-http/src/main/scala/com/twitter/finagle/netty4/http/Netty4FormPostEncoder.scala [42:110]


  def encode(config: RequestConfig, multipart: Boolean): Request = {
    val dataFactory = new DefaultHttpDataFactory( /*useDisk*/ false) // we don't use disk

    val netty4Request = makeNetty4Request(config)
    // This request should *not* be a FullHttpRequest.
    if (netty4Request.isInstanceOf[FullHttpRequest]) {
      throw new IllegalStateException(
        s"Unexpected state: Expected the generated request to NOT" +
          s"be a full request: ${netty4Request.getClass.getSimpleName}"
      )
    }

    val encoder = new HttpPostRequestEncoder(dataFactory, netty4Request, multipart)
    try {
      config.formElements.foreach {
        case FileElement(name, content, contentType, filename, isText) =>
          addBodyFileUpload(
            encoder = encoder,
            factory = dataFactory,
            request = netty4Request,
            name = name,
            filename = filename.getOrElse(""),
            content = content,
            contentType = contentType.orNull,
            isText = isText
          )

        case SimpleElement(name, value) =>
          encoder.addBodyAttribute(name, value)
      }

      val encodedReq = encoder.finalizeRequest()

      // We're not going to send anything Transfer-Encoding: chunked, so strip any headers
      if (HttpUtil.isTransferEncodingChunked(encodedReq)) {
        val encodings = encodedReq.headers.getAll(Fields.TransferEncoding)
        if (encodings.contains("chunked")) {
          if (encodings.size == 1) {
            // only chunked, so we can just remove the header
            encodedReq.headers.remove(Fields.TransferEncoding)
          } else {
            val newList = new java.util.ArrayList[String](encodings.size - 1)
            val it = encodings.iterator()
            while (it.hasNext) it.next() match {
              case "chunked" => // nop
              case o => newList.add(o)
            }
            encodedReq.headers.set(Fields.TransferEncoding, newList)
          }
        }
      }

      encodedReq match {
        case fullReq: FullHttpRequest =>
          val req = Bijections.netty.fullRequestToFinagle(fullReq, new InetSocketAddress(0))
          req.contentLength match {
            case None => req.contentLength = req.content.length
            case Some(_) => // nop: already set
          }
          req

        case other =>
          val body = collectBodyFromEncoder(encoder)
          chunkedReqToFinagle(other, body)
      }
    } finally {
      encoder.close()
    }
  }