use of org.apache.http.client.AuthenticationHandler in project FBReaderJ by geometer.
the class ZLNetworkManager method perform.
void perform(ZLNetworkRequest request, BearerAuthenticator authenticator, int socketTimeout, int connectionTimeout) throws ZLNetworkException {
boolean success = false;
DefaultHttpClient httpClient = null;
HttpEntity entity = null;
try {
final HttpContext httpContext = new BasicHttpContext();
httpContext.setAttribute(ClientContext.COOKIE_STORE, CookieStore);
request.doBefore();
final HttpParams params = new BasicHttpParams();
HttpConnectionParams.setSoTimeout(params, socketTimeout);
HttpConnectionParams.setConnectionTimeout(params, connectionTimeout);
httpClient = new DefaultHttpClient(params) {
protected AuthenticationHandler createTargetAuthenticationHandler() {
final AuthenticationHandler base = super.createTargetAuthenticationHandler();
return new AuthenticationHandler() {
public Map<String, Header> getChallenges(HttpResponse response, HttpContext context) throws MalformedChallengeException {
return base.getChallenges(response, context);
}
public boolean isAuthenticationRequested(HttpResponse response, HttpContext context) {
return base.isAuthenticationRequested(response, context);
}
public AuthScheme selectScheme(Map<String, Header> challenges, HttpResponse response, HttpContext context) throws AuthenticationException {
try {
return base.selectScheme(challenges, response, context);
} catch (AuthenticationException e) {
final Header bearerHeader = challenges.get("bearer");
if (bearerHeader != null) {
String realm = null;
for (HeaderElement elt : bearerHeader.getElements()) {
final String name = elt.getName();
if (name == null) {
continue;
}
if ("realm".equals(name) || name.endsWith(" realm")) {
realm = elt.getValue();
break;
}
}
throw new BearerAuthenticationException(realm, response.getEntity());
}
throw e;
}
}
};
}
};
final HttpRequestBase httpRequest;
if (request instanceof ZLNetworkRequest.Get) {
httpRequest = new HttpGet(request.URL);
} else if (request instanceof ZLNetworkRequest.PostWithBody) {
httpRequest = new HttpPost(request.URL);
((HttpPost) httpRequest).setEntity(new StringEntity(((ZLNetworkRequest.PostWithBody) request).Body, "utf-8"));
/*
httpConnection.setRequestProperty(
"Content-Length",
Integer.toString(request.Body.getBytes().length)
);
*/
} else if (request instanceof ZLNetworkRequest.PostWithMap) {
final Map<String, String> parameters = ((ZLNetworkRequest.PostWithMap) request).PostParameters;
httpRequest = new HttpPost(request.URL);
final List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(parameters.size());
for (Map.Entry<String, String> entry : parameters.entrySet()) {
list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
((HttpPost) httpRequest).setEntity(new UrlEncodedFormEntity(list, "utf-8"));
} else if (request instanceof ZLNetworkRequest.FileUpload) {
final ZLNetworkRequest.FileUpload uploadRequest = (ZLNetworkRequest.FileUpload) request;
final File file = ((ZLNetworkRequest.FileUpload) request).File;
httpRequest = new HttpPost(request.URL);
final MultipartEntity data = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, Charset.forName("utf-8"));
data.addPart("file", new FileBody(uploadRequest.File));
((HttpPost) httpRequest).setEntity(data);
} else {
throw new ZLNetworkException("Unknown request type");
}
httpRequest.setHeader("User-Agent", ZLNetworkUtil.getUserAgent());
if (!request.isQuiet()) {
httpRequest.setHeader("X-Accept-Auto-Login", "True");
}
httpRequest.setHeader("Accept-Encoding", "gzip");
httpRequest.setHeader("Accept-Language", ZLResource.getLanguage());
for (Map.Entry<String, String> header : request.Headers.entrySet()) {
httpRequest.setHeader(header.getKey(), header.getValue());
}
httpClient.setCredentialsProvider(new MyCredentialsProvider(httpRequest, request.isQuiet()));
final HttpResponse response = execute(httpClient, httpRequest, httpContext, authenticator);
entity = response.getEntity();
if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_UNAUTHORIZED) {
final AuthState state = (AuthState) httpContext.getAttribute(ClientContext.TARGET_AUTH_STATE);
if (state != null) {
final AuthScopeKey key = new AuthScopeKey(state.getAuthScope());
if (myCredentialsCreator.removeCredentials(key)) {
entity = null;
}
}
}
final int responseCode = response.getStatusLine().getStatusCode();
InputStream stream = null;
if (entity != null && (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_PARTIAL)) {
stream = entity.getContent();
}
if (stream != null) {
try {
final Header encoding = entity.getContentEncoding();
if (encoding != null && "gzip".equalsIgnoreCase(encoding.getValue())) {
stream = new GZIPInputStream(stream);
}
request.handleStream(stream, (int) entity.getContentLength());
} finally {
stream.close();
}
success = true;
} else {
if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
throw new ZLNetworkAuthenticationException();
} else {
throw new ZLNetworkException(response.getStatusLine().toString());
}
}
} catch (ZLNetworkException e) {
throw e;
} catch (IOException e) {
e.printStackTrace();
final String code;
if (e instanceof UnknownHostException) {
code = ZLNetworkException.ERROR_RESOLVE_HOST;
} else {
code = ZLNetworkException.ERROR_CONNECT_TO_HOST;
}
throw ZLNetworkException.forCode(code, ZLNetworkUtil.hostFromUrl(request.URL), e);
} catch (Exception e) {
e.printStackTrace();
throw new ZLNetworkException(e.getMessage(), e);
} finally {
request.doAfter(success);
if (httpClient != null) {
httpClient.getConnectionManager().shutdown();
}
if (entity != null) {
try {
entity.consumeContent();
} catch (IOException e) {
}
}
}
}
Aggregations