All Downloads are FREE. Search and download functionalities are using the official Maven repository.

marytts.server.http.MaryHttpServerUtils Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2007 DFKI GmbH.
 * All Rights Reserved.  Use is subject to license terms.
 *
 * This file is part of MARY TTS.
 *
 * MARY TTS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 *
 */
package marytts.server.http;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import javax.sound.sampled.AudioFileFormat;

import marytts.util.ConversionUtils;
import marytts.util.MaryUtils;
import marytts.util.data.audio.MaryAudioUtils;
import marytts.util.string.StringUtils;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.nio.entity.NByteArrayEntity;
import org.apache.http.nio.entity.NFileEntity;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.log4j.Logger;

/**
 * Utility functions for Mary http server
 * 
 * @author Oytun Türk
 */
public class MaryHttpServerUtils {
	private static Logger logger = MaryUtils.getLogger("http");

	public static void toHttpResponse(double[] x, HttpResponse response, String contentType) throws IOException {
		toHttpResponse(ConversionUtils.toByteArray(x), response, contentType);
	}

	public static void toHttpResponse(int[] x, HttpResponse response, String contentType) throws IOException {
		toHttpResponse(ConversionUtils.toByteArray(x), response, contentType);
	}

	public static void toHttpResponse(String x, HttpResponse response, String contentType) throws IOException {
		toHttpResponse(ConversionUtils.toByteArray(x), response, contentType);
	}

	public static void toHttpResponse(byte[] byteArray, HttpResponse response, String contentType) throws IOException {
		NByteArrayEntity body = new NByteArrayEntity(byteArray);
		body.setContentType(contentType);
		response.setEntity(body);
		response.setStatusCode(HttpStatus.SC_OK);
	}

	public static void toHttpResponse(InputStream stream, HttpResponse response, String contentType) throws IOException {
		toHttpResponse(stream, response, contentType, -1);
	}

	public static void toHttpResponse(InputStream stream, HttpResponse response, String contentType, long streamLength)
			throws IOException {
		InputStreamEntity body = new InputStreamEntity(stream, streamLength);
		body.setContentType(contentType);
		response.setEntity(body);
		response.setStatusCode(HttpStatus.SC_OK);
	}

	public static void fileToHttpResponse(String fullPathFile, HttpResponse response, String contentType, boolean useFileChannels) {
		int status;
		final File file = new File(fullPathFile);
		if (!file.exists())
			status = HttpStatus.SC_NOT_FOUND;
		else if (!file.canRead() || file.isDirectory())
			status = HttpStatus.SC_FORBIDDEN;
		else {
			status = HttpStatus.SC_OK;
			NFileEntity entity = new NFileEntity(file, contentType, useFileChannels);
			response.setEntity(entity);
		}

		response.setStatusCode(status);
	}

	/**
	 * Convert HTTP request string into key-value pairs
	 * 
	 * @param httpString
	 *            the query part of the http request url
	 * @param performUrlDecode
	 *            whether to URL-decode the keys and values
	 * @return null if httpString == null or httpString.length == 0
	 */
	public static Map toKeyValuePairs(String httpString, boolean performUrlDecode) {
		if (httpString == null || httpString.length() == 0) {
			return null;
		}

		Map keyValuePairs = new HashMap();

		StringTokenizer st = new StringTokenizer(httpString);
		String newToken = null;
		String param, val;
		int equalSignInd;
		while (st.hasMoreTokens() && (newToken = st.nextToken("&")) != null) {
			equalSignInd = newToken.indexOf("=");

			// Default values unless we have a param=value pair
			param = newToken;
			val = "";
			//

			// We have either a "param=value" pair, or "param=" only
			if (equalSignInd > -1) {
				param = newToken.substring(0, equalSignInd);
				val = newToken.substring(equalSignInd + 1);
			}

			if (performUrlDecode) {
				param = StringUtils.urlDecode(param);
				val = StringUtils.urlDecode(val);
			}
			keyValuePairs.put(param, val);
		}

		return keyValuePairs;
	}

	//

	public static String getMimeType(AudioFileFormat.Type audioType) {
		if (audioType == AudioFileFormat.Type.WAVE) {
			return "audio/x-wav";
		} else if (audioType == AudioFileFormat.Type.AU) {
			return "audio/basic";
		} else if (audioType == AudioFileFormat.Type.AIFF || audioType == AudioFileFormat.Type.AIFC) {
			return "audio/x-aiff";
		} else if (audioType.equals(MaryAudioUtils.getAudioFileFormatType("MP3"))) {
			return "audio/x-mpeg"; // "audio/x-mp3; //Does not work for Internet Explorer"
		}
		return "audio/basic"; // this is probably wrong but better than text/plain...
	}

	public static void errorFileNotFound(HttpResponse response, String uri) {
		int status = HttpStatus.SC_NOT_FOUND;
		response.setStatusCode(status);
		String message = "File " + uri + " not found";
		logger.debug("Returning HTTP status " + status + ": " + message);
		try {
			NStringEntity entity = new NStringEntity("

File not found

" + message + "

", "UTF-8"); entity.setContentType("text/html; charset=UTF-8"); response.setEntity(entity); } catch (UnsupportedEncodingException e) { } } public static void errorInternalServerError(HttpResponse response, String message, Throwable exception) { int status = HttpStatus.SC_INTERNAL_SERVER_ERROR; response.setStatusCode(status); StringWriter sw = new StringWriter(); exception.printStackTrace(new PrintWriter(sw, true)); String logMessage = (message != null ? message + "\n" : "") + sw.toString(); logger.debug("Returning HTTP status " + status + ": " + logMessage); try { NStringEntity entity = new NStringEntity("

Internal server error

" + (message != null ? message : "") + "

" + sw.toString() + "
", "UTF-8"); entity.setContentType("text/html; charset=UTF-8"); response.setEntity(entity); } catch (UnsupportedEncodingException e) { } } public static void errorMissingQueryParameter(HttpResponse response, String param) { int status = HttpStatus.SC_BAD_REQUEST; response.setStatusCode(status); String message = "Request must contain the parameter " + param; logger.debug("Returning HTTP status " + status + ": " + message); try { NStringEntity entity = new NStringEntity("

Bad request

" + message + ".", "UTF-8"); entity.setContentType("text/html; charset=UTF-8"); response.setEntity(entity); } catch (UnsupportedEncodingException e) { } } public static void errorWrongQueryParameterValue(HttpResponse response, String paramName, String illegalValue, String explanation) { int status = HttpStatus.SC_BAD_REQUEST; response.setStatusCode(status); String message = "The value '" + illegalValue + "' of parameter '" + paramName + "' is not valid" + (explanation != null ? ": " + explanation : ""); logger.debug("Returning HTTP status " + status + ": " + message); try { NStringEntity entity = new NStringEntity("

Bad request

" + message + ".", "UTF-8"); entity.setContentType("text/html; charset=UTF-8"); response.setEntity(entity); } catch (UnsupportedEncodingException e) { } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy