@@ -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()); | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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()); | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |