/****************************************************************************
* Copyright (C) 2012 ecsec GmbH.
* All rights reserved.
* Contact: ecsec GmbH (info@ecsec.de)
*
* This file is part of the Open eCard App.
*
* GNU General Public License Usage
* This file may be used under the terms of the GNU General Public
* License version 3.0 as published by the Free Software Foundation
* and appearing in the file LICENSE.GPL included in the packaging of
* this file. Please review the following information to ensure the
* GNU General Public License version 3.0 requirements will be met:
* http://www.gnu.org/copyleft/gpl.html.
*
* Other Usage
* Alternatively, this file may be used in accordance with the terms
* and conditions contained in a signed written agreement between
* you and ecsec GmbH.
*
***************************************************************************/
package org.openecard.control.binding.http.handler.common;
import java.net.URI;
import java.net.URL;
import java.net.URLDecoder;
import org.openecard.apache.http.HttpRequest;
import org.openecard.apache.http.HttpResponse;
import org.openecard.apache.http.HttpStatus;
import org.openecard.apache.http.RequestLine;
import org.openecard.apache.http.entity.BasicHttpEntity;
import org.openecard.apache.http.entity.ContentType;
import org.openecard.control.binding.http.HTTPException;
import org.openecard.control.binding.http.common.DocumentRoot;
import org.openecard.control.binding.http.common.Http11Response;
import org.openecard.control.binding.http.common.MimeType;
import org.openecard.control.binding.http.handler.ControlCommonHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Moritz Horsch <horsch@cdc.informatik.tu-darmstadt.de>
*/
public class FileHandler extends ControlCommonHandler {
private static final Logger _logger = LoggerFactory.getLogger(FileHandler.class);
private DocumentRoot documentRoot;
/**
* Creates a new file handler.
*
* @param documentRoot Document root
*/
public FileHandler(DocumentRoot documentRoot) {
super("/*");
this.documentRoot = documentRoot;
}
@Override
public HttpResponse handle(HttpRequest httpRequest) throws HTTPException, Exception {
// Return 404 Not Found in the default case
Http11Response httpResponse = new Http11Response(HttpStatus.SC_NOT_FOUND);
RequestLine requestLine = httpRequest.getRequestLine();
if (requestLine.getMethod().equals("GET")) {
URI requestURI = URI.create(requestLine.getUri());
URL filePath = documentRoot.getFile(URLDecoder.decode(requestURI.getPath(), "UTF-8"));
if (filePath != null) {
// Handle file
_logger.debug("Handle file request");
handleFile(httpResponse, filePath);
} else {
_logger.debug("The DocumentRoot does not contain the URI: {}", requestURI.getPath());
}
} else {
// Return 405 Method Not Allowed
httpResponse.setStatusCode(HttpStatus.SC_METHOD_NOT_ALLOWED);
}
return httpResponse;
}
private void handleFile(Http11Response httpResponse, URL file) throws Exception {
String fileName = file.toString();
String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
MimeType mimeType = MimeType.fromFilenameExtension(fileExtension);
String typeName = (mimeType != null) ? mimeType.getMimeType() : MimeType.TEXT_PLAIN.getMimeType();
httpResponse.setStatusCode(HttpStatus.SC_OK);
BasicHttpEntity entity = new BasicHttpEntity();
entity.setContent(file.openStream());
entity.setContentType(ContentType.create(typeName, "UTF-8").toString());
httpResponse.setEntity(entity);
}
}