Skip to content

Instantly share code, notes, and snippets.

@androideveloper
Last active April 19, 2019 17:19
Show Gist options
  • Save androideveloper/b411d9e90cb8ad430148a906890d0c90 to your computer and use it in GitHub Desktop.
Save androideveloper/b411d9e90cb8ad430148a906890d0c90 to your computer and use it in GitHub Desktop.
Okhttp silent retry when idempotent request fails on reused connection
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.SocketPolicy
import org.junit.Assert.assertThat
import kotlin.test.assertEquals
fun main() {
val server = MockWebServer()
server.start()
server.enqueue(MockResponse().setBody("a"))
server.enqueue(MockResponse().setBody("aa"))
server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST))
server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST))
server.enqueue(MockResponse().setBody("b"))
val request = Request.Builder()
.url(server.url("/"))
.build()
val client = OkHttpClient.Builder()
.build()
val responseA = client.newCall(request).execute()
assertEquals("a", responseA.body()!!.string())
assertEquals(0, server.takeRequest().getSequenceNumber())
val responseAA = client.newCall(request).execute()
assertEquals("aa", responseAA.body()!!.string())
assertEquals(1, server.takeRequest().getSequenceNumber())
val responseB = client.newCall(request).execute()
assertEquals("b", responseB.body()!!.string())
assertEquals(2, server.takeRequest().getSequenceNumber())
assertEquals(0, server.takeRequest().getSequenceNumber())
assertEquals(0, server.takeRequest().getSequenceNumber())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment