From 93ed3fafeb90b589933ffaeee928b95ca099b35a Mon Sep 17 00:00:00 2001 From: adamw Date: Sun, 16 Jul 2017 10:32:34 +0200 Subject: Renaming the default handler --- .../sttp/HttpConnectionSttpHandler.scala | 128 --------------------- .../sttp/HttpURLConnectionSttpHandler.scala | 128 +++++++++++++++++++++ 2 files changed, 128 insertions(+), 128 deletions(-) delete mode 100644 core/src/main/scala/com/softwaremill/sttp/HttpConnectionSttpHandler.scala create mode 100644 core/src/main/scala/com/softwaremill/sttp/HttpURLConnectionSttpHandler.scala (limited to 'core/src') diff --git a/core/src/main/scala/com/softwaremill/sttp/HttpConnectionSttpHandler.scala b/core/src/main/scala/com/softwaremill/sttp/HttpConnectionSttpHandler.scala deleted file mode 100644 index 50f6d76..0000000 --- a/core/src/main/scala/com/softwaremill/sttp/HttpConnectionSttpHandler.scala +++ /dev/null @@ -1,128 +0,0 @@ -package com.softwaremill.sttp - -import java.io._ -import java.net.HttpURLConnection -import java.nio.channels.Channels -import java.nio.file.Files - -import com.softwaremill.sttp.model._ - -import scala.annotation.tailrec -import scala.io.Source -import scala.collection.JavaConverters._ - -object HttpConnectionSttpHandler extends SttpHandler[Id, Nothing] { - override def send[T](r: Request, - responseAs: ResponseAs[T, Nothing]): Response[T] = { - val c = r.uri.toURL.openConnection().asInstanceOf[HttpURLConnection] - c.setRequestMethod(r.method.m) - r.headers.foreach { case (k, v) => c.setRequestProperty(k, v) } - c.setDoInput(true) - setBody(r.body, c) - - try { - val is = c.getInputStream - readResponse(c, is, responseAs) - } catch { - case _: IOException if c.getResponseCode != -1 => - readResponse(c, c.getErrorStream, responseAs) - } - } - - private def setBody(body: RequestBody, c: HttpURLConnection): Unit = { - if (body != NoBody) c.setDoOutput(true) - - def copyStream(in: InputStream, out: OutputStream): Unit = { - val buf = new Array[Byte](1024) - - @tailrec - def doCopy(): Unit = { - val read = in.read(buf) - if (read != -1) { - out.write(buf, 0, read) - doCopy() - } - } - - doCopy() - } - - body match { - case NoBody => // skip - - case StringBody(b, encoding) => - val writer = new OutputStreamWriter(c.getOutputStream, encoding) - try writer.write(b) - finally writer.close() - - case ByteArrayBody(b) => - c.getOutputStream.write(b) - - case ByteBufferBody(b) => - val channel = Channels.newChannel(c.getOutputStream) - try channel.write(b) - finally channel.close() - - case InputStreamBody(b) => - copyStream(b, c.getOutputStream) - - case PathBody(b) => - Files.copy(b, c.getOutputStream) - - case SerializableBody(f, t) => - setBody(f(t), c) - } - } - - private def readResponse[T]( - c: HttpURLConnection, - is: InputStream, - responseAs: ResponseAs[T, Nothing]): Response[T] = { - - val headers = c.getHeaderFields.asScala.toVector - .filter(_._1 != null) - .flatMap { case (k, vv) => vv.asScala.map((k, _)) } - Response(readResponseBody(is, responseAs), c.getResponseCode, headers) - } - - private def readResponseBody[T](is: InputStream, - responseAs: ResponseAs[T, Nothing]): T = { - def asString(enc: String) = Source.fromInputStream(is, enc).mkString - - responseAs match { - case IgnoreResponse => - @tailrec def consume(): Unit = if (is.read() != -1) consume() - - consume() - - case ResponseAsString(enc) => - asString(enc) - - case ResponseAsByteArray => - val os = new ByteArrayOutputStream - var read = 0 - val buf = new Array[Byte](1024) - - @tailrec - def transfer(): Unit = { - read = is.read(buf, 0, buf.length) - if (read != -1) { - os.write(buf, 0, read) - transfer() - } - } - - transfer() - - os.toByteArray - - case r @ ResponseAsParams(enc) => - r.parse(asString(enc)) - - case ResponseAsStream() => - // only possible when the user requests the response as a stream of - // Nothing. Oh well ... - throw new IllegalStateException() - } - } -} diff --git a/core/src/main/scala/com/softwaremill/sttp/HttpURLConnectionSttpHandler.scala b/core/src/main/scala/com/softwaremill/sttp/HttpURLConnectionSttpHandler.scala new file mode 100644 index 0000000..7fd7220 --- /dev/null +++ b/core/src/main/scala/com/softwaremill/sttp/HttpURLConnectionSttpHandler.scala @@ -0,0 +1,128 @@ +package com.softwaremill.sttp + +import java.io._ +import java.net.HttpURLConnection +import java.nio.channels.Channels +import java.nio.file.Files + +import com.softwaremill.sttp.model._ + +import scala.annotation.tailrec +import scala.io.Source +import scala.collection.JavaConverters._ + +object HttpURLConnectionSttpHandler extends SttpHandler[Id, Nothing] { + override def send[T](r: Request, + responseAs: ResponseAs[T, Nothing]): Response[T] = { + val c = r.uri.toURL.openConnection().asInstanceOf[HttpURLConnection] + c.setRequestMethod(r.method.m) + r.headers.foreach { case (k, v) => c.setRequestProperty(k, v) } + c.setDoInput(true) + setBody(r.body, c) + + try { + val is = c.getInputStream + readResponse(c, is, responseAs) + } catch { + case _: IOException if c.getResponseCode != -1 => + readResponse(c, c.getErrorStream, responseAs) + } + } + + private def setBody(body: RequestBody, c: HttpURLConnection): Unit = { + if (body != NoBody) c.setDoOutput(true) + + def copyStream(in: InputStream, out: OutputStream): Unit = { + val buf = new Array[Byte](1024) + + @tailrec + def doCopy(): Unit = { + val read = in.read(buf) + if (read != -1) { + out.write(buf, 0, read) + doCopy() + } + } + + doCopy() + } + + body match { + case NoBody => // skip + + case StringBody(b, encoding) => + val writer = new OutputStreamWriter(c.getOutputStream, encoding) + try writer.write(b) + finally writer.close() + + case ByteArrayBody(b) => + c.getOutputStream.write(b) + + case ByteBufferBody(b) => + val channel = Channels.newChannel(c.getOutputStream) + try channel.write(b) + finally channel.close() + + case InputStreamBody(b) => + copyStream(b, c.getOutputStream) + + case PathBody(b) => + Files.copy(b, c.getOutputStream) + + case SerializableBody(f, t) => + setBody(f(t), c) + } + } + + private def readResponse[T]( + c: HttpURLConnection, + is: InputStream, + responseAs: ResponseAs[T, Nothing]): Response[T] = { + + val headers = c.getHeaderFields.asScala.toVector + .filter(_._1 != null) + .flatMap { case (k, vv) => vv.asScala.map((k, _)) } + Response(readResponseBody(is, responseAs), c.getResponseCode, headers) + } + + private def readResponseBody[T](is: InputStream, + responseAs: ResponseAs[T, Nothing]): T = { + def asString(enc: String) = Source.fromInputStream(is, enc).mkString + + responseAs match { + case IgnoreResponse => + @tailrec def consume(): Unit = if (is.read() != -1) consume() + + consume() + + case ResponseAsString(enc) => + asString(enc) + + case ResponseAsByteArray => + val os = new ByteArrayOutputStream + var read = 0 + val buf = new Array[Byte](1024) + + @tailrec + def transfer(): Unit = { + read = is.read(buf, 0, buf.length) + if (read != -1) { + os.write(buf, 0, read) + transfer() + } + } + + transfer() + + os.toByteArray + + case r @ ResponseAsParams(enc) => + r.parse(asString(enc)) + + case ResponseAsStream() => + // only possible when the user requests the response as a stream of + // Nothing. Oh well ... + throw new IllegalStateException() + } + } +} -- cgit v1.2.3