in sdk/core/azure-core-http-okhttp/src/main/java/com/azure/android/core/http/okhttp/OkHttpAsyncHttpClient.java [57:190]
public void send(HttpRequest httpRequest, CancellationToken cancellationToken, HttpCallback httpCallback) {
okhttp3.Request.Builder okhttpRequestBuilder = new okhttp3.Request.Builder();
okhttpRequestBuilder.url(httpRequest.getUrl());
if (httpRequest.getHeaders() != null) {
Map<String, String> headers = new HashMap<>();
for (HttpHeader hdr : httpRequest.getHeaders()) {
if (hdr.getValue() != null) {
headers.put(hdr.getName(), hdr.getValue());
}
}
okhttpRequestBuilder.headers(okhttp3.Headers.of(headers));
} else {
okhttpRequestBuilder.headers(okhttp3.Headers.of(new HashMap<>()));
}
if (httpRequest.getHttpMethod() == HttpMethod.GET) {
okhttpRequestBuilder.get();
} else if (httpRequest.getHttpMethod() == HttpMethod.HEAD) {
okhttpRequestBuilder.head();
} else {
byte[] content = httpRequest.getBody();
content = content == null ? new byte[0] : content;
final String contentType = httpRequest.getHeaders().getValue("Content-Type");
if (contentType == null) {
okhttpRequestBuilder.method(httpRequest.getHttpMethod().toString(),
RequestBody.create(null, content));
} else {
okhttpRequestBuilder.method(httpRequest.getHttpMethod().toString(),
RequestBody.create(MediaType.parse(contentType), content));
}
}
final okhttp3.Request okHttpRequest = okhttpRequestBuilder.build();
final okhttp3.Call call = httpClient.newCall(okHttpRequest);
final String onCancelId = (cancellationToken == CancellationToken.NONE) ? null : UUID.randomUUID().toString();
if (onCancelId != null) {
// Register an identifiable Runnable to run on cancellationToken.cancel().
//
// This Runnable unregistered once the 'call' completes.
//
// We don't want a cancel on cancellationToken to call call.cancel()
// after the call completion (though call.cancel() after it's completion is nop).
//
cancellationToken.registerOnCancel(onCancelId, () -> call.cancel());
}
call.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException error) {
if (onCancelId != null) {
cancellationToken.unregisterOnCancel(onCancelId);
}
httpCallback.onError(error);
}
@Override
public void onResponse(okhttp3.Call call, Response response) {
if (onCancelId != null) {
cancellationToken.unregisterOnCancel(onCancelId);
}
httpCallback.onSuccess(new HttpResponse(httpRequest) {
private final HttpHeaders headers = fromOkHttpHeaders(response.headers());
private final ResponseBody responseBody = response.body();
@Override
public int getStatusCode() {
return response.code();
}
@Override
public String getHeaderValue(String name) {
return this.headers.getValue(name);
}
@Override
public HttpHeaders getHeaders() {
return this.headers;
}
@Override
public InputStream getBody() {
if (this.responseBody == null) {
return new ByteArrayInputStream(new byte[0]);
} else {
return this.responseBody.byteStream();
}
}
@Override
public byte[] getBodyAsByteArray() {
if (this.responseBody == null) {
return new byte[0];
} else {
try {
return this.responseBody.bytes();
} catch (IOException e) {
throw logger.logExceptionAsError(new RuntimeException(e));
}
}
}
@Override
public String getBodyAsString() {
return bomAwareToString(this.getBodyAsByteArray(),
headers.getValue("Content-Type"));
}
@Override
public void close() {
if (this.responseBody != null) {
this.responseBody.close();
}
}
@Override
public String getBodyAsString(Charset charset) {
return new String(this.getBodyAsByteArray(), charset);
}
private HttpHeaders fromOkHttpHeaders(Headers headers) {
HttpHeaders httpHeaders = new HttpHeaders();
for (String headerName : headers.names()) {
httpHeaders.put(headerName, headers.get(headerName));
}
return httpHeaders;
}
});
}
});
}