/*
* Copyright 2008-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sun.net.www.protocol.data;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.UnknownServiceException;
import java.nio.charset.Charset;
import java.security.AllPermission;
import java.security.Permission;
import java.util.List;
import java.util.Map;
import com.nominanuda.codec.Base64Codec;
import com.nominanuda.io.DataURLHelper;
public class DataURLConnection extends URLConnection {
private final static DataURLHelper dataUrlHelper = new DataURLHelper();
private byte[] dataAsBinary;
private URL url;
private boolean isBase64;
private Charset charset;
private String mimeType;
private static final Base64Codec base64 = new Base64Codec();
public DataURLConnection(final URL _url) throws MalformedURLException,
IOException {
super(_url);
String dataUrl = _url.toString();//get_url.getFile();
if(! dataUrlHelper.isDataUrl(dataUrl)) {
throw new MalformedURLException();
}
isBase64 = dataUrlHelper.isDataUrlBinary(dataUrl);
String cs = dataUrlHelper.getDataUrlCharset(dataUrl);
if(cs != null) {
try {
charset = Charset.forName(cs);
} catch(Exception e) {}
}
mimeType = dataUrlHelper.getDataUrlMimeType(dataUrl);
String urlData = dataUrlHelper.getDataUrlData(dataUrl);
if(isBase64) {
dataAsBinary = base64.decodeNoGzip(urlData);
} else {
String chst = charset == null ? "UTF-8" : charset.displayName();
dataAsBinary = URLDecoder.decode(urlData, chst).getBytes();
}
this.url = _url;
}
@Override
public void addRequestProperty(String key, String value) {
}
@Override
public boolean getAllowUserInteraction() {
return false;
}
@Override
public int getConnectTimeout() {
return 0;
}
@Override
public Object getContent() throws IOException {
return super.getContent();
}
@SuppressWarnings("rawtypes")
@Override
public Object getContent(Class[] classes) throws IOException {
return super.getContent(classes);
}
@Override
public String getContentEncoding() {
return null;
}
@Override
public int getContentLength() {
return dataAsBinary.length;
}
@Override
public String getContentType() {
return mimeType;
}
@Override
public long getDate() {
return 0;
}
@Override
public boolean getDefaultUseCaches() {
return false;
}
@Override
public boolean getDoInput() {
return true;
}
@Override
public boolean getDoOutput() {
return false;
}
@Override
public long getExpiration() {
return 0;
}
@Override
public String getHeaderField(int n) {
return null;
}
@Override
public String getHeaderField(String name) {
if(name.equalsIgnoreCase("content-type")
|| name.equalsIgnoreCase("contenttype")
|| name.equalsIgnoreCase("mime-type")
|| name.equalsIgnoreCase("mimetype")) {
return getContentType();
}
return null;
}
@Override
public long getHeaderFieldDate(String name, long Default) {
return 0;
}
@Override
public int getHeaderFieldInt(String name, int Default) {
return 0;
}
@Override
public String getHeaderFieldKey(int n) {
return null;
}
@Override
public Map<String, List<String>> getHeaderFields() {
return null;
}
@Override
public long getIfModifiedSince() {
return 0;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(dataAsBinary);
}
@Override
public long getLastModified() {
return 0;
}
@Override
public OutputStream getOutputStream() throws IOException {
throw new UnknownServiceException();
}
@Override
public Permission getPermission() throws IOException {
return new AllPermission();
}
@Override
public int getReadTimeout() {
return 0;
}
@Override
public Map<String, List<String>> getRequestProperties() {
return null;
}
@Override
public String getRequestProperty(String key) {
return null;
}
@Override
public URL getURL() {
return url;
}
@Override
public boolean getUseCaches() {
return false;
}
@Override
public void setAllowUserInteraction(boolean allowuserinteraction) {
}
@Override
public void setConnectTimeout(int timeout) {
}
@Override
public void setDefaultUseCaches(boolean defaultusecaches) {
}
@Override
public void setDoInput(boolean doinput) {
}
@Override
public void setDoOutput(boolean dooutput) {
}
@Override
public void setIfModifiedSince(long ifmodifiedsince) {
}
@Override
public void setReadTimeout(int timeout) {
}
@Override
public void setRequestProperty(String key, String value) {
}
@Override
public void setUseCaches(boolean usecaches) {
}
@Override
public String toString() {
String string = url.getFile();
return "URL[data:"+
((string.length() > 10 ) ? string.substring(0, 10) + "..." : string)
+"]";
}
@Override
public void connect() throws IOException {
}
}