import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import org.apache.http.Header;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultServiceUnavailableRetryStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
public class HttpClientWrapper {
private static HttpClientBuilder cb = null;
public final static synchronized void initClientBuilder(int requestTimeout, int retryCount, int retryTimeout) {
if (cb==null) {
cb = HttpClientBuilder.create();
cb.setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE);
cb.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE);
cb.setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(retryCount, retryTimeout));
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(requestTimeout)
.setConnectionRequestTimeout(requestTimeout).build();
cb.setDefaultRequestConfig(requestConfig);
}
}
private static HashMap<String,HttpClientContext> contextCache = new HashMap<String, HttpClientContext>();
private static HashMap<String,CloseableHttpClient> clientCache = new HashMap<String, CloseableHttpClient>();
public static synchronized void setAuthContext(String cookie, String user, String pass, String domain) {
if (contextCache.get(cookie) == null) {
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),
new NTCredentials(user, pass, "localhost", domain));
AuthCache authCache = new BasicAuthCache();
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
contextCache.put(cookie, context);
}
}
public static synchronized CloseableHttpClient getClient(String cookie) {
CloseableHttpClient cli = clientCache.get(cookie);
if (cli==null) {
cli = cb.build();
clientCache.put(cookie, cli);
}
return cli;
}
public final static String requestReply(String cookie, String fullUrl, final String verb, String payload, final String payloadType) throws ClientProtocolException, IOException {
CloseableHttpClient cli = getClient(cookie);
HttpUriRequest httpRequest = null;
if ("GET".equalsIgnoreCase(verb)) {
httpRequest = new HttpGet(fullUrl);
}
else {
HttpPost post = new HttpPost(fullUrl) {
@Override
public String getMethod() {
return verb;
}
};
if (payload != null) {
final byte[] content = payload.getBytes("UTF-8");
post.setEntity(new AbstractHttpEntity() {
@Override
public void writeTo(OutputStream outputstream) throws IOException {
outputstream.write(content);
}
@Override
public boolean isStreaming() {
return false;
}
@Override
public boolean isRepeatable() {
return false;
}
@Override
public long getContentLength() {
return content.length;
}
@Override
public Header getContentType() {
return new BasicHeader("Content-Type", payloadType);
}
@Override
public InputStream getContent() throws IOException, IllegalStateException {
return new ByteArrayInputStream(content);
}
});
}
httpRequest = post;
}
CloseableHttpResponse response = cli.execute(httpRequest, contextCache.get(cookie));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
response.getEntity().writeTo(baos);
return baos.toString("UTF-8");
}
public final static void main(String[] args) throws Exception, Exception {
initClientBuilder(60000, 3, 3000);
setAuthContext("GET", "jan.kowalski", "passw0rd", "ENTERPRISE");
System.out.println(requestReply("GET",
"https://crm-test/XRMServices/2011/OrganizationData.svc/AccountSet",
"GET", null, null)
);
}
}
poniedziałek, grudnia 09, 2013
Apache HTTPClient 4.3 + NTLM
Subskrybuj:
Komentarze do posta (Atom)
0 komentarze:
Prześlij komentarz