From d3d22c6b299bbae56ef7ddf40390705ac45a07f8 Mon Sep 17 00:00:00 2001 From: Ravi Chodavarapu Date: Wed, 23 Mar 2016 13:46:11 +0000 Subject: [PATCH 1/2] Allow a connect timeout to be specified for HTTP client requests --- .../org/chodavarapu/datamill/http/Client.java | 12 ++++++++++-- .../org/chodavarapu/datamill/http/Request.java | 4 ++++ .../chodavarapu/datamill/http/RequestBuilder.java | 1 + .../datamill/http/impl/RequestBuilderImpl.java | 11 +++++++++-- .../datamill/http/impl/RequestImpl.java | 15 ++++++++++++++- .../datamill/http/impl/ServerRequestImpl.java | 10 ++++++---- 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/org/chodavarapu/datamill/http/Client.java b/core/src/main/java/org/chodavarapu/datamill/http/Client.java index c25c087..d5b2ef2 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/Client.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/Client.java @@ -29,7 +29,7 @@ public class Client { public Observable request(Function builder) { Request request = builder.apply(new RequestBuilderImpl()); - return request(request.method(), request.headers(), request.uri(), request.uriParameters(), request.entity()); + return request(request.method(), request.headers(), request.uri(), request.uriParameters(), request.options(), request.entity()); } public Observable request(Method method, Map headers, String uri, Value entity) { @@ -41,7 +41,7 @@ protected URLConnection createConnection(String uri) throws IOException { } public Observable request(Method method, Map headers, String uri, Entity entity) { - return request(method, headers, uri, null, entity); + return request(method, headers, uri, null, null, entity); } public Observable request( @@ -49,6 +49,7 @@ public Observable request( Map headers, String uri, Map uriParameters, + Map options, Entity entity) { if (uriParameters != null && uriParameters.size() > 0) { uri = uriBuilder.build(uri, uriParameters); @@ -62,6 +63,13 @@ public Observable request( httpConnection.setRequestMethod(method.toString()); + if (options != null && options.size() > 0) { + Object connectTimeout = options.get(Request.OPTION_CONNECT_TIMEOUT); + if (connectTimeout instanceof Integer) { + httpConnection.setConnectTimeout((int) connectTimeout); + } + } + if (headers != null) { for (Map.Entry header : headers.entrySet()) { httpConnection.addRequestProperty(header.getKey(), header.getValue()); diff --git a/core/src/main/java/org/chodavarapu/datamill/http/Request.java b/core/src/main/java/org/chodavarapu/datamill/http/Request.java index 842f804..f5afad6 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/Request.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/Request.java @@ -9,6 +9,8 @@ * @author Ravi Chodavarapu (rchodava@gmail.com) */ public interface Request { + String OPTION_CONNECT_TIMEOUT = "connectTimeout"; + Entity entity(); Map headers(); @@ -19,6 +21,8 @@ public interface Request { Method method(); + Map options(); + String uri(); Value uriParameter(String parameter); diff --git a/core/src/main/java/org/chodavarapu/datamill/http/RequestBuilder.java b/core/src/main/java/org/chodavarapu/datamill/http/RequestBuilder.java index 7aa6e26..fd1b9c6 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/RequestBuilder.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/RequestBuilder.java @@ -7,6 +7,7 @@ */ public interface RequestBuilder { Request build(); + RequestBuilder connectTimeout(int milliseconds); RequestBuilder entity(Value entity); RequestBuilder entity(Entity entity); RequestBuilder header(String name, String value); diff --git a/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestBuilderImpl.java b/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestBuilderImpl.java index c1cbc3d..532b0cd 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestBuilderImpl.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestBuilderImpl.java @@ -11,14 +11,21 @@ */ public class RequestBuilderImpl implements RequestBuilder { private Entity entity; - private String method; private final Map headers = new HashMap<>(); + private String method; + private final Map options = new HashMap<>(); private String uri; private final Map uriParameters = new HashMap<>(); @Override public Request build() { - return new RequestImpl(method, headers, uri, uriParameters, entity); + return new RequestImpl(method, headers, uri, uriParameters, options, entity); + } + + @Override + public RequestBuilder connectTimeout(int milliseconds) { + options.put(Request.OPTION_CONNECT_TIMEOUT, milliseconds); + return this; } @Override diff --git a/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestImpl.java b/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestImpl.java index 7b27221..6a76151 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestImpl.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/impl/RequestImpl.java @@ -17,11 +17,19 @@ public class RequestImpl implements Request { private final Entity entity; private final String method; private final Map headers; + private final Map options; private final String uri; private final Map uriParameters; - public RequestImpl(String method, Map headers, String uri, Map uriParameters, Entity entity) { + public RequestImpl( + String method, + Map headers, + String uri, + Map uriParameters, + Map options, + Entity entity) { this.method = method; + this.options = options; this.uri = uri; this.uriParameters = uriParameters; this.headers = headers; @@ -54,6 +62,11 @@ public Method method() { return Method.valueOf(method); } + @Override + public Map options() { + return options; + } + @Override public String uri() { return uri; diff --git a/core/src/main/java/org/chodavarapu/datamill/http/impl/ServerRequestImpl.java b/core/src/main/java/org/chodavarapu/datamill/http/impl/ServerRequestImpl.java index 0fde357..0a8077d 100644 --- a/core/src/main/java/org/chodavarapu/datamill/http/impl/ServerRequestImpl.java +++ b/core/src/main/java/org/chodavarapu/datamill/http/impl/ServerRequestImpl.java @@ -7,10 +7,7 @@ import org.chodavarapu.datamill.values.StringValue; import org.chodavarapu.datamill.values.Value; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; /** * @author Ravi Chodavarapu (rchodava@gmail.com) @@ -77,6 +74,11 @@ public Method method() { return null; } + @Override + public Map options() { + return Collections.emptyMap(); + } + @Override public ResponseBuilder respond() { return new ResponseBuilderImpl(); From 68c07203cf1550cfe5f0a710dc3b2ce036baccec Mon Sep 17 00:00:00 2001 From: Ravi Chodavarapu Date: Wed, 23 Mar 2016 13:51:11 +0000 Subject: [PATCH 2/2] Add basic test for connect timeout option being passed down by the builder --- .../chodavarapu/datamill/http/impl/RequestBuilderImplTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/test/java/org/chodavarapu/datamill/http/impl/RequestBuilderImplTest.java b/core/src/test/java/org/chodavarapu/datamill/http/impl/RequestBuilderImplTest.java index 153de46..6588bf4 100644 --- a/core/src/test/java/org/chodavarapu/datamill/http/impl/RequestBuilderImplTest.java +++ b/core/src/test/java/org/chodavarapu/datamill/http/impl/RequestBuilderImplTest.java @@ -18,6 +18,7 @@ public class RequestBuilderImplTest { @Test public void requestBuilding() { Request request = new RequestBuilderImpl() + .connectTimeout(500) .header(RequestHeader.ACCEPT, "application/json") .header("Content-Type", "application/json") .method(Method.GET) @@ -28,6 +29,7 @@ public void requestBuilding() { assertEquals("application/json", request.header(RequestHeader.CONTENT_TYPE).get().asString()); assertEquals(Method.GET, request.method()); assertEquals("http://sample.com", request.uri()); + assertEquals(500, request.options().get(Request.OPTION_CONNECT_TIMEOUT)); } @Test