event-publisher-library/src/main/java/org/gcube/event/publisher/HTTPEventSender.java

113 lines
4.1 KiB
Java

package org.gcube.event.publisher;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.gcube.oidc.rest.JWTToken;
import org.gcube.oidc.rest.OpenIdConnectRESTHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HTTPEventSender implements EventSender {
protected static final Logger log = LoggerFactory.getLogger(HTTPEventSender.class);
private URL endpoint;
private String clientId;
private String clientSecret;
private URL tokenURL;
public HTTPEventSender(URL endpointURL, String clientId, String clientSecret, URL tokenURL) {
this.endpoint = endpointURL;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.tokenURL = tokenURL;
}
@Override
public void send(Event event) {
if (log.isDebugEnabled()) {
log.debug("Starting HTTP POST thread to: " + endpoint);
}
try {
URL eventEndpoint = new URL(endpoint, event.getName());
new Thread(new HTTPost(eventEndpoint, event.toJSONString())).start();
} catch (MalformedURLException e) {
log.error("Cannot compute event endpoint URL. Event name: " + event.getName() + ", base endpoint: "
+ endpoint, e);
}
}
public class HTTPost implements Runnable {
private URL endpoint;
private String jsonString;
public HTTPost(URL endpoint, String jsonString) {
this.jsonString = jsonString;
}
@Override
public void run() {
try {
if (log.isDebugEnabled()) {
log.debug("Getting token for client: " + clientId);
}
JWTToken token = OpenIdConnectRESTHelper.queryClientToken(clientId, clientSecret, tokenURL);
if (log.isTraceEnabled()) {
log.trace("Performing HTTP POST");
}
HttpURLConnection con = (HttpURLConnection) endpoint.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("Method", "POST");
con.setRequestProperty("Authorization", token.getAsBearer());
OutputStream os = con.getOutputStream();
if (log.isTraceEnabled()) {
log.trace("Sending event JSON");
}
os.write(jsonString.getBytes("UTF-8"));
os.close();
StringBuilder sb = new StringBuilder();
int httpResultCode = con.getResponseCode();
if (log.isTraceEnabled()) {
log.trace("HTTP Response code: " + httpResultCode);
}
if (log.isTraceEnabled()) {
log.trace("Reading response");
}
boolean ok = true;
InputStreamReader isr = null;
if (httpResultCode == HttpURLConnection.HTTP_OK) {
isr = new InputStreamReader(con.getInputStream(), "UTF-8");
} else {
ok = false;
isr = new InputStreamReader(con.getErrorStream(), "UTF-8");
}
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
if (ok) {
if (log.isDebugEnabled()) {
log.debug("Event publish OK. Results: " + sb.toString());
}
} else {
log.error("Event publish KO. Results: " + sb.toString());
}
} catch (Exception e) {
log.error("POSTing JSON to: " + endpoint, e);
}
}
}
}