Search in sources :

Example 1 with AuthenticationHandler

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) {
            }
        }
    }
}
Also used : BasicHttpContext(org.apache.http.protocol.BasicHttpContext) GZIPInputStream(java.util.zip.GZIPInputStream) StringEntity(org.apache.http.entity.StringEntity) MultipartEntity(org.apache.http.entity.mime.MultipartEntity) BasicNameValuePair(org.apache.http.message.BasicNameValuePair) AuthenticationHandler(org.apache.http.client.AuthenticationHandler) FileBody(org.apache.http.entity.mime.content.FileBody) GZIPInputStream(java.util.zip.GZIPInputStream) BasicHttpContext(org.apache.http.protocol.BasicHttpContext) HttpContext(org.apache.http.protocol.HttpContext) UrlEncodedFormEntity(org.apache.http.client.entity.UrlEncodedFormEntity)

Aggregations

GZIPInputStream (java.util.zip.GZIPInputStream)1 AuthenticationHandler (org.apache.http.client.AuthenticationHandler)1 UrlEncodedFormEntity (org.apache.http.client.entity.UrlEncodedFormEntity)1 StringEntity (org.apache.http.entity.StringEntity)1 MultipartEntity (org.apache.http.entity.mime.MultipartEntity)1 FileBody (org.apache.http.entity.mime.content.FileBody)1 BasicNameValuePair (org.apache.http.message.BasicNameValuePair)1 BasicHttpContext (org.apache.http.protocol.BasicHttpContext)1 HttpContext (org.apache.http.protocol.HttpContext)1