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