blob: 0eae7b65ac0b6bc017d0cbda4acfc6628a4a6809 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.qpid.server.util.urlstreamhandler.data;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLStreamHandler;
import java.nio.charset.StandardCharsets;
import org.apache.qpid.util.Strings;
public class Handler extends URLStreamHandler
{
public static final String PROTOCOL_HANDLER_PROPERTY = "java.protocol.handler.pkgs";
private static boolean _registered;
@Override
protected URLConnection openConnection(final URL u) throws IOException
{
return new DataUrlConnection(u);
}
public synchronized static void register()
{
if(!_registered)
{
String registeredPackages = System.getProperty(PROTOCOL_HANDLER_PROPERTY);
String thisPackage = Handler.class.getPackage().getName();
String packageToRegister = thisPackage.substring(0, thisPackage.lastIndexOf('.') );
System.setProperty(PROTOCOL_HANDLER_PROPERTY,
registeredPackages == null
? packageToRegister
: packageToRegister + "|" + registeredPackages);
_registered = true;
}
}
private static class DataUrlConnection extends URLConnection
{
private final byte[] _content;
private final String _contentType;
private final boolean _base64;
public DataUrlConnection(final URL u) throws IOException
{
super(u);
String externalForm = u.toExternalForm();
if(externalForm.startsWith("data:"))
{
String[] parts = externalForm.substring(5).split(",",2);
_base64 = parts[0].endsWith(";base64");
if(_base64)
{
_content = Strings.decodeBase64(parts[1]);
}
else
{
try
{
_content = URLDecoder.decode(parts[1], StandardCharsets.US_ASCII.name()).getBytes(StandardCharsets.US_ASCII);
}
catch (UnsupportedEncodingException e)
{
throw new IOException(e);
}
}
String mediaType = (_base64
? parts[0].substring(0,parts[0].length()-";base64".length())
: parts[0]).split(";")[0];
_contentType = "".equals(mediaType) ? "text/plain" : mediaType;
}
else
{
throw new MalformedURLException("'"+externalForm+"' does not start with 'data:'");
}
}
@Override
public void connect() throws IOException
{
}
@Override
public int getContentLength()
{
return _content.length;
}
@Override
public String getContentType()
{
return _contentType;
}
@Override
public String getContentEncoding()
{
return _base64 ? "base64" : null;
}
@Override
public InputStream getInputStream() throws IOException
{
return new ByteArrayInputStream(_content);
}
}
}