docs: protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
  			ResponseExtractor<T> responseExtractor) throws RestClientException {
  
  		Assert.notNull(url, "'url' must not be null");
  		Assert.notNull(method, "'method' must not be null");
  		ClientHttpResponse response = null;
  		try {
  			ClientHttpRequest request = createRequest(url, method);
  			if (requestCallback != null) {
  				requestCallback.doWithRequest(request);
  			}
  			response = request.execute();
  			if (!getErrorHandler().hasError(response)) {
  				logResponseStatus(method, url, response);
  			}
  			else {
  				handleResponseError(method, url, response);
  			}
  			if (responseExtractor != null) {
  				return responseExtractor.extractData(response);
  			}
  			else {
  				return null;
  			}
  		}
  		catch (IOException ex) {
  			throw new ResourceAccessException("I/O error on " + method.name() +
  					" request for \"" + url + "\": " + ex.getMessage(), ex);
  		}
  		finally {
  			if (response != null) {
  				response.close();
  			}
  		}
  	}