From eda4064d6ae5b652b32a0dc0de8684ef5732dbff Mon Sep 17 00:00:00 2001 From: Yuri Schimke Date: Thu, 31 Jul 2025 18:34:32 +0000 Subject: [PATCH] Rename compression algorithms to be consistent. (#8984) * Rename compression algorithms to be consistent. Nice API for both Java and Kotlin devs. With a test showing each. Co-authored-by: Jake Wharton --------- Co-authored-by: Jake Wharton --- okhttp-brotli/api/okhttp-brotli.api | 10 +++--- .../okhttp3/brotli/BrotliInterceptor.kt | 9 +++--- .../okhttp3/brotli/BrotliInterceptorTest.kt | 14 ++++++--- okhttp-zstd/api/okhttp-zstd.api | 6 ++-- okhttp-zstd/build.gradle.kts | 1 + .../zstd/{ZstdInterceptor.kt => Zstd.kt} | 9 +++--- .../okhttp3/zstd/ZstdInterceptorJavaTest.java | 31 +++++++++++++++++++ .../java/okhttp3/zstd/ZstdInterceptorTest.kt | 3 +- okhttp/api/android/okhttp.api | 2 +- okhttp/api/jvm/okhttp.api | 2 +- .../kotlin/okhttp3/CompressionInterceptor.kt | 5 +-- 11 files changed, 66 insertions(+), 26 deletions(-) rename okhttp-zstd/src/main/kotlin/okhttp3/zstd/{ZstdInterceptor.kt => Zstd.kt} (78%) create mode 100644 okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorJavaTest.java diff --git a/okhttp-brotli/api/okhttp-brotli.api b/okhttp-brotli/api/okhttp-brotli.api index ce1008f00..597fd5913 100644 --- a/okhttp-brotli/api/okhttp-brotli.api +++ b/okhttp-brotli/api/okhttp-brotli.api @@ -1,8 +1,10 @@ +public final class okhttp3/brotli/Brotli : okhttp3/CompressionInterceptor$DecompressionAlgorithm { + public static final field INSTANCE Lokhttp3/brotli/Brotli; + public fun decompress (Lokio/BufferedSource;)Lokio/Source; + public fun getEncoding ()Ljava/lang/String; +} + public final class okhttp3/brotli/BrotliInterceptor : okhttp3/CompressionInterceptor { public static final field INSTANCE Lokhttp3/brotli/BrotliInterceptor; } -public final class okhttp3/brotli/BrotliInterceptorKt { - public static final fun getBrotli ()Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; -} - diff --git a/okhttp-brotli/src/main/kotlin/okhttp3/brotli/BrotliInterceptor.kt b/okhttp-brotli/src/main/kotlin/okhttp3/brotli/BrotliInterceptor.kt index fb0d28d2f..7d43ce845 100644 --- a/okhttp-brotli/src/main/kotlin/okhttp3/brotli/BrotliInterceptor.kt +++ b/okhttp-brotli/src/main/kotlin/okhttp3/brotli/BrotliInterceptor.kt @@ -29,9 +29,8 @@ import org.brotli.dec.BrotliInputStream */ object BrotliInterceptor : CompressionInterceptor(Brotli, Gzip) -val Brotli = - object : CompressionInterceptor.DecompressionAlgorithm { - override val encoding: String = "br" +object Brotli : CompressionInterceptor.DecompressionAlgorithm { + override val encoding: String get() = "br" - override fun decompress(compressedSource: BufferedSource): Source = BrotliInputStream(compressedSource.inputStream()).source() - } + override fun decompress(compressedSource: BufferedSource): Source = BrotliInputStream(compressedSource.inputStream()).source() +} diff --git a/okhttp-brotli/src/test/java/okhttp3/brotli/BrotliInterceptorTest.kt b/okhttp-brotli/src/test/java/okhttp3/brotli/BrotliInterceptorTest.kt index e3bc79086..ca9a7cf21 100644 --- a/okhttp-brotli/src/test/java/okhttp3/brotli/BrotliInterceptorTest.kt +++ b/okhttp-brotli/src/test/java/okhttp3/brotli/BrotliInterceptorTest.kt @@ -22,6 +22,8 @@ import assertk.assertions.isEmpty import assertk.assertions.isEqualTo import java.io.IOException import kotlin.test.assertFailsWith +import okhttp3.CompressionInterceptor +import okhttp3.CompressionInterceptor.Companion.Gzip import okhttp3.MediaType.Companion.toMediaType import okhttp3.Protocol import okhttp3.Request @@ -34,6 +36,8 @@ import okio.ByteString.Companion.encodeUtf8 import org.junit.jupiter.api.Test class BrotliInterceptorTest { + val brotliInterceptor = CompressionInterceptor(Brotli, Gzip) + @Test fun testUncompressBrotli() { val s = @@ -47,7 +51,7 @@ class BrotliInterceptorTest { header("Content-Encoding", "br") } - val uncompressed = BrotliInterceptor.decompress(response) + val uncompressed = brotliInterceptor.decompress(response) val responseString = uncompressed.body.string() assertThat(responseString).contains("\"brotli\": true,") @@ -68,7 +72,7 @@ class BrotliInterceptorTest { header("Content-Encoding", "gzip") } - val uncompressed = BrotliInterceptor.decompress(response) + val uncompressed = brotliInterceptor.decompress(response) val responseString = uncompressed.body.string() assertThat(responseString).contains("\"gzipped\": true,") @@ -79,7 +83,7 @@ class BrotliInterceptorTest { fun testNoUncompress() { val response = response("https://httpbin.org/brotli", "XXXX".encodeUtf8()) - val same = BrotliInterceptor.decompress(response) + val same = brotliInterceptor.decompress(response) val responseString = same.body.string() assertThat(responseString).isEqualTo("XXXX") @@ -93,7 +97,7 @@ class BrotliInterceptorTest { } assertFailsWith { - val failingResponse = BrotliInterceptor.decompress(response) + val failingResponse = brotliInterceptor.decompress(response) failingResponse.body.string() }.also { ioe -> assertThat(ioe).hasMessage("Brotli stream decoding failed") @@ -110,7 +114,7 @@ class BrotliInterceptorTest { message("NO CONTENT") } - val same = BrotliInterceptor.decompress(response) + val same = brotliInterceptor.decompress(response) val responseString = same.body.string() assertThat(responseString).isEmpty() diff --git a/okhttp-zstd/api/okhttp-zstd.api b/okhttp-zstd/api/okhttp-zstd.api index ca137ca54..caefec79a 100644 --- a/okhttp-zstd/api/okhttp-zstd.api +++ b/okhttp-zstd/api/okhttp-zstd.api @@ -1,4 +1,6 @@ -public final class okhttp3/zstd/ZstdInterceptorKt { - public static final fun getZstd ()Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; +public final class okhttp3/zstd/Zstd : okhttp3/CompressionInterceptor$DecompressionAlgorithm { + public static final field INSTANCE Lokhttp3/zstd/Zstd; + public fun decompress (Lokio/BufferedSource;)Lokio/Source; + public fun getEncoding ()Ljava/lang/String; } diff --git a/okhttp-zstd/build.gradle.kts b/okhttp-zstd/build.gradle.kts index 6f1fe7bd2..8250b4741 100644 --- a/okhttp-zstd/build.gradle.kts +++ b/okhttp-zstd/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { "friendsApi"(projects.okhttp) implementation(libs.zstd.kmp.okio) + testImplementation(projects.okhttpBrotli) testImplementation(projects.okhttpTestingSupport) testImplementation(libs.kotlin.test.common) testImplementation(libs.kotlin.test.junit) diff --git a/okhttp-zstd/src/main/kotlin/okhttp3/zstd/ZstdInterceptor.kt b/okhttp-zstd/src/main/kotlin/okhttp3/zstd/Zstd.kt similarity index 78% rename from okhttp-zstd/src/main/kotlin/okhttp3/zstd/ZstdInterceptor.kt rename to okhttp-zstd/src/main/kotlin/okhttp3/zstd/Zstd.kt index a9a8b1044..e1b721325 100644 --- a/okhttp-zstd/src/main/kotlin/okhttp3/zstd/ZstdInterceptor.kt +++ b/okhttp-zstd/src/main/kotlin/okhttp3/zstd/Zstd.kt @@ -23,9 +23,8 @@ import okio.Source /** * Support for Zstandard encoding. Use via the [CompressionInterceptor]. */ -val Zstd = - object : CompressionInterceptor.DecompressionAlgorithm { - override val encoding: String = "zstd" +object Zstd : CompressionInterceptor.DecompressionAlgorithm { + override val encoding: String get() = "zstd" - override fun decompress(compressedSource: BufferedSource): Source = compressedSource.zstdDecompress() - } + override fun decompress(compressedSource: BufferedSource): Source = compressedSource.zstdDecompress() +} diff --git a/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorJavaTest.java b/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorJavaTest.java new file mode 100644 index 000000000..eb5b5d57f --- /dev/null +++ b/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorJavaTest.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Block, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package okhttp3.zstd; + +import okhttp3.CompressionInterceptor; +import okhttp3.brotli.Brotli; +import org.junit.jupiter.api.Test; + +class ZstdInterceptorJavaTest { + @Test + public void testConstructor() { + CompressionInterceptor interceptor = new CompressionInterceptor( + Zstd.INSTANCE, + CompressionInterceptor.Gzip, + Brotli.INSTANCE + ); + } +} diff --git a/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorTest.kt b/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorTest.kt index 8da4ab791..85fab2871 100644 --- a/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorTest.kt +++ b/okhttp-zstd/src/test/java/okhttp3/zstd/ZstdInterceptorTest.kt @@ -24,6 +24,7 @@ import com.squareup.zstd.okio.zstdCompress import java.io.IOException import kotlin.test.assertFailsWith import okhttp3.CompressionInterceptor +import okhttp3.CompressionInterceptor.Companion.Gzip import okhttp3.MediaType.Companion.toMediaType import okhttp3.Protocol import okhttp3.Request @@ -39,7 +40,7 @@ import okio.gzip import org.junit.jupiter.api.Test class ZstdInterceptorTest { - val zstdInterceptor = CompressionInterceptor(Zstd, CompressionInterceptor.Gzip) + val zstdInterceptor = CompressionInterceptor(Zstd, Gzip) @Test fun testDecompressZstd() { diff --git a/okhttp/api/android/okhttp.api b/okhttp/api/android/okhttp.api index 792bbbdd8..e17c52388 100644 --- a/okhttp/api/android/okhttp.api +++ b/okhttp/api/android/okhttp.api @@ -328,13 +328,13 @@ public final class okhttp3/CipherSuite$Companion { public class okhttp3/CompressionInterceptor : okhttp3/Interceptor { public static final field Companion Lokhttp3/CompressionInterceptor$Companion; + public static final field Gzip Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; public fun ([Lokhttp3/CompressionInterceptor$DecompressionAlgorithm;)V public final fun getAlgorithms ()[Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; public fun intercept (Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; } public final class okhttp3/CompressionInterceptor$Companion { - public final fun getGzip ()Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; } public abstract interface class okhttp3/CompressionInterceptor$DecompressionAlgorithm { diff --git a/okhttp/api/jvm/okhttp.api b/okhttp/api/jvm/okhttp.api index fbfd15aac..94a64d811 100644 --- a/okhttp/api/jvm/okhttp.api +++ b/okhttp/api/jvm/okhttp.api @@ -328,13 +328,13 @@ public final class okhttp3/CipherSuite$Companion { public class okhttp3/CompressionInterceptor : okhttp3/Interceptor { public static final field Companion Lokhttp3/CompressionInterceptor$Companion; + public static final field Gzip Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; public fun ([Lokhttp3/CompressionInterceptor$DecompressionAlgorithm;)V public final fun getAlgorithms ()[Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; public fun intercept (Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; } public final class okhttp3/CompressionInterceptor$Companion { - public final fun getGzip ()Lokhttp3/CompressionInterceptor$DecompressionAlgorithm; } public abstract interface class okhttp3/CompressionInterceptor$DecompressionAlgorithm { diff --git a/okhttp/src/commonJvmAndroid/kotlin/okhttp3/CompressionInterceptor.kt b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/CompressionInterceptor.kt index d52eb6124..97e890e78 100644 --- a/okhttp/src/commonJvmAndroid/kotlin/okhttp3/CompressionInterceptor.kt +++ b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/CompressionInterceptor.kt @@ -98,9 +98,10 @@ open class CompressionInterceptor( /** * Request "gzip" compression. */ - val Gzip = + @JvmField + public val Gzip = object : DecompressionAlgorithm { - override val encoding: String = "gzip" + override val encoding: String get() = "gzip" override fun decompress(compressedSource: BufferedSource): Source = GzipSource(compressedSource) }