package shedar.mods.ic2.nuclearcontrol.panel.http; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl; import argo.format.CompactJsonFormatter; import argo.format.JsonFormatter; import argo.jdom.JsonArrayNodeBuilder; import argo.jdom.JsonNodeBuilder; import argo.jdom.JsonNodeBuilders; import argo.jdom.JsonObjectNodeBuilder; public class Request implements Runnable { private static final JsonFormatter JSON_FORMATTER = new CompactJsonFormatter(); private final URL url; @SuppressWarnings("rawtypes") private final ConcurrentHashMap<Long, JsonNodeBuilder> unsent; @SuppressWarnings("rawtypes") public Request(URL url, ConcurrentHashMap<Long, JsonNodeBuilder> unsent) { this.url = url; this.unsent = unsent; } private String formatData() { JsonObjectNodeBuilder builder = JsonNodeBuilders.anObjectBuilder(); JsonArrayNodeBuilder array = JsonNodeBuilders.anArrayBuilder(); List<Long> list = new ArrayList<Long>(unsent.keySet()); for (Long key : list) { array.withElement(unsent.get(key)); unsent.remove(key); } builder.withField("key", JsonNodeBuilders.aStringBuilder(IC2NuclearControl.instance.httpSensorKey)).withField("data", array); return JSON_FORMATTER.format(builder.build()); } @Override public void run() { HttpURLConnection connection; try { connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); boolean isIdRequest = unsent == null; if (isIdRequest) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; line = reader.readLine(); if (line != null) { HttpCardSender.instance.availableIds.add(Long.parseLong(line.trim())); } reader.close(); } else { String data = formatData(); byte[] bytes = data.getBytes("UTF-8"); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("charset", "utf-8"); connection.setRequestProperty("Content-Length", "" + bytes.length); DataOutputStream outStream = new DataOutputStream(connection.getOutputStream()); outStream.write(bytes); outStream.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); reader.readLine(); outStream.close(); reader.close(); connection.disconnect(); } } catch (IOException e) { } } }