CloseableHttpClient 源碼

來源:互聯網
上載者:User

標籤:http   os   io   for   ar   cti   div   amp   

public abstract class CloseableHttpClient implements HttpClient, Closeable {    private final Log log = LogFactory.getLog(getClass());    protected abstract CloseableHttpResponse doExecute(HttpHost target, HttpRequest request,            HttpContext context) throws IOException, ClientProtocolException;    /**     * {@inheritDoc}     */    public CloseableHttpResponse execute(            final HttpHost target,            final HttpRequest request,            final HttpContext context) throws IOException, ClientProtocolException {        return doExecute(target, request, context);    }    /**     * {@inheritDoc}     */    public CloseableHttpResponse execute(            final HttpUriRequest request,            final HttpContext context) throws IOException, ClientProtocolException {        Args.notNull(request, "HTTP request");        return doExecute(determineTarget(request), request, context);    }    private static HttpHost determineTarget(final HttpUriRequest request) throws ClientProtocolException {        // A null target may be acceptable if there is a default target.        // Otherwise, the null target is detected in the director.        HttpHost target = null;        final URI requestURI = request.getURI();        if (requestURI.isAbsolute()) {            target = URIUtils.extractHost(requestURI);            if (target == null) {                throw new ClientProtocolException("URI does not specify a valid host name: "                        + requestURI);            }        }        return target;    }    /**     * {@inheritDoc}     */    public CloseableHttpResponse execute(            final HttpUriRequest request) throws IOException, ClientProtocolException {        return execute(request, (HttpContext) null);    }    /**     * {@inheritDoc}     */    public CloseableHttpResponse execute(            final HttpHost target,            final HttpRequest request) throws IOException, ClientProtocolException {        return doExecute(target, request, (HttpContext) null);    }    /**     * Executes a request using the default context and processes the     * response using the given response handler. The content entity associated     * with the response is fully consumed and the underlying connection is     * released back to the connection manager automatically in all cases     * relieving individual {@link ResponseHandler}s from having to manage     * resource deallocation internally.     *     * @param request   the request to execute     * @param responseHandler the response handler     *     * @return  the response object as generated by the response handler.     * @throws IOException in case of a problem or the connection was aborted     * @throws ClientProtocolException in case of an http protocol error     */    public <T> T execute(final HttpUriRequest request,            final ResponseHandler<? extends T> responseHandler) throws IOException,            ClientProtocolException {        return execute(request, responseHandler, null);    }    /**     * Executes a request using the default context and processes the     * response using the given response handler. The content entity associated     * with the response is fully consumed and the underlying connection is     * released back to the connection manager automatically in all cases     * relieving individual {@link ResponseHandler}s from having to manage     * resource deallocation internally.     *     * @param request   the request to execute     * @param responseHandler the response handler     * @param context   the context to use for the execution, or     *                  <code>null</code> to use the default context     *     * @return  the response object as generated by the response handler.     * @throws IOException in case of a problem or the connection was aborted     * @throws ClientProtocolException in case of an http protocol error     */    public <T> T execute(final HttpUriRequest request,            final ResponseHandler<? extends T> responseHandler, final HttpContext context)            throws IOException, ClientProtocolException {        final HttpHost target = determineTarget(request);        return execute(target, request, responseHandler, context);    }    /**     * Executes a request using the default context and processes the     * response using the given response handler. The content entity associated     * with the response is fully consumed and the underlying connection is     * released back to the connection manager automatically in all cases     * relieving individual {@link ResponseHandler}s from having to manage     * resource deallocation internally.     *     * @param target    the target host for the request.     *                  Implementations may accept <code>null</code>     *                  if they can still determine a route, for example     *                  to a default target or by inspecting the request.     * @param request   the request to execute     * @param responseHandler the response handler     *     * @return  the response object as generated by the response handler.     * @throws IOException in case of a problem or the connection was aborted     * @throws ClientProtocolException in case of an http protocol error     */    public <T> T execute(final HttpHost target, final HttpRequest request,            final ResponseHandler<? extends T> responseHandler) throws IOException,            ClientProtocolException {        return execute(target, request, responseHandler, null);    }    /**     * Executes a request using the default context and processes the     * response using the given response handler. The content entity associated     * with the response is fully consumed and the underlying connection is     * released back to the connection manager automatically in all cases     * relieving individual {@link ResponseHandler}s from having to manage     * resource deallocation internally.     *     * @param target    the target host for the request.     *                  Implementations may accept <code>null</code>     *                  if they can still determine a route, for example     *                  to a default target or by inspecting the request.     * @param request   the request to execute     * @param responseHandler the response handler     * @param context   the context to use for the execution, or     *                  <code>null</code> to use the default context     *     * @return  the response object as generated by the response handler.     * @throws IOException in case of a problem or the connection was aborted     * @throws ClientProtocolException in case of an http protocol error     */    public <T> T execute(final HttpHost target, final HttpRequest request,            final ResponseHandler<? extends T> responseHandler, final HttpContext context)            throws IOException, ClientProtocolException {        Args.notNull(responseHandler, "Response handler");        final HttpResponse response = execute(target, request, context);        final T result;        try {            result = responseHandler.handleResponse(response);        } catch (final Exception t) {            final HttpEntity entity = response.getEntity();            try {                EntityUtils.consume(entity);            } catch (final Exception t2) {                // Log this exception. The original exception is more                // important and will be thrown to the caller.                this.log.warn("Error consuming content after an exception.", t2);            }            if (t instanceof RuntimeException) {                throw (RuntimeException) t;            }            if (t instanceof IOException) {                throw (IOException) t;            }            throw new UndeclaredThrowableException(t);        }        // Handling the response was successful. Ensure that the content has        // been fully consumed.        final HttpEntity entity = response.getEntity();        EntityUtils.consume(entity);        return result;    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.