public HttpResult call(HttpParams params) {
        Pair<HttpClient, HttpMethod> clientMet = generator.generate(params);
        HttpClient client = clientMet.getFirst();
        HttpMethod toCall = clientMet.getSecond();
        HttpResult out = new HttpResult();
        out.statusCode = -1;
        out.sourceParams = params;
        InputStream is = null;
        try {
            if (logger.isEnabled(Level.INFO)) {
                logger.log(Level.INFO, "Running http method " + toCall + " with params " + params);
            }
            caller.execute(client, toCall, params.retries);
            is = toCall.getResponseBodyAsStream();
            String responseBody = IOUtils.toString(is);
            int st = toCall.getStatusCode();
            Header[] hv = toCall.getResponseHeaders();
            // copy over
            out.statusCode = st;
            out.responseBody = responseBody;
            Map<String, String> headersIn = new TreeMap<String, String>();
            if (hv != null) {
                for (Header h : hv) {
                    headersIn.put(h.getName(), h.getValue());
                }
            }
            out.headers = headersIn;
        }
        catch (HttpException e) {
            if (logger.isEnabled(Level.WARN)) {
                logger.log(Level.WARN, e, "Failed calling " + toCall);
            }
        }
        catch (IOException e) {
            if (logger.isEnabled(Level.WARN)) {
                logger.log(Level.WARN, e, "Failed calling " + toCall);
            }
        }
        finally {
            IOUtils.closeQuietly(is);
            toCall.releaseConnection();
        }
        return out;
    }