package com.github.scribejava.httpclient.ning; import com.github.scribejava.core.httpclient.AbstractAsyncOnlyHttpClient; import com.github.scribejava.core.model.OAuthAsyncRequestCallback; import com.github.scribejava.core.model.OAuthConstants; import com.github.scribejava.core.model.OAuthRequest; import com.github.scribejava.core.model.Verb; import com.ning.http.client.AsyncHttpClient; import java.util.Map; import java.util.concurrent.Future; import com.ning.http.client.AsyncHttpClientConfig; import java.io.File; public class NingHttpClient extends AbstractAsyncOnlyHttpClient { private final AsyncHttpClient client; public NingHttpClient(NingHttpClientConfig ningConfig) { final String ningAsyncHttpProviderClassName = ningConfig.getNingAsyncHttpProviderClassName(); AsyncHttpClientConfig config = ningConfig.getConfig(); if (ningAsyncHttpProviderClassName == null) { client = config == null ? new AsyncHttpClient() : new AsyncHttpClient(config); } else { if (config == null) { config = new AsyncHttpClientConfig.Builder().build(); } client = new AsyncHttpClient(ningAsyncHttpProviderClassName, config); } } public NingHttpClient(AsyncHttpClient client) { this.client = client; } @Override public void close() { client.close(); } @Override public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl, byte[] bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) { return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodySetter.BYTE_ARRAY, bodyContents, callback, converter); } @Override public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl, String bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) { return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodySetter.STRING, bodyContents, callback, converter); } @Override public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl, File bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) { return doExecuteAsync(userAgent, headers, httpVerb, completeUrl, BodySetter.FILE, bodyContents, callback, converter); } private <T> Future<T> doExecuteAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl, BodySetter bodySetter, Object bodyContents, OAuthAsyncRequestCallback<T> callback, OAuthRequest.ResponseConverter<T> converter) { AsyncHttpClient.BoundRequestBuilder boundRequestBuilder; switch (httpVerb) { case GET: boundRequestBuilder = client.prepareGet(completeUrl); break; case POST: boundRequestBuilder = client.preparePost(completeUrl); break; case PUT: boundRequestBuilder = client.preparePut(completeUrl); break; case DELETE: boundRequestBuilder = client.prepareDelete(completeUrl); break; default: throw new IllegalArgumentException("message build error: unknown verb type"); } if (httpVerb.isPermitBody()) { if (!headers.containsKey(CONTENT_TYPE)) { boundRequestBuilder = boundRequestBuilder.addHeader(CONTENT_TYPE, DEFAULT_CONTENT_TYPE); } boundRequestBuilder = bodySetter.setBody(boundRequestBuilder, bodyContents); } for (Map.Entry<String, String> header : headers.entrySet()) { boundRequestBuilder.addHeader(header.getKey(), header.getValue()); } if (userAgent != null) { boundRequestBuilder.setHeader(OAuthConstants.USER_AGENT_HEADER_NAME, userAgent); } return boundRequestBuilder.execute(new OAuthAsyncCompletionHandler<>(callback, converter)); } private enum BodySetter { BYTE_ARRAY { @Override AsyncHttpClient.BoundRequestBuilder setBody(AsyncHttpClient.BoundRequestBuilder requestBuilder, Object bodyContents) { return requestBuilder.setBody((byte[]) bodyContents); } }, STRING { @Override AsyncHttpClient.BoundRequestBuilder setBody(AsyncHttpClient.BoundRequestBuilder requestBuilder, Object bodyContents) { return requestBuilder.setBody((String) bodyContents); } }, FILE { @Override AsyncHttpClient.BoundRequestBuilder setBody(AsyncHttpClient.BoundRequestBuilder requestBuilder, Object bodyContents) { return requestBuilder.setBody((File) bodyContents); } }; abstract AsyncHttpClient.BoundRequestBuilder setBody(AsyncHttpClient.BoundRequestBuilder requestBuilder, Object bodyContents); } }