package com.onelogin.saml2.servlet; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import com.onelogin.saml2.http.HttpRequest; import com.onelogin.saml2.util.Util; /** * ServletUtils class of OneLogin's Java Toolkit. * * A class that contains several auxiliary methods related to HttpServletRequest and HttpServletResponse */ public class ServletUtils { private ServletUtils() { //not called } /** * Creates an HttpRequest from an HttpServletRequest. * * @param req the incoming HttpServletRequest * @return a HttpRequest */ public static HttpRequest makeHttpRequest(HttpServletRequest req) { @SuppressWarnings("unchecked") final Map<String, String[]> paramsAsArray = (Map<String, String[]>) req.getParameterMap(); final Map<String, List<String>> paramsAsList = new HashMap<>(); for (Map.Entry<String, String[]> param : paramsAsArray.entrySet()) { paramsAsList.put(param.getKey(), Arrays.asList(param.getValue())); } return new HttpRequest(req.getRequestURL().toString(), paramsAsList, req.getQueryString()); } /** * Returns the protocol + the current host + the port (if different than * common ports). * * @param request * HttpServletRequest object to be processed * * @return the HOST URL */ public static String getSelfURLhost(HttpServletRequest request) { String hostUrl = StringUtils.EMPTY; final int serverPort = request.getServerPort(); if ((serverPort == 80) || (serverPort == 443) || serverPort == 0) { hostUrl = String.format("%s://%s", request.getScheme(), request.getServerName()); } else { hostUrl = String.format("%s://%s:%s", request.getScheme(), request.getServerName(), serverPort); } return hostUrl; } /** * @param request * HttpServletRequest object to be processed * * @return the server name */ public static String getSelfHost(HttpServletRequest request) { return request.getServerName(); } /** * Check if under https or http protocol * * @param request * HttpServletRequest object to be processed * * @return false if https is not active */ public static boolean isHTTPS(HttpServletRequest request) { return request.isSecure(); } /** * Returns the URL of the current context + current view + query * * @param request * HttpServletRequest object to be processed * * @return current context + current view + query */ public static String getSelfURL(HttpServletRequest request) { String url = getSelfURLhost(request); String requestUri = request.getRequestURI(); String queryString = request.getQueryString(); if (null != requestUri && !requestUri.isEmpty()) { url += requestUri; } if (null != queryString && !queryString.isEmpty()) { url += '?' + queryString; } return url; } /** * Returns the URL of the current host + current view. * * @param request * HttpServletRequest object to be processed * * @return current host + current view */ public static String getSelfURLNoQuery(HttpServletRequest request) { return request.getRequestURL().toString(); } /** * Returns the routed URL of the current host + current view. * * @param request * HttpServletRequest object to be processed * * @return the current routed url */ public static String getSelfRoutedURLNoQuery(HttpServletRequest request) { String url = getSelfURLhost(request); String requestUri = request.getRequestURI(); if (null != requestUri && !requestUri.isEmpty()) { url += requestUri; } return url; } /** * Redirect to location url * * @param response * HttpServletResponse object to be used * @param location * target location url * @param parameters * GET parameters to be added * @param stay * True if we want to stay (returns the url string) False to execute redirection * * @return string the target URL * @throws IOException * * @see javax.servlet.http.HttpServletResponse#sendRedirect(String) */ public static String sendRedirect(HttpServletResponse response, String location, Map<String, String> parameters, Boolean stay) throws IOException { String target = location; if (!parameters.isEmpty()) { boolean first = !location.contains("?"); for (Map.Entry<String, String> parameter : parameters.entrySet()) { if (first) { target += "?"; first = false; } else { target += "&"; } target += parameter.getKey(); if (!parameter.getValue().isEmpty()) { target += "=" + Util.urlEncoder(parameter.getValue()); } } } if (!stay) { response.sendRedirect(target); } return target; } /** * Redirect to location url * * @param response * HttpServletResponse object to be used * @param location * target location url * @param parameters * GET parameters to be added * * @throws IOException * * @see javax.servlet.http.HttpServletResponse#sendRedirect(String) */ public static void sendRedirect(HttpServletResponse response, String location, Map<String, String> parameters) throws IOException { sendRedirect(response, location, parameters, false); } /** * Redirect to location url * * @param response * HttpServletResponse object to be used * @param location * target location url * * @throws IOException * * @see HttpServletResponse#sendRedirect(String) */ public static void sendRedirect(HttpServletResponse response, String location) throws IOException { Map<String, String> parameters =new HashMap<String, String>(); sendRedirect(response, location, parameters); } }