diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 33a40c49b..191d805b5 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { } implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.20.0") implementation("com.googlecode.json-simple:json-simple:1.1") + implementation("com.squareup.okhttp3:okhttp:4.9.0") implementation(gradleApi()) implementation(localGroovy()) diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index e368054f2..e91d0203c 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -79,11 +79,6 @@ object Libs { const val mockwebserver: String = "com.squareup.okhttp3:mockwebserver:" + Versions.com_squareup_okhttp3 - /** - * https://square.github.io/okhttp/ - */ - const val okhttp: String = "com.squareup.okhttp3:okhttp:" + Versions.com_squareup_okhttp3 - /** * https://kotlinlang.org/ */ diff --git a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt index 468574d82..8144e71cd 100644 --- a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt +++ b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt @@ -185,7 +185,6 @@ class AllProjectConfigurer { implementation(Libs.navigation_fragment_ktx) implementation(Libs.navigation_ui_ktx) androidTestImplementation(Libs.navigation_testing) - implementation(Libs.okhttp) implementation(Libs.logging_interceptor) implementation(Libs.retrofit) implementation(Libs.adapter_rxjava2) diff --git a/custom/build.gradle.kts b/custom/build.gradle.kts index 9dee1a6c4..b26d5772d 100644 --- a/custom/build.gradle.kts +++ b/custom/build.gradle.kts @@ -6,10 +6,13 @@ import custom.createPublisher import custom.transactionWithCommit import plugin.KiwixConfigurationPlugin import java.net.URI -import java.net.URL import java.net.URLDecoder import java.util.Locale import java.util.Base64 +import java.io.FileOutputStream +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.ResponseBody plugins { android @@ -51,37 +54,53 @@ fun ProductFlavor.createDownloadTask(file: File): Task { doLast { if (!file.exists()) { file.createNewFile() - URL(fetchUrl()).openStream().use { - it.copyTo(file.outputStream()) + + OkHttpClient().newCall(fetchRequest()).execute().use { response -> + if (response.isSuccessful) { + response.body?.let { responseBody -> + writeZimFileData(responseBody, file) + } + } else { + throw RuntimeException( + "Download Failed. Error: ${response.message}\n" + + " Status Code: ${response.code}" + ) + } } } } } } -fun ProductFlavor.fetchUrl(): String { +fun ProductFlavor.fetchRequest(): Request { val urlString = buildConfigFields["ZIM_URL"]!!.value.replace("\"", "") - var secretKey = "" - val url = if (urlString.isAuthenticationUrl) { - secretKey = urlString.secretKey - URI.create(urlString.removeAuthenticationFromUrl).toURL() + return if (urlString.isAuthenticationUrl) { + Request.Builder() + .url(URI.create(urlString.removeAuthenticationFromUrl).toURL()) + .header( + "Authorization", + "Basic " + + Base64.getEncoder().encodeToString(System.getenv(urlString.secretKey).toByteArray()) + ) + .build() } else { - URI.create(urlString).toURL() + Request.Builder() + .url(URI.create(urlString).toURL()) + .build() } - return url - .openConnection() - .apply { - if (urlString.isAuthenticationUrl) { - setRequestProperty( - "Authorization", - "Basic ${Base64.getEncoder().encodeToString(System.getenv(secretKey).toByteArray())}" - ) +} + +fun writeZimFileData(responseBody: ResponseBody, file: File) { + FileOutputStream(file).use { outputStream -> + responseBody.byteStream().use { inputStream -> + val buffer = ByteArray(4096) + var bytesRead: Int + while (inputStream.read(buffer).also { bytesRead = it } != -1) { + outputStream.write(buffer, 0, bytesRead) } - connect() - getInputStream() - }.let { - it.getHeaderField("Location")?.replace("https", "http") ?: it.url.toString() + outputStream.flush() } + } } val String.decodeUrl: String