Created
June 17, 2015 16:25
-
-
Save nucleartide/24628083decb65a4562c to your computer and use it in GitHub Desktop.
Example of using Retrofit with digest auth
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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