package util.match; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; public class MatchPublisher { public static String publishToSpectatorServer(String spectatorURL, Match theMatch) throws IOException { if (theMatch.getGameRepositoryURL().isEmpty()) { throw new IOException("Match doesn't have appropriate metadata for publication to a spectator server: " + theMatch); } else { return performPOST(spectatorURL, theMatch.getSpectatorAuthToken(), theMatch.toJSON()); } } public static String performPOST(String theURL, String theAuth, String theData) throws IOException { String message = URLEncoder.encode(theData, "UTF-8"); try { URL url = new URL(theURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write("AUTH=" + theAuth + "&DATA=" + message); writer.close(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { return new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine(); } else { throw new IOException(connection.getResponseMessage()); } } catch (MalformedURLException e) { throw new IOException(e); } catch (IOException e) { throw e; } } static class MatchPublisherThread extends Thread { private Match theMatch; private String spectatorURL; public MatchPublisherThread(String spectatorURL, Match theMatch) { this.theMatch = theMatch; this.spectatorURL = spectatorURL; } @Override public void run() { try { MatchPublisher.publishToSpectatorServer(spectatorURL, theMatch); } catch (IOException e) { e.printStackTrace(); } } } public static void publishToSpectatorServerAsync(String spectatorURL, Match theMatch) throws IOException { MatchPublisherThread theThread = new MatchPublisherThread(spectatorURL, theMatch); theThread.start(); } }