Skip to content
Snippets Groups Projects
Unverified Commit 661d092c authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

When http errors occur, try to log the error message. (#1720)

If the http error request fails without status code, log the cause.
parent 912f2be4
No related branches found
No related tags found
No related merge requests found
......@@ -3,46 +3,77 @@ package de.rki.coronawarnapp.exception.http
import de.rki.coronawarnapp.exception.reporting.ErrorCodes
import de.rki.coronawarnapp.exception.reporting.ReportedIOException
open class CwaWebException(val statusCode: Int) : ReportedIOException(
ErrorCodes.CWA_WEB_REQUEST_PROBLEM.code, "error during web request, http status $statusCode"
open class CwaWebException(
val statusCode: Int,
message: String?,
cause: Throwable? = null
) : ReportedIOException(
code = ErrorCodes.CWA_WEB_REQUEST_PROBLEM.code,
message = "Error during web request: code=$statusCode message=$message",
cause = cause
)
open class CwaServerError(statusCode: Int) : CwaWebException(statusCode) {
open class CwaServerError(
statusCode: Int,
message: String?,
cause: Throwable? = null
) : CwaWebException(
statusCode = statusCode,
message = message,
cause = cause
) {
init {
if (statusCode !in 500..599)
throw IllegalArgumentException("a server error has to have code 5xx")
if (statusCode !in 500..599) {
throw IllegalArgumentException("Invalid HTTP server error code $statusCode (!= 5xx)")
}
}
}
open class CwaClientError(statusCode: Int) : CwaWebException(statusCode) {
open class CwaClientError(
statusCode: Int,
message: String?,
cause: Throwable? = null
) : CwaWebException(
statusCode = statusCode,
message = message,
cause = cause
) {
init {
if (statusCode !in 400..499)
throw IllegalArgumentException("a client error has to have code 4xx")
if (statusCode !in 400..499) {
throw IllegalArgumentException("Invalid HTTP client error code $statusCode (!= 4xx)")
}
}
}
open class CwaSuccessResponseWithCodeMismatchNotSupportedError(statusCode: Int) :
CwaWebException(statusCode)
open class CwaInformationalNotSupportedError(statusCode: Int) : CwaWebException(statusCode)
open class CwaRedirectNotSupportedError(statusCode: Int) : CwaWebException(statusCode)
class BadRequestException : CwaClientError(400)
class UnauthorizedException : CwaClientError(401)
class ForbiddenException : CwaClientError(403)
class NotFoundException : CwaClientError(404)
class ConflictException : CwaClientError(409)
class GoneException : CwaClientError(410)
class UnsupportedMediaTypeException : CwaClientError(415)
class TooManyRequestsException : CwaClientError(429)
class InternalServerErrorException : CwaServerError(500)
class NotImplementedException : CwaServerError(501)
class BadGatewayException : CwaServerError(502)
class ServiceUnavailableException : CwaServerError(503)
class GatewayTimeoutException : CwaServerError(504)
class HTTPVersionNotSupported : CwaServerError(505)
class NetworkAuthenticationRequiredException : CwaServerError(511)
class CwaUnknownHostException : CwaServerError(597)
class NetworkReadTimeoutException : CwaServerError(598)
class NetworkConnectTimeoutException : CwaServerError(599)
open class CwaSuccessResponseWithCodeMismatchNotSupportedError(statusCode: Int, message: String?) :
CwaWebException(statusCode, message)
open class CwaInformationalNotSupportedError(statusCode: Int, message: String?) : CwaWebException(statusCode, message)
open class CwaRedirectNotSupportedError(statusCode: Int, message: String?) : CwaWebException(statusCode, message)
class BadRequestException(message: String?) : CwaClientError(400, message)
class UnauthorizedException(message: String?) : CwaClientError(401, message)
class ForbiddenException(message: String?) : CwaClientError(403, message)
class NotFoundException(message: String?) : CwaClientError(404, message)
class ConflictException(message: String?) : CwaClientError(409, message)
class GoneException(message: String?) : CwaClientError(410, message)
class UnsupportedMediaTypeException(message: String?) : CwaClientError(415, message)
class TooManyRequestsException(message: String?) : CwaClientError(429, message)
class InternalServerErrorException(message: String?) : CwaServerError(500, message)
class NotImplementedException(message: String?) : CwaServerError(501, message)
class BadGatewayException(message: String?) : CwaServerError(502, message)
class ServiceUnavailableException(message: String?) : CwaServerError(503, message)
class GatewayTimeoutException(message: String?) : CwaServerError(504, message)
class HTTPVersionNotSupported(message: String?) : CwaServerError(505, message)
class NetworkAuthenticationRequiredException(message: String?) : CwaServerError(511, message)
class CwaUnknownHostException(
message: String? = null,
cause: Throwable?
) : CwaServerError(597, message, cause)
class NetworkReadTimeoutException(message: String?) : CwaServerError(598, message)
class NetworkConnectTimeoutException(
message: String? = null,
cause: Throwable? = null
) : CwaServerError(599, message, cause)
......@@ -26,6 +26,7 @@ import de.rki.coronawarnapp.exception.http.UnauthorizedException
import de.rki.coronawarnapp.exception.http.UnsupportedMediaTypeException
import okhttp3.Interceptor
import okhttp3.Response
import timber.log.Timber
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
......@@ -34,43 +35,54 @@ class HttpErrorParser : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
try {
val response = chain.proceed(chain.request())
val message: String? = try {
if (response.isSuccessful) {
null
} else {
response.message
}
} catch (e: Exception) {
Timber.w("Failed to get http error message.")
null
}
return when (val code = response.code) {
HttpsURLConnection.HTTP_OK -> response
HttpsURLConnection.HTTP_CREATED -> response
HttpsURLConnection.HTTP_ACCEPTED -> response
HttpsURLConnection.HTTP_NO_CONTENT -> response
HttpsURLConnection.HTTP_BAD_REQUEST -> throw BadRequestException()
HttpsURLConnection.HTTP_UNAUTHORIZED -> throw UnauthorizedException()
HttpsURLConnection.HTTP_FORBIDDEN -> throw ForbiddenException()
HttpsURLConnection.HTTP_NOT_FOUND -> throw NotFoundException()
HttpsURLConnection.HTTP_CONFLICT -> throw ConflictException()
HttpsURLConnection.HTTP_GONE -> throw GoneException()
HttpsURLConnection.HTTP_UNSUPPORTED_TYPE -> throw UnsupportedMediaTypeException()
429 -> throw TooManyRequestsException()
HttpsURLConnection.HTTP_INTERNAL_ERROR -> throw InternalServerErrorException()
HttpsURLConnection.HTTP_NOT_IMPLEMENTED -> throw NotImplementedException()
HttpsURLConnection.HTTP_BAD_GATEWAY -> throw BadGatewayException()
HttpsURLConnection.HTTP_UNAVAILABLE -> throw ServiceUnavailableException()
HttpsURLConnection.HTTP_GATEWAY_TIMEOUT -> throw GatewayTimeoutException()
HttpsURLConnection.HTTP_VERSION -> throw HTTPVersionNotSupported()
511 -> throw NetworkAuthenticationRequiredException()
598 -> throw NetworkReadTimeoutException()
599 -> throw NetworkConnectTimeoutException()
HttpsURLConnection.HTTP_BAD_REQUEST -> throw BadRequestException(message)
HttpsURLConnection.HTTP_UNAUTHORIZED -> throw UnauthorizedException(message)
HttpsURLConnection.HTTP_FORBIDDEN -> throw ForbiddenException(message)
HttpsURLConnection.HTTP_NOT_FOUND -> throw NotFoundException(message)
HttpsURLConnection.HTTP_CONFLICT -> throw ConflictException(message)
HttpsURLConnection.HTTP_GONE -> throw GoneException(message)
HttpsURLConnection.HTTP_UNSUPPORTED_TYPE -> throw UnsupportedMediaTypeException(message)
429 -> throw TooManyRequestsException(message)
HttpsURLConnection.HTTP_INTERNAL_ERROR -> throw InternalServerErrorException(message)
HttpsURLConnection.HTTP_NOT_IMPLEMENTED -> throw NotImplementedException(message)
HttpsURLConnection.HTTP_BAD_GATEWAY -> throw BadGatewayException(message)
HttpsURLConnection.HTTP_UNAVAILABLE -> throw ServiceUnavailableException(message)
HttpsURLConnection.HTTP_GATEWAY_TIMEOUT -> throw GatewayTimeoutException(message)
HttpsURLConnection.HTTP_VERSION -> throw HTTPVersionNotSupported(message)
511 -> throw NetworkAuthenticationRequiredException(message)
598 -> throw NetworkReadTimeoutException(message)
599 -> throw NetworkConnectTimeoutException(message)
else -> {
if (code in 100..199) throw CwaInformationalNotSupportedError(code)
if (code in 100..199) throw CwaInformationalNotSupportedError(code, message)
if (code in 200..299) throw CwaSuccessResponseWithCodeMismatchNotSupportedError(
code
code, message
)
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)
if (code in 300..399) throw CwaRedirectNotSupportedError(code, message)
if (code in 400..499) throw CwaClientError(code, message)
if (code in 500..599) throw CwaServerError(code, message)
throw CwaWebException(code, message)
}
}
} catch (err: SocketTimeoutException) {
throw NetworkConnectTimeoutException()
throw NetworkConnectTimeoutException(cause = err)
} catch (err: UnknownHostException) {
throw CwaUnknownHostException()
throw CwaUnknownHostException(cause = err)
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment