Skip to content

Instantly share code, notes, and snippets.

@nucleartide
Created June 17, 2015 16:25
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nucleartide/24628083decb65a4562c to your computer and use it in GitHub Desktop.
Save nucleartide/24628083decb65a4562c to your computer and use it in GitHub Desktop.
Example of using Retrofit with digest auth
package movida;
import org.apache.http.HttpEntity;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import retrofit.client.Client;
import retrofit.client.Header;
import retrofit.mime.TypedByteArray;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MovidaClient implements Client {
private final CloseableHttpClient client;
public MovidaClient(String user, String pass, String hostname,
String scope, int threadCount) {
Credentials credentials = new UsernamePasswordCredentials(user, pass);
AuthScope authScope = new AuthScope(hostname, 443, scope);
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(authScope, credentials);
PoolingHttpClientConnectionManager connectionManager = new
PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(threadCount * 2);
connectionManager.setDefaultMaxPerRoute(threadCount);
client = clientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setConnectionManager(connectionManager)
.build();
}
private byte[] toByteArray(HttpEntity entity) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
entity.writeTo(bos);
return bos.toByteArray();
}
private List<Header> toRetrofitHeaders(org.apache.http.Header[] headers) {
List<Header> retrofitHeaders = new ArrayList<>();
for (org.apache.http.Header header : headers) {
retrofitHeaders.add(new Header(header.getName(), header.getValue()));
}
return retrofitHeaders;
}
@Override public retrofit.client.Response execute(
retrofit.client.Request request) throws IOException {
// Get body of request.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
if (request.getBody() != null) {
request.getBody().writeTo(bos);
}
String body = new String(bos.toByteArray());
// Which HTTP method are we using?
HttpUriRequest wrappedRequest;
String method = request.getMethod();
switch (method) {
case "GET":
wrappedRequest = new HttpGet(request.getUrl());
break;
case "POST":
wrappedRequest = new HttpPost(request.getUrl());
wrappedRequest.addHeader("Content-Type", "application/xml");
((HttpPost) wrappedRequest).setEntity(new StringEntity(body));
break;
case "PUT":
wrappedRequest = new HttpPut(request.getUrl());
wrappedRequest.addHeader("Content-Type", "application/xml");
((HttpPut) wrappedRequest).setEntity(new StringEntity(body));
break;
case "DELETE":
wrappedRequest = new HttpDelete(request.getUrl());
break;
default:
throw new AssertionError("HTTP operation not supported.");
}
// Perform the HTTP request.
CloseableHttpResponse response = null;
try {
response = client.execute(wrappedRequest);
// Return a Retrofit response.
List<Header> retrofitHeaders = toRetrofitHeaders(
response.getAllHeaders());
TypedByteArray responseBody;
if (response.getEntity() != null) {
responseBody = new TypedByteArray(MovidaXMLConverter.MIME_TYPE,
toByteArray(response.getEntity()));
} else {
responseBody = new TypedByteArray(MovidaXMLConverter.MIME_TYPE,
new byte[0]);
}
System.out.println("this is the response");
System.out.println(new String(responseBody.getBytes()));
return new retrofit.client.Response(request.getUrl(),
response.getStatusLine().getStatusCode(),
response.getStatusLine().getReasonPhrase(), retrofitHeaders,
responseBody);
} finally {
if (response != null) {
response.close();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment