in src/main/java/com/spotify/google/cloud/pubsub/client/Pubsub.java [848:925]
private <T> PubsubFuture<T> requestJavaNet(final String operation, final HttpMethod method, final String path,
final Object payload, final ResponseReader<T> responseReader) {
final HttpRequestFactory requestFactory = transport.createRequestFactory();
final String uri = baseUri + path;
final HttpHeaders headers = new HttpHeaders();
final HttpRequest request;
try {
request = requestFactory.buildRequest(method.getName(), new GenericUrl(URI.create(uri)), null);
} catch (IOException e) {
throw Throwables.propagate(e);
}
headers.setAuthorization("Bearer " + accessToken);
headers.setUserAgent("Spotify");
final long payloadSize;
if (payload != NO_PAYLOAD) {
final byte[] json = gzipJson(payload);
payloadSize = json.length;
headers.setContentEncoding(GZIP);
headers.setContentLength((long) json.length);
headers.setContentType(APPLICATION_JSON_UTF8);
request.setContent(new ByteArrayContent(APPLICATION_JSON_UTF8, json));
} else {
payloadSize = 0;
}
request.setHeaders(headers);
final RequestInfo requestInfo = RequestInfo.builder()
.operation(operation)
.method(method.toString())
.uri(uri)
.payloadSize(payloadSize)
.build();
final PubsubFuture<T> future = new PubsubFuture<>(requestInfo);
executor.execute(() -> {
final HttpResponse response;
try {
response = request.execute();
} catch (IOException e) {
future.fail(e);
return;
}
// Return null for 404'd GET & DELETE requests
if (response.getStatusCode() == 404 && method == HttpMethod.GET || method == HttpMethod.DELETE) {
future.succeed(null);
return;
}
// Fail on non-2xx responses
final int statusCode = response.getStatusCode();
if (!(statusCode >= 200 && statusCode < 300)) {
future.fail(new RequestFailedException(response.getStatusCode(), response.getStatusMessage()));
return;
}
if (responseReader == VOID) {
future.succeed(null);
return;
}
try {
future.succeed(responseReader.read(ByteStreams.toByteArray(response.getContent())));
} catch (Exception e) {
future.fail(e);
}
});
return future;
}