diff --git a/okhttp/src/main/kotlin/okhttp3/internal/http/CallServerInterceptor.kt b/okhttp/src/main/kotlin/okhttp3/internal/http/CallServerInterceptor.kt index 32c21282da01..7efe8111c208 100644 --- a/okhttp/src/main/kotlin/okhttp3/internal/http/CallServerInterceptor.kt +++ b/okhttp/src/main/kotlin/okhttp3/internal/http/CallServerInterceptor.kt @@ -104,7 +104,7 @@ class CallServerInterceptor(private val forWebSocket: Boolean) : Interceptor { .build() var code = response.code - if (shouldIgnoreAndWaitForRealResponse(code)) { + while (shouldIgnoreAndWaitForRealResponse(code)) { responseBuilder = exchange.readResponseHeaders(expectContinue = false)!! if (invokeStartEvent) { exchange.responseHeadersStart() diff --git a/okhttp/src/test/java/okhttp3/CallTest.java b/okhttp/src/test/java/okhttp3/CallTest.java index 4c01db100d9e..a712a97d57a0 100644 --- a/okhttp/src/test/java/okhttp3/CallTest.java +++ b/okhttp/src/test/java/okhttp3/CallTest.java @@ -2795,6 +2795,51 @@ public void cancelWhileRequestHeadersAreSent_HTTP_2() throws Exception { expect100ContinueTimesOutWithoutContinue(); } + @Test public void serverRespondsWithProcessingMultiple() throws Exception { + MockResponse response = new MockResponse(); + for (int i = 0; i < 10; i++) { + response.addInformationalResponse(new MockResponse().setResponseCode(102)); + } + server.enqueue(response); + + Request request = new Request.Builder() + .url(server.url("/")) + .post(RequestBody.create("abc", MediaType.get("text/plain"))) + .build(); + + executeSynchronously(request) + .assertCode(200) + .assertSuccessful(); + + RecordedRequest recordedRequest = server.takeRequest(); + assertThat(recordedRequest.getBody().readUtf8()).isEqualTo("abc"); + } + + @Test public void serverReturnsMultiple100ContinuesHttp2() throws Exception { + enableProtocol(Protocol.HTTP_2); + serverReturnsMultiple100Continues(); + } + + @Test public void serverReturnsMultiple100Continues() throws Exception { + MockResponse response = new MockResponse(); + for (int i = 0; i < 3; i++) { + response.addInformationalResponse(new MockResponse().setResponseCode(100)); + } + server.enqueue(response); + + Request request = new Request.Builder() + .url(server.url("/")) + .post(RequestBody.create("abc", MediaType.get("text/plain"))) + .build(); + + executeSynchronously(request) + .assertCode(200) + .assertSuccessful(); + + RecordedRequest recordedRequest = server.takeRequest(); + assertThat(recordedRequest.getBody().readUtf8()).isEqualTo("abc"); + } + @Test public void serverRespondsWithUnsolicited100Continue() throws Exception { server.enqueue(new MockResponse() .setSocketPolicy(SocketPolicy.CONTINUE_ALWAYS));