package peergos.shared.user; import peergos.shared.io.ipfs.api.*; import peergos.shared.util.*; import java.io.*; import java.net.*; import java.util.*; import java.util.concurrent.*; import java.util.zip.*; public class JavaPoster implements HttpPoster { private final URL dht; public JavaPoster(URL dht) { this.dht = dht; } public URL buildURL(String method) throws IOException { try { return new URL(dht, method); } catch (MalformedURLException mexican) { throw new IOException(mexican); } } @Override public CompletableFuture<byte[]> postUnzip(String url, byte[] payload) { return post(url, payload, true); } @Override public CompletableFuture<byte[]> post(String url, byte[] payload, boolean unzip) { HttpURLConnection conn = null; CompletableFuture<byte[]> res = new CompletableFuture<>(); try { conn = (HttpURLConnection) buildURL(url).openConnection(); conn.setDoInput(true); conn.setDoOutput(true); DataOutputStream dout = new DataOutputStream(conn.getOutputStream()); dout.write(payload); dout.flush(); String contentEncoding = conn.getContentEncoding(); boolean isGzipped = "gzip".equals(contentEncoding); DataInputStream din = new DataInputStream(isGzipped && unzip ? new GZIPInputStream(conn.getInputStream()) : conn.getInputStream()); res.complete(Serialize.readFully(din)); } catch (IOException e) { res.completeExceptionally(e); } finally { if (conn != null) conn.disconnect(); } return res; } @Override public CompletableFuture<byte[]> postMultipart(String url, List<byte[]> files) { try { Multipart mPost = new Multipart(buildURL(url).toString(), "UTF-8"); for (byte[] file : files) mPost.addFilePart("file", new NamedStreamable.ByteArrayWrapper(file)); return CompletableFuture.completedFuture(mPost.finish().getBytes()); } catch (IOException e) { throw new RuntimeException(e); } } @Override public CompletableFuture<byte[]> get(String url) { HttpURLConnection conn = null; try { conn = (HttpURLConnection) buildURL(url).openConnection(); conn.setDoInput(true); String contentEncoding = conn.getContentEncoding(); boolean isGzipped = "gzip".equals(contentEncoding); DataInputStream din = new DataInputStream(isGzipped ? new GZIPInputStream(conn.getInputStream()) : conn.getInputStream()); return CompletableFuture.completedFuture(Serialize.readFully(din)); } catch (IOException e) { CompletableFuture<byte[]> res = new CompletableFuture<>(); res.completeExceptionally(e); return res; } finally { if (conn != null) conn.disconnect(); } } @Override public String toString() { return dht.toString(); } }