com.webcerebrium.slack.SlackRequest Maven / Gradle / Ivy
package com.webcerebrium.slack;
import com.google.common.base.Strings;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
@Data
@Slf4j
public class SlackRequest {
public String userAgent = "Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0";
public HttpsURLConnection conn = null;
public String requestUrl = "";
public String method = "GET";
public String lastResponse = "";
public Map headers = new HashMap();
// Internal JSON parser
private JsonParser jsonParser = new JsonParser();
private String requestBody = "";
/**
* Settings method as post, keeping interface fluid
* @return this request object
*/
public SlackRequest post() {
this.setMethod("POST");
return this;
}
/**
* Settings method as PUT, keeping interface fluid
* @return this request object
*/
public SlackRequest put() {
this.setMethod("PUT");
return this;
}
/**
* Settings method as DELETE, keeping interface fluid
* @return this request object
*/
public SlackRequest delete() {
this.setMethod("DELETE");
return this;
}
/**
* Opens HTTPS connection and save connection Handler
@return this request object
* @throws NotificationException in case of any error
*/
public SlackRequest connect(String requestUrl) throws NotificationException {
this.requestUrl = requestUrl;
if (Strings.isNullOrEmpty(requestUrl)) {
throw new NotificationException("Slack Request URL is not provided");
}
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
URL url = null;
try {
url = new URL(requestUrl);
log.debug("{} {}", getMethod(), url);
} catch (MalformedURLException e) {
throw new NotificationException("Mailformed URL " + e.getMessage());
}
SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (NoSuchAlgorithmException e) {
throw new NotificationException("SSL Error " + e.getMessage() );
} catch (KeyManagementException e) {
throw new NotificationException("Key Management Error " + e.getMessage() );
}
try {
conn = (HttpsURLConnection)url.openConnection();
} catch (IOException e) {
throw new NotificationException("HTTPS Connection error " + e.getMessage());
}
try {
conn.setRequestMethod(method);
} catch (ProtocolException e) {
throw new NotificationException("HTTP method error " + e.getMessage());
}
conn.setRequestProperty("User-Agent", getUserAgent());
for(String header: headers.keySet()) {
conn.setRequestProperty(header, headers.get(header));
}
return this;
}
/**
* Saving response into local string variable
* @return this request object
* @throws NotificationException in case of any error
*/
public SlackRequest read() throws NotificationException {
if (conn == null) {
throw new NotificationException("Must be connected before reading");
}
try {
// posting payload it we do not have it yet
if (!Strings.isNullOrEmpty(getRequestBody())) {
log.debug("Payload: {}", getRequestBody());
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
writer.write(getRequestBody());
writer.close();
}
InputStream is;
if (conn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
is = conn.getInputStream();
} else {
/* error from server */
is = conn.getErrorStream();
}
BufferedReader br = new BufferedReader( new InputStreamReader(is));
lastResponse = IOUtils.toString(br);
log.debug("Response: {}", lastResponse);
if (conn.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) {
// Try to parse JSON
JsonObject obj = (JsonObject)jsonParser.parse(lastResponse);
if (obj.has("code") && obj.has("msg")) {
throw new NotificationException("ERROR: " +
obj.get("code").getAsString() + ", " + obj.get("msg").getAsString() );
}
}
} catch (IOException e) {
throw new NotificationException("Error in reading response " + e.getMessage());
}
return this;
}
public SlackRequest payload(JsonObject payload) {
if (payload == null) return this; // this is a valid case
// according to documentation we need to have this header if we have preload
this.requestBody = payload.toString();
headers.put("Content-Type", "application/json");
headers.put("Content-Length", String.valueOf(this.requestBody.length()));
return this;
}
/**
* Getting last response as google JsonObject
* @return response as Json Object
*/
public JsonObject asJsonObject() {
return (JsonObject)jsonParser.parse(getLastResponse());
}
/**
* Getting last response as google GAON JsonArray
* @return response as Json Array
*/
public JsonArray asJsonArray() {
return (JsonArray)jsonParser.parse(getLastResponse());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy