From dcf8831bb182b90fb4349c47643a0eba2e53a79b Mon Sep 17 00:00:00 2001
From: Kolya Opahle <k.opahle@sap.com>
Date: Fri, 12 Jun 2020 12:44:33 +0200
Subject: [PATCH] Added exception handler for UnknownHostException's (#412)

* Added exception handler for UnknownHostException's

Signed-off-by: Kolya Opahle <k.opahle@sap.com>

* Added a custom CwaWebException conform UnknownHostException

Signed-off-by: Kolya Opahle <k.opahle@sap.com>
---
 .../exception/http/CwaWebException.kt         |  1 +
 .../rki/coronawarnapp/http/HttpErrorParser.kt | 68 +++++++++++--------
 2 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt
index cdbae9456..4925705a4 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt
@@ -27,6 +27,7 @@ open class CwaSuccessResponseWithCodeMismatchNotSupportedError(val statusCode: I
 open class CwaInformationalNotSupportedError(val statusCode: Int) : CwaWebException(statusCode)
 open class CwaRedirectNotSupportedError(val statusCode: Int) : CwaWebException(statusCode)
 
+class CwaUnknownHostException : CwaWebException(901)
 class BadRequestException : CwaClientError(400)
 class UnauthorizedException : CwaClientError(401)
 class ForbiddenException : CwaClientError(403)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt
index 4cda5df1e..dec204307 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpErrorParser.kt
@@ -8,6 +8,7 @@ import de.rki.coronawarnapp.exception.http.CwaInformationalNotSupportedError
 import de.rki.coronawarnapp.exception.http.CwaRedirectNotSupportedError
 import de.rki.coronawarnapp.exception.http.CwaServerError
 import de.rki.coronawarnapp.exception.http.CwaSuccessResponseWithCodeMismatchNotSupportedError
+import de.rki.coronawarnapp.exception.http.CwaUnknownHostException
 import de.rki.coronawarnapp.exception.http.CwaWebException
 import de.rki.coronawarnapp.exception.http.ForbiddenException
 import de.rki.coronawarnapp.exception.http.GatewayTimeoutException
@@ -25,40 +26,47 @@ import de.rki.coronawarnapp.exception.http.UnauthorizedException
 import de.rki.coronawarnapp.exception.http.UnsupportedMediaTypeException
 import okhttp3.Interceptor
 import okhttp3.Response
+import java.net.UnknownHostException
 
 class HttpErrorParser : Interceptor {
     override fun intercept(chain: Interceptor.Chain): Response {
-        val response = chain.proceed(chain.request())
-        return when (val code = response.code) {
-            200 -> response
-            201 -> response
-            202 -> response
-            204 -> response
-            400 -> throw BadRequestException()
-            401 -> throw UnauthorizedException()
-            403 -> throw ForbiddenException()
-            404 -> throw NotFoundException()
-            409 -> throw ConflictException()
-            410 -> throw GoneException()
-            415 -> throw UnsupportedMediaTypeException()
-            429 -> throw TooManyRequestsException()
-            500 -> throw InternalServerErrorException()
-            501 -> throw NotImplementedException()
-            502 -> throw BadGatewayException()
-            503 -> throw ServiceUnavailableException()
-            504 -> throw GatewayTimeoutException()
-            505 -> throw HTTPVersionNotSupported()
-            511 -> throw NetworkAuthenticationRequiredException()
-            598 -> throw NetworkReadTimeoutException()
-            599 -> throw NetworkConnectTimeoutException()
-            else -> {
-                if (code in 100..199) throw CwaInformationalNotSupportedError(code)
-                if (code in 200..299) throw CwaSuccessResponseWithCodeMismatchNotSupportedError(code)
-                if (code in 300..399) throw CwaRedirectNotSupportedError(code)
-                if (code in 400..499) throw CwaClientError(code)
-                if (code in 500..599) throw CwaServerError(code)
-                throw CwaWebException(code)
+        try {
+            val response = chain.proceed(chain.request())
+            return when (val code = response.code) {
+                200 -> response
+                201 -> response
+                202 -> response
+                204 -> response
+                400 -> throw BadRequestException()
+                401 -> throw UnauthorizedException()
+                403 -> throw ForbiddenException()
+                404 -> throw NotFoundException()
+                409 -> throw ConflictException()
+                410 -> throw GoneException()
+                415 -> throw UnsupportedMediaTypeException()
+                429 -> throw TooManyRequestsException()
+                500 -> throw InternalServerErrorException()
+                501 -> throw NotImplementedException()
+                502 -> throw BadGatewayException()
+                503 -> throw ServiceUnavailableException()
+                504 -> throw GatewayTimeoutException()
+                505 -> throw HTTPVersionNotSupported()
+                511 -> throw NetworkAuthenticationRequiredException()
+                598 -> throw NetworkReadTimeoutException()
+                599 -> throw NetworkConnectTimeoutException()
+                else -> {
+                    if (code in 100..199) throw CwaInformationalNotSupportedError(code)
+                    if (code in 200..299) throw CwaSuccessResponseWithCodeMismatchNotSupportedError(
+                        code
+                    )
+                    if (code in 300..399) throw CwaRedirectNotSupportedError(code)
+                    if (code in 400..499) throw CwaClientError(code)
+                    if (code in 500..599) throw CwaServerError(code)
+                    throw CwaWebException(code)
+                }
             }
+        } catch (err: UnknownHostException) {
+            throw CwaUnknownHostException()
         }
     }
 }
-- 
GitLab