package com.example.springbootarbitrage.util;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class HttpRequest {
private static final String METHOD_GET = "GET";
private static final String METHOD_POST = "POST";
private Charset charset = StandardCharsets.UTF_8;
private int connectTimeout;
private int readTimeout;
private boolean doInput;
private boolean doOutput;
private boolean useCaches;
{
connectTimeout = 1000;
readTimeout = 1000;
doInput = true;
doOutput = true;
useCaches = false;
}
private String url;
private URL _url;
private HttpURLConnection connection;
private String responseData;
private int responseCode = 101;
private Map<String, String> parameters = new HashMap<>();
private Map<String, List<String>> headerFields = new HashMap<>();
public HttpRequest(String url) {
this.url = url;
}
private void initConnection() throws IOException {
initUrl();
connection = (HttpURLConnection) _url.openConnection();
connection.setConnectTimeout(connectTimeout);
connection.setReadTimeout(readTimeout);
connection.setDoInput(doInput);
connection.setDoOutput(doOutput);
connection.setUseCaches(useCaches);
}
private void initUrl() throws IOException{
StringBuilder sb = new StringBuilder();
sb.append(url);
if (parameters.size() > 0) {
parameters.forEach((key,value)->{
if (sb.toString().contains("?")) {
sb.append("&")
.append(key)
.append("=")
.append(value);
} else {
sb.append("?")
.append(key)
.append("=")
.append(value);
}
});
}
url = sb.toString();
_url = new URL(url);
}
public void setParameter(String key, String value) {
parameters.put(key, value);
}
public void setCharset(Charset charset) {
this.charset = charset;
}
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
public void get(Map<String, String> properties) throws IOException {
initConnection();
connection.setRequestMethod(METHOD_GET);
properties.forEach(connection::setRequestProperty);
connection.connect();
response();
}
public void post(byte[] data, Map<String, String> properties) throws IOException {
initConnection();
connection.setRequestMethod(METHOD_POST);
properties.forEach(connection::setRequestProperty);
connection.connect();
try (OutputStream os = connection.getOutputStream()) {
os.write(data);
}
response();
}
public void post(String data, Map<String, String> properties) throws IOException {
this.post(data.getBytes(charset), properties);
}
private void response() throws IOException{
StringBuilder sb = new StringBuilder();
try (InputStream inputStream = connection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
) {
String str;
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
}
responseCode = connection.getResponseCode();
headerFields = connection.getHeaderFields();
responseData = sb.toString();
connection.disconnect();
}
public String getResponseData() {
return responseData;
}
public int getResponseCode() {
return responseCode;
}
public Map<String, List<String>> getResponseHeaders(){
return headerFields;
}
}