diff --git a/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java b/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java index 5030943f0..51ad1dfc7 100644 --- a/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java +++ b/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java @@ -690,6 +690,9 @@ public final class MockWebServer { } private void writeResponse(SpdyStream stream, MockResponse response) throws IOException { + if (response.getSocketPolicy() == SocketPolicy.NO_RESPONSE) { + return; + } List spdyHeaders = new ArrayList(); String[] statusParts = response.getStatus().split(" ", 2); if (statusParts.length != 2) { diff --git a/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/SocketPolicy.java b/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/SocketPolicy.java index 7912f3a77..76701c4c9 100644 --- a/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/SocketPolicy.java +++ b/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/SocketPolicy.java @@ -57,5 +57,11 @@ public enum SocketPolicy { * Shutdown the socket output after sending the response. For testing bad * behavior. */ - SHUTDOWN_OUTPUT_AT_END + SHUTDOWN_OUTPUT_AT_END, + + /** + * Don't response to the request but keep the socket open. For testing + * read response header timeout issue. + */ + NO_RESPONSE } diff --git a/okhttp/src/test/java/com/squareup/okhttp/internal/http/HttpOverSpdyTest.java b/okhttp/src/test/java/com/squareup/okhttp/internal/http/HttpOverSpdyTest.java index 035d5d21c..d3ee22405 100644 --- a/okhttp/src/test/java/com/squareup/okhttp/internal/http/HttpOverSpdyTest.java +++ b/okhttp/src/test/java/com/squareup/okhttp/internal/http/HttpOverSpdyTest.java @@ -23,6 +23,8 @@ import com.squareup.okhttp.internal.Util; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; import com.squareup.okhttp.mockwebserver.RecordedRequest; +import com.squareup.okhttp.mockwebserver.SocketPolicy; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; @@ -226,6 +228,16 @@ public final class HttpOverSpdyTest { assertEquals(-1, in.read()); } + @Test(timeout = 3000) public void readResponseHeaderTimeout() throws Exception { + server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.NO_RESPONSE)); + server.enqueue(new MockResponse().setBody("A")); + server.play(); + + HttpURLConnection connection = client.open(server.getUrl("/")); + connection.setReadTimeout(1000); + assertContent("A", connection, Integer.MAX_VALUE); + } + @Test public void responsesAreCached() throws IOException { client.setResponseCache(cache);