/* * Copyright (C) 2012-2016 Julien Bonjean <julien@bonjean.info> * * This file is part of Beluga Player. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 3 of the License, or (at your option) any later * version. * * 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 General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package info.bonjean.beluga.util; import info.bonjean.beluga.connection.BelugaHTTPClient; import info.bonjean.beluga.exception.BelugaException; import info.bonjean.beluga.exception.CommunicationException; import info.bonjean.beluga.exception.PandoraException; import info.bonjean.beluga.request.JsonRequest; import info.bonjean.beluga.request.Method; import info.bonjean.beluga.request.ParameterMap; import info.bonjean.beluga.response.Response; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.entity.StringEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; /** * * @author Julien Bonjean <julien@bonjean.info> * */ public class HTTPUtil { private static final Logger log = LoggerFactory.getLogger(HTTPUtil.class); private static final Gson gson = GsonUtil.getGsonInstance(); private static final String SERVICE_URL = "http://tuner.pandora.com/services/json/?"; public static <E> E request(Method method, ParameterMap params, JsonRequest jsonData, boolean encrypt, TypeToken<Response<E>> typeToken) throws BelugaException { String urlStr = createRequestUrl(method, params); String data = gson.toJson(jsonData); log.debug("Request: " + urlStr); log.debug("Data: " + data); if (encrypt) data = CryptoUtil.pandoraEncrypt(data); String requestResponse = HTTPUtil.jsonRequest(urlStr, data); log.debug("Response: " + requestResponse); Response<E> response; try { response = gson.fromJson(requestResponse, typeToken.getType()); } catch (JsonSyntaxException e) { throw new CommunicationException("invalidPandoraResponse", e); } if (response.getStat().equals("fail")) throw new PandoraException(method, response.getCode()); return response.getResult(); } private static String createRequestUrl(Method method, ParameterMap params) { StringBuffer url = new StringBuffer(SERVICE_URL); if (params == null) params = new ParameterMap(); params.add("method", method.getName()); url.append(URLEncodedUtils.format(params.getNameValuePairList(), "UTF-8")); return url.toString(); } private static String jsonRequest(String urlStr, String data) throws CommunicationException { try { StringEntity json = new StringEntity(data.toString()); json.setContentType("application/json"); HttpPost post = new HttpPost(urlStr); post.addHeader("Content-Type", "application/json"); post.setEntity(json); return BelugaHTTPClient.getInstance().requestPost(post); } catch (Exception e) { throw new CommunicationException("communicationProblem", e); } } public static byte[] request(String urlStr) throws CommunicationException { try { return BelugaHTTPClient.getInstance().requestGet(new HttpGet(urlStr)); } catch (IOException e) { throw new CommunicationException("communicationProblem", e); } } public static Map<String, String> parseUrl(String url) { Map<String, String> parametersMap = new HashMap<String, String>(); String parameters = url.substring(url.indexOf("?") + 1); StringTokenizer paramGroup = new StringTokenizer(parameters, "&"); while (paramGroup.hasMoreTokens()) { StringTokenizer value = new StringTokenizer(paramGroup.nextToken(), "="); parametersMap.put(value.nextToken(), value.nextToken()); } return parametersMap; } }