Skip to content

Commit ea720d3

Browse files
authored
[4.x] Add test for 103 handling (#8055)
* Add test for 103 handling * Minimise changes * Simplify name
1 parent a6e54bf commit ea720d3

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

Diff for: mockwebserver/src/main/kotlin/okhttp3/mockwebserver/MockResponse.kt

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class MockResponse : Cloneable {
2929
@set:JvmName("status")
3030
var status: String = ""
3131

32+
internal var informationalResponses: List<MockResponse> = listOf()
33+
3234
private var headersBuilder = Headers.Builder()
3335
private var trailersBuilder = Headers.Builder()
3436

@@ -347,6 +349,10 @@ class MockResponse : Cloneable {
347349

348350
override fun toString() = status
349351

352+
fun addInformationalResponse(informationalResponse: MockResponse): MockResponse = apply {
353+
informationalResponses += informationalResponse
354+
}
355+
350356
companion object {
351357
private const val CHUNKED_BODY_HEADER = "Transfer-encoding: chunked"
352358
}

Diff for: mockwebserver/src/main/kotlin/okhttp3/mockwebserver/MockWebServer.kt

+7
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,13 @@ class MockWebServer : ExternalResource(), Closeable {
10261026
readBody = true
10271027
}
10281028

1029+
peek.informationalResponses.forEach {
1030+
val informationalHeader =
1031+
listOf(Header(Header.RESPONSE_STATUS, it.status.replace("HTTP/1.1 ", "")))
1032+
stream.writeHeaders(informationalHeader, outFinished = false, flushHeaders = true)
1033+
stream.connection.flush()
1034+
}
1035+
10291036
val body = Buffer()
10301037
val requestLine = "$method $path HTTP/1.1"
10311038
var exception: IOException? = null

Diff for: okhttp/src/test/java/okhttp3/CallTest.java

+37
Original file line numberDiff line numberDiff line change
@@ -2812,6 +2812,43 @@ public void cancelWhileRequestHeadersAreSent_HTTP_2() throws Exception {
28122812
assertThat(recordedRequest.getBody().readUtf8()).isEqualTo("abc");
28132813
}
28142814

2815+
@Test
2816+
public void serverRespondsWithEarlyHintsHttp2() throws Exception {
2817+
enableProtocol(Protocol.HTTP_2);
2818+
server.enqueue(
2819+
new MockResponse()
2820+
.addInformationalResponse(
2821+
new MockResponse().setResponseCode(103).addHeader("Link", "</style.css>; rel=preload; as=style")
2822+
)
2823+
);
2824+
Request request = new Request.Builder()
2825+
.url(server.url("/"))
2826+
.post(RequestBody.create("abc", MediaType.get("text/plain")))
2827+
.build();
2828+
executeSynchronously(request)
2829+
.assertFailure(SocketTimeoutException.class);
2830+
}
2831+
2832+
@Test
2833+
public void serverRespondsWithEarlyHintsHttp1() throws Exception {
2834+
server.enqueue(
2835+
new MockResponse()
2836+
.addInformationalResponse(
2837+
new MockResponse().setResponseCode(103).addHeader("Link", "</style.css>; rel=preload; as=style")
2838+
)
2839+
);
2840+
Request request = new Request.Builder()
2841+
.url(server.url("/"))
2842+
.post(RequestBody.create("abc", MediaType.get("text/plain")))
2843+
.build();
2844+
executeSynchronously(request)
2845+
.assertSuccessful()
2846+
.assertCode(200);
2847+
RecordedRequest recordedRequest = server.takeRequest();
2848+
assertThat(recordedRequest.getBody().readUtf8()).isEqualTo("abc");
2849+
assertThat(recordedRequest.getHeader("Link")).isNull();
2850+
}
2851+
28152852
@Test public void serverRespondsWithUnsolicited100Continue_HTTP2() throws Exception {
28162853
enableProtocol(Protocol.HTTP_2);
28172854
serverRespondsWithUnsolicited100Continue();

0 commit comments

Comments
 (0)