diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlSendableResource.java b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlSendableResource.java new file mode 100644 index 0000000..d5c4a4a --- /dev/null +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlSendableResource.java @@ -0,0 +1,12 @@ +package org.cobbzilla.wizard.stream; + +public class DataUrlSendableResource extends SendableResource { + + public DataUrlSendableResource(String name, String dataUrl) { + super(new DataUrlStreamingOutput(dataUrl)); + final DataUrlStreamingOutput out = (DataUrlStreamingOutput) getOut(); + setName(name); + setContentType(out.getContentType()); + } + +} diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlStreamingOutput.java b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlStreamingOutput.java new file mode 100644 index 0000000..0526baa --- /dev/null +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlStreamingOutput.java @@ -0,0 +1,50 @@ +package org.cobbzilla.wizard.stream; + +import lombok.Getter; +import org.apache.commons.codec.binary.Base64InputStream; +import org.apache.commons.io.IOUtils; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.StreamingOutput; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import static org.cobbzilla.util.daemon.ZillaRuntime.die; +import static org.cobbzilla.util.string.StringUtil.ellipsis; + +public class DataUrlStreamingOutput implements StreamingOutput { + + public static final String DATA_URL_PREFIX = "data:"; + + @Getter private final String contentType; + private final boolean base64; + private final InputStream data; + + public DataUrlStreamingOutput(String dataUrl) { + + if (!dataUrl.startsWith(DATA_URL_PREFIX)) die("DataUrlStreamingOutput: url does not start with 'data:' : "+ ellipsis(dataUrl, 50)); + final int commaPos = dataUrl.indexOf(","); + if (commaPos == -1) die("DataUrlStreamingOutput: no comma found in data url: "+ ellipsis(dataUrl, 50)); + if (commaPos == dataUrl.length()-1) die("DataUrlStreamingOutput: no data found after comma data url: "+ ellipsis(dataUrl, 50)); + final String mediaSpecifier = dataUrl.substring(DATA_URL_PREFIX.length(), commaPos); + final int b64pos = mediaSpecifier.indexOf(";base64"); + + final byte[] dataBytes = dataUrl.substring(commaPos).getBytes(); + if (b64pos == -1) { + contentType = mediaSpecifier; + base64 = false; + data = new ByteArrayInputStream(dataBytes); + } else { + contentType = mediaSpecifier.substring(0, b64pos); + base64 = true; + data = new Base64InputStream(new ByteArrayInputStream(dataBytes), false); + } + } + + @Override public void write(OutputStream output) throws IOException, WebApplicationException { + IOUtils.copyLarge(data, output); + } + +} diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlSendableResource.java b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlSendableResource.java new file mode 100644 index 0000000..bded51c --- /dev/null +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlSendableResource.java @@ -0,0 +1,20 @@ +package org.cobbzilla.wizard.stream; + +import org.cobbzilla.util.collection.NameAndValue; + +import static org.cobbzilla.util.http.URIUtil.getPath; +import static org.cobbzilla.util.io.FileUtil.basename; + +public class UrlSendableResource extends SendableResource { + + public UrlSendableResource(String url) { + super(new UrlStreamingOutput(url)); + final UrlStreamingOutput urlOut = (UrlStreamingOutput) getOut(); + setStatus(urlOut.getResponse().getStatus()); + setHeaders(urlOut.getResponse().getHeaders().toArray(NameAndValue.EMPTY_ARRAY)); + setName(basename(getPath(url))); + setContentLength(urlOut.getResponse().getContentLength()); + setContentType(urlOut.getResponse().getContentType()); + } + +} diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlStreamingOutput.java b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlStreamingOutput.java new file mode 100644 index 0000000..ea3ac78 --- /dev/null +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlStreamingOutput.java @@ -0,0 +1,36 @@ +package org.cobbzilla.wizard.stream; + +import lombok.Getter; +import org.apache.commons.io.IOUtils; +import org.cobbzilla.util.http.HttpRequestBean; +import org.cobbzilla.util.http.HttpResponseBean; +import org.cobbzilla.util.http.HttpUtil; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.StreamingOutput; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.OutputStream; + +import static org.cobbzilla.util.daemon.ZillaRuntime.die; +import static org.cobbzilla.util.daemon.ZillaRuntime.shortError; + +public class UrlStreamingOutput implements StreamingOutput { + + @Getter private HttpResponseBean response; + private ByteArrayInputStream in; + + public UrlStreamingOutput(String url) { + try { + response = HttpUtil.getResponse(new HttpRequestBean(url)); + in = new ByteArrayInputStream(response.getEntity()); + } catch (IOException e) { + die("UrlStreamingOutput: "+shortError(e)); + } + } + + @Override public void write(OutputStream output) throws IOException, WebApplicationException { + IOUtils.copyLarge(in, output); + } + +}