protected HttpResponse httpCall(Input input) throws Exception {
        RestTemplate restTemplate = restTemplateProvider.getRestTemplate(input);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.valueOf(input.getContentType()));
        headers.setAccept(Collections.singletonList(MediaType.valueOf(input.getAccept())));

        input.headers.forEach(
                (key, value) -> {
                    if (value != null) {
                        headers.add(key, value.toString());
                    }
                });

        HttpEntity<Object> request = new HttpEntity<>(input.getBody(), headers);

        HttpResponse response = new HttpResponse();
        try {
            ResponseEntity<String> responseEntity =
                    restTemplate.exchange(input.getUri(), input.getMethod(), request, String.class);
            if (responseEntity.getStatusCode().is2xxSuccessful() && responseEntity.hasBody()) {
                response.body = extractBody(responseEntity.getBody());
            }

            response.statusCode = responseEntity.getStatusCodeValue();
            response.reasonPhrase = responseEntity.getStatusCode().getReasonPhrase();
            response.headers = responseEntity.getHeaders();
            return response;
        } catch (RestClientException ex) {
            LOGGER.error(
                    String.format(
                            "Got unexpected http response - uri: %s, vipAddress: %s",
                            input.getUri(), input.getVipAddress()),
                    ex);
            String reason = ex.getLocalizedMessage();
            LOGGER.error(reason, ex);
            throw new Exception(reason);
        }
    }
@param input HTTP Request
@return Response of the http call
@throws Exception If there was an error making http call Note: protected access is so that
    tasks extended from this task can re-use this to make http calls
http-task/src/main/java/com/netflix/conductor/tasks/http/HttpTask.java