Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32f2a204 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Fix HttpUtils and ServiceUnavailableException date parsing

parent 65432016
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ object HttpUtils {
     * @return date, or null if date could not be parsed
     */
    fun parseDate(dateStr: String) = try {
        DateUtils.parseDate(dateStr,
        DateUtils.parseDate(dateStr, Locale.ROOT,
                httpDateFormatStr,
                "EEE, dd MMM yyyy HH:mm:ss zzz", // RFC 822, updated by RFC 1123 with any TZ
                "EEEE, dd-MMM-yy HH:mm:ss zzz", // RFC 850, obsoleted by RFC 1036 with any TZ.
+4 −4
Original line number Diff line number Diff line
@@ -22,18 +22,18 @@ class ServiceUnavailableException: HttpException {
        // Retry-After  = "Retry-After" ":" ( HTTP-date | delta-seconds )
        // HTTP-date    = rfc1123-date | rfc850-date | asctime-date

        response.header("Retry-After")?.let {
            retryAfter = HttpUtils.parseDate(it) ?:
        response.header("Retry-After")?.let { after ->
            retryAfter = HttpUtils.parseDate(after) ?:
                    // not a HTTP-date, must be delta-seconds
                    try {
                        val seconds = Integer.parseInt(it)
                        val seconds = Integer.parseInt(after)

                        val cal = Calendar.getInstance()
                        cal.add(Calendar.SECOND, seconds)
                        cal.time

                    } catch (ignored: NumberFormatException) {
                        Dav4jvm.log.warning("Received Retry-After which was not a HTTP-date nor delta-seconds")
                        Dav4jvm.log.warning("Received Retry-After which was not a HTTP-date nor delta-seconds: $after")
                        null
                    }
        }
+21 −15
Original line number Diff line number Diff line
@@ -17,9 +17,7 @@ import kotlin.math.abs

class ServiceUnavailableExceptionTest {

    @Test
    fun testRetryAfter() {
        var response = Response.Builder()
    val response503 = Response.Builder()
            .request(Request.Builder()
                    .url("http://www.example.com")
                    .get()
@@ -28,22 +26,30 @@ class ServiceUnavailableExceptionTest {
            .code(503).message("Try later")
            .build()

        var e = ServiceUnavailableException(response)
    @Test
    fun testRetryAfter_NoTime() {
        val e = ServiceUnavailableException(response503)
        assertNull(e.retryAfter)
    }

        response = response.newBuilder()
    @Test
    fun testRetryAfter_Seconds() {
        val response = response503.newBuilder()
                .header("Retry-After", "120")
                .build()
        e = ServiceUnavailableException(response)
        val e = ServiceUnavailableException(response)
        assertNotNull(e.retryAfter)
        assertTrue(withinTimeRange(e.retryAfter!!, 120))
    }

    @Test
    fun testRetryAfter_Date() {
        val cal = Calendar.getInstance()
        cal.add(Calendar.MINUTE, 30)
        response = response.newBuilder()
        val response = response503.newBuilder()
                .header("Retry-After", HttpUtils.formatDate(cal.time))
                .build()
        e = ServiceUnavailableException(response)
        val e = ServiceUnavailableException(response)
        assertNotNull(e.retryAfter)
        assertTrue(withinTimeRange(e.retryAfter!!, 30*60))
    }