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();