2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.deconz.internal.netutils;
15 import java.io.ByteArrayInputStream;
17 import java.util.concurrent.CompletableFuture;
18 import java.util.concurrent.TimeUnit;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.eclipse.jetty.client.HttpClient;
23 import org.eclipse.jetty.client.HttpResponse;
24 import org.eclipse.jetty.client.api.Request;
25 import org.eclipse.jetty.client.util.BufferingResponseListener;
26 import org.eclipse.jetty.client.util.InputStreamContentProvider;
27 import org.eclipse.jetty.http.HttpMethod;
30 * An asynchronous API for HTTP interactions.
32 * @author David Graeff - Initial contribution
35 public class AsyncHttpClient {
37 private final HttpClient client;
39 public AsyncHttpClient(HttpClient client) {
44 * Perform a POST request
46 * @param address The address
47 * @param jsonString The message body
48 * @param timeout A timeout
51 public CompletableFuture<Result> post(String address, String jsonString, int timeout) {
52 return doNetwork(HttpMethod.POST, address, jsonString, timeout);
56 * Perform a PUT request
58 * @param address The address
59 * @param jsonString The message body
60 * @param timeout A timeout
63 public CompletableFuture<Result> put(String address, @Nullable String jsonString, int timeout) {
64 return doNetwork(HttpMethod.PUT, address, jsonString, timeout);
68 * Perform a GET request
70 * @param address The address
71 * @param timeout A timeout
74 public CompletableFuture<Result> get(String address, int timeout) {
75 return doNetwork(HttpMethod.GET, address, null, timeout);
79 * Perform a DELETE request
81 * @param address The address
82 * @param timeout A timeout
85 public CompletableFuture<Result> delete(String address, int timeout) {
86 return doNetwork(HttpMethod.DELETE, address, null, timeout);
89 private CompletableFuture<Result> doNetwork(HttpMethod method, String address, @Nullable String body, int timeout) {
90 final CompletableFuture<Result> f = new CompletableFuture<>();
91 Request request = client.newRequest(URI.create(address));
93 try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
94 final InputStreamContentProvider inputStreamContentProvider = new InputStreamContentProvider(
95 byteArrayInputStream)) {
96 request.content(inputStreamContentProvider, "application/json");
97 } catch (Exception e) {
98 f.completeExceptionally(e);
103 request.method(method).timeout(timeout, TimeUnit.MILLISECONDS).send(new BufferingResponseListener() {
104 @NonNullByDefault({})
106 public void onComplete(org.eclipse.jetty.client.api.Result result) {
107 final HttpResponse response = (HttpResponse) result.getResponse();
108 if (result.getFailure() != null) {
109 f.completeExceptionally(result.getFailure());
112 f.complete(new Result(getContentAsString(), response.getStatus()));
118 public static class Result {
119 private final String body;
120 private final int responseCode;
122 public Result(String body, int responseCode) {
124 this.responseCode = responseCode;
127 public String getBody() {
131 public int getResponseCode() {