1
0
mirror of https://github.com/square/okhttp.git synced 2026-01-15 20:56:41 +03:00

Allow to clone calls

This commit is contained in:
len
2016-07-09 16:40:23 +02:00
parent a3bcaa3b6e
commit bd99da4bbc
3 changed files with 48 additions and 1 deletions

View File

@@ -619,6 +619,42 @@ public final class CallTest {
assertEquals("SyncApiTest", server.takeRequest().getHeader("User-Agent"));
}
@Test public void legalToExecuteTwiceCloning() throws Exception {
server.enqueue(new MockResponse().setBody("abc"));
server.enqueue(new MockResponse().setBody("def"));
Request request = new Request.Builder()
.url(server.url("/"))
.build();
Call call = client.newCall(request);
Response response1 = call.execute();
Call cloned = call.clone();
Response response2 = cloned.execute();
assertEquals(response1.body().string(), "abc");
assertEquals(response2.body().string(), "def");
}
@Test public void legalToExecuteTwiceCloning_Async() throws Exception {
server.enqueue(new MockResponse().setBody("abc"));
server.enqueue(new MockResponse().setBody("def"));
Request request = new Request.Builder()
.url(server.url("/"))
.build();
Call call = client.newCall(request);
call.enqueue(callback);
Call cloned = call.clone();
cloned.enqueue(callback);
callback.await(request.url()).assertBody("abc");
callback.await(request.url()).assertBody("def");
}
@Test public void get_Async() throws Exception {
server.enqueue(new MockResponse()
.setBody("abc")

View File

@@ -21,7 +21,7 @@ import java.io.IOException;
* A call is a request that has been prepared for execution. A call can be canceled. As this object
* represents a single request/response pair (stream), it cannot be executed twice.
*/
public interface Call {
public interface Call extends Cloneable {
/** Returns the original request that initiated this call. */
Request request();
@@ -67,6 +67,12 @@ public interface Call {
boolean isCanceled();
/**
* Create a new, identical call to this one which can be enqueued or executed even if this call
* has already been.
*/
Call clone();
interface Factory {
Call newCall(Request request);
}

View File

@@ -90,6 +90,11 @@ final class RealCall implements Call {
return retryAndFollowUpInterceptor.isCanceled();
}
@SuppressWarnings("CloneDoesntCallSuperClone") // We are a final type & this saves clearing state.
@Override public RealCall clone() {
return new RealCall(client, originalRequest);
}
StreamAllocation streamAllocation() {
return retryAndFollowUpInterceptor.streamAllocation();
}