From 4cdd95b37e969741bce70e2735200362e86ff41c Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 6 Jun 2017 18:00:04 +0200 Subject: [PATCH] Really close http connections --- cache/src/main/scala/coursier/Cache.scala | 38 ++++++++----------- .../coursier/cli/scaladex/Scaladex.scala | 2 +- project/HttpUtil.scala | 5 ++- .../FallbackDependenciesRepository.scala | 8 ++-- 4 files changed, 23 insertions(+), 30 deletions(-) diff --git a/cache/src/main/scala/coursier/Cache.scala b/cache/src/main/scala/coursier/Cache.scala index f98842bb4..88aa8abe1 100644 --- a/cache/src/main/scala/coursier/Cache.scala +++ b/cache/src/main/scala/coursier/Cache.scala @@ -31,6 +31,16 @@ trait AuthenticatedURLConnection extends URLConnection { object Cache { + private[coursier] def closeConn(conn: URLConnection): Unit = { + Try(conn.getInputStream).toOption.filter(_ != null).foreach(_.close()) + conn match { + case conn0: HttpURLConnection => + Try(conn0.getErrorStream).toOption.filter(_ != null).foreach(_.close()) + conn0.disconnect() + case _ => + } + } + // java.nio.charset.StandardCharsets.UTF_8 not available in Java 6 private val UTF_8 = Charset.forName("UTF-8") @@ -398,12 +408,7 @@ object Cache { } catch { case NonFatal(e) => if (conn != null) - conn match { - case conn0: HttpURLConnection => - conn0.getInputStream.close() - conn0.disconnect() - case _ => - } + closeConn(conn) throw e } } @@ -448,11 +453,7 @@ object Cache { } } finally { if (conn != null) - conn match { - case conn0: HttpURLConnection => - conn0.disconnect() - case _ => - } + closeConn(conn) } } @@ -535,11 +536,7 @@ object Cache { } } finally { if (conn != null) - conn match { - case conn0: HttpURLConnection => - conn0.disconnect() - case _ => - } + closeConn(conn) } } } @@ -673,8 +670,7 @@ object Cache { ackRange.startsWith(s"bytes $alreadyDownloaded-") || { // unrecognized Content-Range header -> start a new connection with no resume - conn0.getInputStream.close() - conn0.disconnect() + closeConn(conn) conn = urlConnection(url, artifact.authentication) false } @@ -719,11 +715,7 @@ object Cache { } } finally { if (conn != null) - conn match { - case conn0: HttpURLConnection => - conn0.disconnect() - case _ => - } + closeConn(conn) } } diff --git a/cli/src/main/scala-2.11/coursier/cli/scaladex/Scaladex.scala b/cli/src/main/scala-2.11/coursier/cli/scaladex/Scaladex.scala index 767415c57..677667021 100644 --- a/cli/src/main/scala-2.11/coursier/cli/scaladex/Scaladex.scala +++ b/cli/src/main/scala-2.11/coursier/cli/scaladex/Scaladex.scala @@ -45,7 +45,7 @@ object Scaladex { coursier.Platform.readFullySync(conn.getInputStream) } finally { if (conn != null) - conn.disconnect() + coursier.Cache.closeConn(conn) } new String(b, StandardCharsets.UTF_8).right[String] diff --git a/project/HttpUtil.scala b/project/HttpUtil.scala index 60ce53818..1bff37b4f 100644 --- a/project/HttpUtil.scala +++ b/project/HttpUtil.scala @@ -44,8 +44,11 @@ object HttpUtil { } finally { if (is != null) is.close() - if (httpConn != null) + if (httpConn != null) { + scala.util.Try(httpConn.getInputStream).filter(_ != null).foreach(_.close()) + scala.util.Try(httpConn.getErrorStream).filter(_ != null).foreach(_.close()) httpConn.disconnect() + } } } diff --git a/sbt-coursier/src/main/scala/coursier/FallbackDependenciesRepository.scala b/sbt-coursier/src/main/scala/coursier/FallbackDependenciesRepository.scala index 172baa4a8..9319967ba 100644 --- a/sbt-coursier/src/main/scala/coursier/FallbackDependenciesRepository.scala +++ b/sbt-coursier/src/main/scala/coursier/FallbackDependenciesRepository.scala @@ -38,7 +38,7 @@ object FallbackDependenciesRepository { None } finally { if (conn != null) - conn.disconnect() + coursier.Cache.closeConn(conn) } case _ => None @@ -55,10 +55,8 @@ object FallbackDependenciesRepository { case _: IOException => false } finally { - conn match { - case conn0: HttpURLConnection => conn0.disconnect() - case _ => - } + if (conn != null) + coursier.Cache.closeConn(conn) } } }