Skip to content

Commit

Permalink
[homematic] Use async Jetty http request to support larger buffers (o…
Browse files Browse the repository at this point in the history
…penhab#7473)

Solves openhab#6963

Signed-off-by: Martin Herbst <develop@mherbst.de>
  • Loading branch information
MHerbst authored and andrewfg committed Aug 31, 2020
1 parent edb7ea0 commit 95df57f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
public abstract class RpcClient<T> {
private final Logger logger = LoggerFactory.getLogger(RpcClient.class);
protected static final int MAX_RPC_RETRY = 1;
protected static final int RESP_BUFFER_SIZE = 8192;

protected HomematicConfig config;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,17 @@
package org.openhab.binding.homematic.internal.communicator.client;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.api.Response;
import org.eclipse.jetty.client.util.BytesContentProvider;
import org.eclipse.jetty.client.util.InputStreamResponseListener;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus;
import org.openhab.binding.homematic.internal.common.HomematicConfig;
import org.openhab.binding.homematic.internal.communicator.message.RpcRequest;
import org.openhab.binding.homematic.internal.communicator.message.XmlRpcRequest;
Expand Down Expand Up @@ -79,17 +83,31 @@ private synchronized Object[] sendMessage(int port, RpcRequest<String> request,
if (port == config.getGroupPort()) {
url += "/groups";
}
ContentResponse response = httpClient.POST(url).content(content)
.timeout(config.getTimeout(), TimeUnit.SECONDS)
.header(HttpHeader.CONTENT_TYPE, "text/xml;charset=" + config.getEncoding()).send();

InputStreamResponseListener respListener = new InputStreamResponseListener();
httpClient.POST(url).content(content)
.header(HttpHeader.CONTENT_TYPE, "text/xml;charset=" + config.getEncoding()).send(respListener);
Response resp = respListener.get(config.getTimeout(), TimeUnit.SECONDS);
ByteArrayOutputStream respData = new ByteArrayOutputStream(RESP_BUFFER_SIZE);
int httpStatus = resp.getStatus();
if (httpStatus == HttpStatus.OK_200) {
byte[] recvBuffer = new byte[RESP_BUFFER_SIZE];
InputStream input = respListener.getInputStream();
while (true) {
int read = input.read(recvBuffer);
if (read == -1) {
break;
}
respData.write(recvBuffer, 0, read);
}
} else {
logger.warn("XmlRpcRequest failure, status code: {} / request was: {}", httpStatus, request);
resp.abort(new Exception());
}
if (logger.isTraceEnabled()) {
String result = new String(response.getContent(), config.getEncoding());
logger.trace("Client XmlRpcResponse (port {}):\n{}", port, result);
logger.trace("Client XmlRpcResponse: (port {}):\n{}", port, respData.toString(config.getEncoding()));
}

Object[] data = new XmlRpcResponse(new ByteArrayInputStream(response.getContent()),
config.getEncoding()).getResponseData();
Object[] data = new XmlRpcResponse(new ByteArrayInputStream(respData.toByteArray()), config.getEncoding())
.getResponseData();
return new RpcResponseParser(request).parse(data);
} catch (UnknownRpcFailureException | UnknownParameterSetException ex) {
throw ex;
Expand Down

0 comments on commit 95df57f

Please sign in to comment.