@Override
  protected HttpResponse invoke(Request nativeRequest) throws IOException, InterruptedException {
    OkHttpClient requestScopedClient = globalClient.clone();
    requestScopedClient.setProxy(proxyForURI.apply(nativeRequest.uri()));

    Response response = requestScopedClient.newCall(nativeRequest).execute();

    HttpResponse.Builder<?> builder = HttpResponse.builder();
    builder.statusCode(response.code());
    builder.message(response.message());

    Builder<String, String> headerBuilder = ImmutableMultimap.builder();
    Headers responseHeaders = response.headers();
    for (String header : responseHeaders.names()) {
      headerBuilder.putAll(header, responseHeaders.values(header));
    }

    ImmutableMultimap<String, String> headers = headerBuilder.build();

    if (response.code() == 204 && response.body() != null) {
      response.body().close();
    } else {
      Payload payload = newInputStreamPayload(response.body().byteStream());
      contentMetadataCodec.fromHeaders(payload.getContentMetadata(), headers);
      builder.payload(payload);
    }

    builder.headers(filterOutContentHeaders(headers));

    return builder.build();
  }
  @Override
  protected HttpResponse invoke(HttpURLConnection connection)
      throws IOException, InterruptedException {
    HttpResponse.Builder<?> builder = HttpResponse.builder();
    InputStream in = null;
    try {
      in = consumeOnClose(connection.getInputStream());
    } catch (IOException e) {
      in = bufferAndCloseStream(connection.getErrorStream());
    } catch (RuntimeException e) {
      closeQuietly(in);
      throw propagate(e);
    }

    int responseCode = connection.getResponseCode();
    if (responseCode == 204) {
      closeQuietly(in);
      in = null;
    }
    builder.statusCode(responseCode);
    builder.message(connection.getResponseMessage());

    Builder<String, String> headerBuilder = ImmutableMultimap.builder();
    for (Map.Entry<String, List<String>> entry : connection.getHeaderFields().entrySet()) {
      String header = entry.getKey();
      // HTTP message comes back as a header without a key
      if (header != null) headerBuilder.putAll(header, entry.getValue());
    }
    ImmutableMultimap<String, String> headers = headerBuilder.build();
    if (in != null) {
      Payload payload = newInputStreamPayload(in);
      contentMetadataCodec.fromHeaders(payload.getContentMetadata(), headers);
      builder.payload(payload);
    }
    builder.headers(filterOutContentHeaders(headers));
    return builder.build();
  }