DataURLConnection.java

package gov.usgs.util.protocolhandlers.data;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Base64;

/**
 * URLConnection for data protocol URLs.
 */
public class DataURLConnection extends URLConnection {

  private byte[] data;
  private String type;

  /**
   * @param url URL
   * @throws Exception if error occurs
   */
  public DataURLConnection(final URL url) throws Exception {
    super(url);

    // "data:[<mediatype>][;base64],<data>"
    // path is everything after "data:"
    final String path = url.getPath();
    final int base64 = path.indexOf(";base64");
    final int comma = path.indexOf(",");

    type = path.substring(0, base64 >= 0 ? base64 : comma);
    if ("".equals(type)) {
      type = null;
    }
    data = path.substring(comma + 1).getBytes("UTF8");
    if (base64 >= 0) {
      data = Base64.getDecoder().decode(data);
    }
  }

  @Override
  public int getContentLength() {
    return data.length;
  }

  @Override
  public String getContentType() {
    return type;
  }

  @Override
  public void connect() throws IOException {
    // no connection needed
  }

  @Override
  public InputStream getInputStream() throws IOException {
    return new ByteArrayInputStream(data);
  }

}