in src/main/scala/com/gu/fastly/api/FastlyApiClient.scala [231:290]
def closeConnectionPool() = AsyncHttpExecutor.close()
private object AsyncHttpExecutor {
private lazy val defaultConfig = new DefaultAsyncHttpClientConfig.Builder()
.setMaxConnections(50)
.setMaxRequestRetry(3)
.setRequestTimeout(Duration.ofMillis(20000))
.build()
private lazy val client = asyncHttpClient(config.getOrElse(defaultConfig))
def close() = client.close()
def execute(apiUrl: String,
method: HttpMethod = GET,
headers: Map[String, String] = Map.empty,
parameters: Map[String, String] = Map.empty,
part: Option[Part] = None) : Future[Response] = {
val request = method match {
case POST => client.preparePost(apiUrl)
case PUT => client.preparePut(apiUrl)
case DELETE => client.prepareDelete(apiUrl)
case GET => client.prepareGet(apiUrl)
}
build(request, headers, parameters, part)
proxyServer.map(request.setProxyServer)
val p = Promise[Response]()
val handler = new AsyncCompletionHandler[Unit] {
def onCompleted(response: Response) = p.complete(Success(response))
}
request.execute(handler)
p.future
}
private def build(request: BoundRequestBuilder,
headers: Map[String, String],
parameters: Map[String, String] = Map.empty,
maybePart: Option[Part] = None): Option[BoundRequestBuilder] = {
headers.foreach {
case (header, value) => request.addHeader(header, value)
}
request.build().getMethod match {
case "GET" =>
import scala.jdk.CollectionConverters.*
val params = parameters.toList.map{case (name, value) => new Param(name, value)}.asJava
request.setQueryParams(params)
case _ =>
val body = parameters.toList.map{case (name, value) => s"$name=$value"}.mkString("&")
request.setBody(body)
maybePart.map { part => request.addBodyPart(part) }
}
headers.get("Host").map(h => request.setVirtualHost(h))
}
}