package edu.washington.cs.oneswarm.ui.gwt.server.community; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.List; import java.util.logging.Logger; import org.json.JSONWriter; import com.google.common.base.Preconditions; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import edu.washington.cs.oneswarm.ui.gwt.rpc.CommunityRecord; // TODO(piatek): Add support for callbacks/error handling for puts. For now, all best-effort. public class CHTPutOp extends CommunityServerOperation { private static Logger logger = Logger.getLogger(CHTPutOp.class.getName()); private final List<byte[]> values; private final List<byte[]> keys; public CHTPutOp(CommunityRecord record, List<byte[]> keys, List<byte[]> values) { super(record); this.keys = keys; this.values = values; } @Override void doOp() { Preconditions.checkState(mRecord.isAllowAddressResolution(), "Attempting CHTPut on server without perms: " + mRecord.getBaseURL()); Preconditions.checkState(mRecord.getCht_path() != null, "Attempting CHTPut on server without a valid CHT path! " + mRecord.getBaseURL()); String path = mRecord.getBaseURL(); if (path.endsWith("/") == false) { path += "/"; } path += mRecord.getCht_path() + "?put"; try { URL url = new URL(path); HttpURLConnection conn = getConnection(url, "POST"); // JSON array of key, value pairs. ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(baos); JSONWriter writer = new JSONWriter(outputStreamWriter); writer.array(); for (int i = 0; i < keys.size(); i++) { writer.array(); String encodedKey = Base64.encode(keys.get(i)); writer.value(encodedKey); String encodedValue = Base64.encode(values.get(i)); writer.value(encodedValue); writer.endArray(); } writer.endArray(); outputStreamWriter.flush(); System.out.println(baos.toString() + "\n"); conn.getOutputStream().write( ("q=" + URLEncoder.encode(baos.toString(), "UTF-8")).getBytes()); System.out.println("CHT put response code: " + conn.getResponseCode() + " / " + conn.getResponseMessage()); } catch (Exception e) { e.printStackTrace(); logger.warning("Error during CHT Put on server: " + mRecord.getBaseURL() + " / " + e.toString()); } } }