From 94f87ed7473bfdf207830870ae9ddd639ea60e66 Mon Sep 17 00:00:00 2001 From: timklge <2026103+timklge@users.noreply.github.com> Date: Sat, 3 May 2025 16:51:50 +0200 Subject: [PATCH] Fix open-meteo response decompression fails if downloading through iOS companion app (#114) * Remove open-meteo gzip handling * Fix copypaste error message * Update release notes * Update app/src/main/kotlin/de/timklge/karooheadwind/weatherprovider/openmeteo/OpenMeteoWeatherProvider.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/build.gradle.kts | 4 ++-- .../de/timklge/karooheadwind/util/Gzip.kt | 19 ------------------- .../openmeteo/OpenMeteoWeatherProvider.kt | 12 ++++++------ 3 files changed, 8 insertions(+), 27 deletions(-) delete mode 100644 app/src/main/kotlin/de/timklge/karooheadwind/util/Gzip.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 12b434d..d27f80d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -93,10 +93,10 @@ tasks.register("generateManifest") { "latestVersionCode" to android.defaultConfig.versionCode, "developer" to "github.com/timklge", "description" to "Open-source extension that provides headwind direction, wind speed, forecast and other weather data fields.", - "releaseNotes" to "* Add relative grade, relative elevation gain data fields\n" + + "releaseNotes" to "* Fix weather data download from Open-Meteo via iOS companion app (thx @keefar!)\n" + + "* Add relative grade, relative elevation gain data fields\n" + "* Fix precipitation forecast field\n" + "* Interpolate between forecasted and current weather data\n" + - "* Colorize field background instead of text\n" + "* Add OpenWeatherMap support contributed by lockevod\n", "screenshotUrls" to listOf( "https://github.com/timklge/karoo-headwind/releases/latest/download/preview1.png", diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/util/Gzip.kt b/app/src/main/kotlin/de/timklge/karooheadwind/util/Gzip.kt deleted file mode 100644 index 21dc5d4..0000000 --- a/app/src/main/kotlin/de/timklge/karooheadwind/util/Gzip.kt +++ /dev/null @@ -1,19 +0,0 @@ -package de.timklge.karooheadwind.util - -import io.hammerhead.karooext.models.HttpResponseState -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import java.util.zip.GZIPInputStream - -suspend fun ungzip(response: HttpResponseState.Complete): String { - val inputStream = java.io.ByteArrayInputStream(response.body ?: ByteArray(0)) - val lowercaseHeaders = response.headers.map { (k: String, v: String) -> k.lowercase() to v.lowercase() }.toMap() - val isGzippedResponse = lowercaseHeaders["content-encoding"]?.contains("gzip") == true - - return if(isGzippedResponse){ - val gzipStream = withContext(Dispatchers.IO) { GZIPInputStream(inputStream) } - gzipStream.use { stream -> String(stream.readBytes()) } - } else { - inputStream.use { stream -> String(stream.readBytes()) } - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/weatherprovider/openmeteo/OpenMeteoWeatherProvider.kt b/app/src/main/kotlin/de/timklge/karooheadwind/weatherprovider/openmeteo/OpenMeteoWeatherProvider.kt index 8427b9c..b2ae50c 100644 --- a/app/src/main/kotlin/de/timklge/karooheadwind/weatherprovider/openmeteo/OpenMeteoWeatherProvider.kt +++ b/app/src/main/kotlin/de/timklge/karooheadwind/weatherprovider/openmeteo/OpenMeteoWeatherProvider.kt @@ -8,7 +8,6 @@ import de.timklge.karooheadwind.TemperatureUnit import de.timklge.karooheadwind.WeatherDataProvider import de.timklge.karooheadwind.datatypes.GpsCoordinates import de.timklge.karooheadwind.jsonWithUnknownKeys -import de.timklge.karooheadwind.util.ungzip import de.timklge.karooheadwind.weatherprovider.WeatherDataResponse import de.timklge.karooheadwind.weatherprovider.WeatherProvider import de.timklge.karooheadwind.weatherprovider.WeatherProviderException @@ -28,7 +27,7 @@ import kotlin.time.Duration.Companion.seconds class OpenMeteoWeatherProvider : WeatherProvider { @OptIn(FlowPreview::class) - private suspend fun makeOpenMeteoWeatherRequest(karooSystemService: KarooSystemService, gpsCoordinates: List, settings: HeadwindSettings, profile: UserProfile?): String { + private suspend fun makeOpenMeteoWeatherRequest(karooSystemService: KarooSystemService, gpsCoordinates: List, settings: HeadwindSettings, profile: UserProfile?): HttpResponseState.Complete { val precipitationUnit = if (profile?.preferredUnit?.distance != UserProfile.PreferredUnit.UnitType.IMPERIAL) PrecipitationUnit.MILLIMETERS else PrecipitationUnit.INCH val temperatureUnit = if (profile?.preferredUnit?.temperature != UserProfile.PreferredUnit.UnitType.IMPERIAL) TemperatureUnit.CELSIUS else TemperatureUnit.FAHRENHEIT @@ -45,7 +44,7 @@ class OpenMeteoWeatherProvider : WeatherProvider { "GET", url, waitForConnection = false, - headers = mapOf("User-Agent" to KarooHeadwindExtension.TAG, "Accept-Encoding" to "gzip"), + headers = mapOf("User-Agent" to KarooHeadwindExtension.TAG), ), onEvent = { event: OnHttpResponse -> if (event.state is HttpResponseState.Complete){ @@ -74,7 +73,7 @@ class OpenMeteoWeatherProvider : WeatherProvider { throw WeatherProviderException(response.statusCode, "OpenMeteo API request failed with status code ${response.statusCode}") } - return ungzip(response) + return response } override suspend fun getWeatherData( @@ -84,11 +83,12 @@ class OpenMeteoWeatherProvider : WeatherProvider { profile: UserProfile? ): WeatherDataResponse { val openMeteoResponse = makeOpenMeteoWeatherRequest(karooSystem, coordinates, settings, profile) + val responseBody = openMeteoResponse.body?.let { String(it) } ?: throw WeatherProviderException(500, "Null response from OpenMeteo") val weatherData = if (coordinates.size == 1) { - listOf(jsonWithUnknownKeys.decodeFromString(openMeteoResponse)) + listOf(jsonWithUnknownKeys.decodeFromString(responseBody)) } else { - jsonWithUnknownKeys.decodeFromString>(openMeteoResponse) + jsonWithUnknownKeys.decodeFromString>(responseBody) } val response = WeatherDataResponse(