package info.persistent.pushbot.util; import com.google.appengine.api.xmpp.JID; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import java.net.HttpURLConnection; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; public class Hubs { private static final Logger logger = Logger.getLogger(Hubs.class.getName()); private Hubs() { // Not instantiable } public static void sendRequestToHub( JID user, URL hubUrl, URL feedUrl, boolean isSubscribe) { String verb = isSubscribe ? "subscribe" : "unsubscribe"; logger.info( "Sending " + verb + " request to hub " + hubUrl + " for " + feedUrl); try { HttpURLConnection connection = (HttpURLConnection) hubUrl.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writeHubRequestParams(user, feedUrl, verb, writer); writer.close(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_NO_CONTENT || responseCode == HttpURLConnection.HTTP_ACCEPTED) { // Nothing to do in this case logger.info("Successfully sent " + verb + " request to " + hubUrl); } else { logger.info("Could not make " + verb + " request to hub " + hubUrl + " " + responseCode + "/" + connection.getResponseMessage()); StringWriter debugWriter = new StringWriter(); writeHubRequestParams(user, feedUrl, verb, debugWriter); logger.info("Request params: " + debugWriter.toString()); Xmpp.sendMessage(user, "Could not " + verb + " at hub " + hubUrl); } } catch (IOException err) { logger.log(Level.INFO, "Could not " + verb + " to hub " + hubUrl, err); Xmpp.sendMessage(user, "Could not " + verb + " at hub " + hubUrl); } } private static void writeHubRequestParams( JID user, URL feedUrl, String verb, Writer writer) throws IOException { String callbackUrl = "http://push-bot.appspot.com/push-subscriber/" + Urls.encode(Xmpp.toShortJid(user).getId()); writer.write("hub.callback=" + Urls.encode(callbackUrl)); writer.write("&hub.mode=" + verb); writer.write("&hub.topic=" + Urls.encode(feedUrl.toString())); writer.write("&hub.verify=sync"); // TODO(mihaip): Actually use a verification token. writer.write("&hub.verify_token="); } }