You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ne...@apache.org on 2018/06/25 22:07:01 UTC
[trafficcontrol] 02/12: Added debuging statements. Added support
for cancel chaining via futures. Added Close support for TOSession. Fixes
for request build and submit.
This is an automated email from the ASF dual-hosted git repository.
neuman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
commit eac77359b190cf00de9be7fd94f3ce20f273b3a8
Author: nerdynick <ne...@gmail.com>
AuthorDate: Wed Dec 6 12:55:43 2017 -0700
Added debuging statements. Added support for cancel chaining via futures. Added Close support for TOSession. Fixes for request build and submit.
---
traffic_control/clients/java/.gitignore | 1 +
.../cdn/traffic_control/RestApiSession.java | 33 +++++++++++++++++++---
.../com/comcast/cdn/traffic_control/TOSession.java | 31 +++++++++++++++-----
3 files changed, 54 insertions(+), 11 deletions(-)
diff --git a/traffic_control/clients/java/.gitignore b/traffic_control/clients/java/.gitignore
index 0ac589d..7f07816 100644
--- a/traffic_control/clients/java/.gitignore
+++ b/traffic_control/clients/java/.gitignore
@@ -2,3 +2,4 @@
.project
.classpath
.factorypath
+target
diff --git a/traffic_control/clients/java/common/src/main/java/com/comcast/cdn/traffic_control/RestApiSession.java b/traffic_control/clients/java/common/src/main/java/com/comcast/cdn/traffic_control/RestApiSession.java
index 941d4c4..1e140b0 100644
--- a/traffic_control/clients/java/common/src/main/java/com/comcast/cdn/traffic_control/RestApiSession.java
+++ b/traffic_control/clients/java/common/src/main/java/com/comcast/cdn/traffic_control/RestApiSession.java
@@ -3,6 +3,7 @@ package com.comcast.cdn.traffic_control;
import java.io.Closeable;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Future;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
@@ -29,7 +30,6 @@ import com.google.common.collect.ImmutableList;
@AutoValue
public abstract class RestApiSession implements Closeable {
- @SuppressWarnings("unused")
private static final Logger LOG = LoggerFactory.getLogger(RestApiSession.class);
private static final String URL_FORMAT_STR = "%s://%s:%s/%s/%s/%s";
@@ -46,14 +46,18 @@ public abstract class RestApiSession implements Closeable {
public void open() {
if (httpclient == null) {
- RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).build();
+ RequestConfig globalConfig = RequestConfig.custom()
+ .setCookieSpec(CookieSpecs.STANDARD) //User standard instead of default. Default will result in cookie parse exceptions with the Mojolicous cookie
+ .setConnectTimeout(5000)
+ .build();
CookieStore cookieStore = new BasicCookieStore();
HttpClientContext context = HttpClientContext.create();
context.setCookieStore(cookieStore);
httpclient = HttpAsyncClients.custom()
.setDefaultRequestConfig(globalConfig)
- .setDefaultCookieStore(cookieStore).build();
+ .setDefaultCookieStore(cookieStore)
+ .build();
}
if (!httpclient.isRunning()) {
@@ -103,8 +107,12 @@ public abstract class RestApiSession implements Closeable {
private CompletableFuture<HttpResponse> execute(HttpUriRequest request) {
final CompletableFutureCallback future = new CompletableFutureCallback();
try {
+ LOG.debug("Opening RestClient");
this.open();
- this.httpclient.execute(request, future);
+
+ LOG.debug("Dispatching request: {}", request);
+ final Future<HttpResponse> reFuture = this.httpclient.execute(request, future);
+ future.setReFuture(reFuture);
} catch(Throwable e) {
future.completeExceptionally(e);
}
@@ -113,20 +121,37 @@ public abstract class RestApiSession implements Closeable {
}
private class CompletableFutureCallback extends CompletableFuture<HttpResponse> implements FutureCallback<HttpResponse>{
+ private Future<HttpResponse> reFuture;
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ if(reFuture != null) {
+ return reFuture.cancel(mayInterruptIfRunning);
+ }
+ return false;
+ }
+
@Override
public void completed(HttpResponse result) {
+ LOG.debug("Request Completed: {}", result);
this.complete(result);
}
@Override
public void failed(Exception ex) {
+ LOG.debug("Request Failed", ex);
this.completeExceptionally(ex);
}
@Override
public void cancelled() {
+ LOG.debug("Request Cancelled");
this.completeExceptionally(new OperationException("HTTP Request was cancelled"));
}
+
+ public void setReFuture(Future<HttpResponse> reFuture) {
+ this.reFuture = reFuture;
+ }
}
public abstract String host();
diff --git a/traffic_control/clients/java/trafficops/src/main/java/com/comcast/cdn/traffic_control/TOSession.java b/traffic_control/clients/java/trafficops/src/main/java/com/comcast/cdn/traffic_control/TOSession.java
index 82791f4..a5e307c 100644
--- a/traffic_control/clients/java/trafficops/src/main/java/com/comcast/cdn/traffic_control/TOSession.java
+++ b/traffic_control/clients/java/trafficops/src/main/java/com/comcast/cdn/traffic_control/TOSession.java
@@ -1,5 +1,6 @@
package com.comcast.cdn.traffic_control;
+import java.io.Closeable;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Optional;
@@ -23,8 +24,7 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@AutoValue
-public abstract class TOSession {
- @SuppressWarnings("unused")
+public abstract class TOSession implements Closeable {
private static final Logger LOG = LoggerFactory.getLogger(TOSession.class);
private static final Gson gson = new GsonBuilder()
@@ -32,6 +32,10 @@ public abstract class TOSession {
private boolean isLoggedIn = false;
+ public void close() throws IOException {
+ this.restClient().close();
+ }
+
public String toUrl() {
return this.restClient().buildUrl("/");
}
@@ -41,13 +45,14 @@ public abstract class TOSession {
public CompletableFuture<Boolean> login(final String username, final String password) {
final String url = this.restClient().buildUrl("user/login.json");
-
+ LOG.debug("Logging into: {}", url);
return ResponseFuture.builder()
.setHandleException((f,t)-> {
f.completeExceptionally(new LoginException(String.format("Failed to login with username %s", username), t));
})
.setMethod(ResponseFuture.Method.POST)
.setUrl(url)
+ .setSession(this.restClient())
.setBody(gson.toJson(ImmutableMap.<String,String>of("u", username, "p", password))).build()
.thenApply(r->{
isLoggedIn = true;
@@ -89,6 +94,8 @@ public abstract class TOSession {
public abstract RestApiSession session();
public abstract Optional<String> body();
+ private CompletableFuture<HttpResponse> subFuture;
+
public static <T extends Response> Builder<T> builder(Class<T> response) {
return new AutoValue_TOSession_ResponseFuture.Builder<T>()
.setResponseType(response);
@@ -97,13 +104,23 @@ public abstract class TOSession {
return builder(Response.class);
}
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ if(subFuture != null) {
+ return subFuture.cancel(mayInterruptIfRunning);
+ }
+ return false;
+ }
+
public ResponseFuture<T> execute(){
- LOG.debug("Requesting: {} {}", this.method(), this.url());
- RequestBuilder rBuilder = RequestBuilder.create(this.method().toString());
+ RequestBuilder rBuilder = RequestBuilder
+ .create(this.method().toString())
+ .setUri(this.url());
if(this.body().isPresent()) {
rBuilder.setEntity(new StringEntity(this.body().get(), Charsets.UTF_8));
}
- this.session().execute(rBuilder).whenComplete(this);
+ subFuture = this.session().execute(rBuilder);
+ subFuture.whenComplete(this);
return this;
}
@@ -166,7 +183,7 @@ public abstract class TOSession {
public abstract RestApiSession restClient();
- static Builder builder() {
+ public static Builder builder() {
return new AutoValue_TOSession.Builder();
}
public abstract Builder toBuilder();