diff --git a/pom.xml b/pom.xml
index 341ee7cac..f513d0c65 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.google.mockwebserver
mockwebserver
- 20120127
+ 20120727
mockwebserver
http://code.google.com/p/mockwebserver
@@ -87,4 +87,4 @@
scm:svn:https://code.google.com/p/mockwebserver/
http://code.google.com/p/mockwebserver/source/browse
-
\ No newline at end of file
+
diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java
index a013d9717..5116991d3 100644
--- a/src/main/java/com/google/mockwebserver/MockWebServer.java
+++ b/src/main/java/com/google/mockwebserver/MockWebServer.java
@@ -228,12 +228,12 @@ public final class MockWebServer {
}
private void acceptConnections() throws Exception {
- do {
+ while (true) {
Socket socket;
try {
socket = serverSocket.accept();
- } catch (SocketException ignored) {
- continue;
+ } catch (SocketException e) {
+ return;
}
MockResponse peek = responseQueue.peek();
if (peek != null && peek.getSocketPolicy() == DISCONNECT_AT_START) {
@@ -243,7 +243,7 @@ public final class MockWebServer {
openClientSockets.add(socket);
serveConnection(socket);
}
- } while (!responseQueue.isEmpty());
+ }
}
}));
}
@@ -290,7 +290,7 @@ public final class MockWebServer {
InputStream in = new BufferedInputStream(socket.getInputStream());
OutputStream out = new BufferedOutputStream(socket.getOutputStream());
- while (!responseQueue.isEmpty() && processOneRequest(socket, in, out)) {}
+ while (processOneRequest(socket, in, out)) {}
if (sequenceNumber == 0) {
logger.warning("MockWebServer connection didn't make a request");
@@ -450,10 +450,6 @@ public final class MockWebServer {
* Returns a response to satisfy {@code request}.
*/
private MockResponse dispatch(RecordedRequest request) throws InterruptedException {
- if (responseQueue.isEmpty()) {
- throw new IllegalStateException("Unexpected request: " + request);
- }
-
// to permit interactive/browser testing, ignore requests for favicons
if (request.getRequestLine().equals("GET /favicon.ico HTTP/1.1")) {
System.out.println("served " + request.getRequestLine());
diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java
index 353361b92..760cee0ac 100644
--- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java
+++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java
@@ -75,6 +75,29 @@ public final class MockWebServerTest extends TestCase {
assertEquals("GET /new-path HTTP/1.1", redirect.getRequestLine());
}
+ /**
+ * Test that MockWebServer blocks for a call to enqueue() if a request
+ * is made before a mock response is ready.
+ */
+ public void testDispatchBlocksWaitingForEnqueue() throws Exception {
+ server.play();
+
+ new Thread() {
+ @Override public void run() {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ignored) {
+ }
+ server.enqueue(new MockResponse().setBody("enqueued in the background"));
+ }
+ }.start();
+
+ URLConnection connection = server.getUrl("/").openConnection();
+ InputStream in = connection.getInputStream();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+ assertEquals("enqueued in the background", reader.readLine());
+ }
+
public void testNonHexadecimalChunkSize() throws Exception {
server.enqueue(new MockResponse()
.setBody("G\r\nxxxxxxxxxxxxxxxx\r\n0\r\n\r\n")