diff src/fschmidt/util/servlet/ServletUtils.java @ 68:00520880ad02

add fschmidt source
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 05 Oct 2025 17:24:15 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fschmidt/util/servlet/ServletUtils.java	Sun Oct 05 17:24:15 2025 -0600
@@ -0,0 +1,271 @@
+/*
+Copyright (c) 2008  Franklin Schmidt <fschmidt@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+package fschmidt.util.servlet;
+
+import fschmidt.util.java.Base64;
+import fschmidt.util.java.HtmlUtils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpUtils;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+
+
+public final class ServletUtils {
+
+	private ServletUtils() { throw new RuntimeException(); }
+
+	public static String getQueryString(HttpServletRequest request) {
+		return getQueryString(request,0);
+	}
+
+	public static String getQueryString(HttpServletRequest request,int maxValueLen) {
+		String method = request.getMethod();
+		if( method.equals("GET") )
+			return request.getQueryString();
+		if( !method.equals("POST") && !method.equals("HEAD") )
+			throw new RuntimeException(method);
+		Enumeration en = request.getParameterNames();
+		StringBuilder queryBuf = new StringBuilder();
+		if( !en.hasMoreElements() )
+			return null;
+		do {
+			String param = (String)en.nextElement();
+			String value = request.getParameter(param);
+			if( maxValueLen > 0 ) {
+				int len = value.length();
+				if( len > maxValueLen )
+					value = value.substring(0,maxValueLen) + "..." + (len-maxValueLen);
+			}
+			queryBuf.append(param);
+			queryBuf.append('=');
+			queryBuf.append(value);
+			queryBuf.append('&');
+		} while( en.hasMoreElements() );
+		queryBuf.deleteCharAt(queryBuf.length() - 1);
+		return queryBuf.toString();
+	}
+
+	public static String getCurrentURL(HttpServletRequest request) {
+		return getCurrentURL(request,0);
+	}
+
+	public static String getCurrentURL(HttpServletRequest request,int maxValueLen) {
+//		StringBuffer buf = HttpUtils.getRequestURL(request);
+		StringBuffer buf = request.getRequestURL();
+		String qStr = getQueryString(request,maxValueLen);
+		if(qStr != null && qStr.length() > 0) {
+			buf.append('?');
+			buf.append(qStr);
+		}
+		return buf.toString();
+	}
+
+	public static String fullURL(HttpServletRequest request,String relativeURL)
+		throws MalformedURLException
+	{
+		return new URL(new URL(request.getRequestURL().toString()),relativeURL).toString();
+	}
+
+	public static String getHost(HttpServletRequest request) {
+/*
+		String host = request.getHeader("host");
+		if( host.endsWith(":80") )
+			host = host.substring(0,host.length()-3);
+		return host;
+*/
+		String host = request.getServerName();
+		int port = request.getServerPort();
+		if( port != 80 ) {
+			host += ":" + port;
+		}
+		return host;
+	}
+
+	static String getContextUrl(String scheme,String host,String contextPath) {
+		StringBuilder buf = new StringBuilder();
+		buf.append( scheme );
+		buf.append( "://" );
+		buf.append( host );
+		buf.append( contextPath );
+		return buf.toString();
+	}
+
+	public static String getContextURL(HttpServletRequest request) {
+		return getContextUrl( request.getScheme(), getHost(request), request.getContextPath() );
+	}
+
+	public static String getServletPath(HttpServletRequest request,String relativeURL)
+		throws MalformedURLException
+	{
+		int i = relativeURL.indexOf('?');
+		if( i != -1 )
+			relativeURL = relativeURL.substring(0,i);
+		String url = fullURL(request,relativeURL);
+		String context = getContextURL(request);
+		if( !url.startsWith(context) )
+			throw new RuntimeException("context="+context+" url="+url);
+		return url.substring(context.length());
+	}
+
+	public static Map<String,String[]> getParameterMap(String url) {
+		int i = url.indexOf('?');
+		if( i == -1 )
+			return Collections.emptyMap();
+		String query = url.substring(i+1);
+		return parseQueryString(query);
+	}
+
+	@SuppressWarnings("unchecked")
+	private static Map<String,String[]> parseQueryString(String query) {
+		return HttpUtils.parseQueryString(query);
+	}
+
+	public static String getQueryString(Map<String,String[]> params) {
+		StringBuilder buf = new StringBuilder();
+		for( Iterator<Map.Entry<String,String[]>> iter=params.entrySet().iterator(); iter.hasNext(); ) {
+			Map.Entry<String,String[]> entry = iter.next();
+			String name = entry.getKey();
+			String[] values = entry.getValue();
+			for( int i=0; i<values.length; i++ ) {
+				if( buf.length() > 0 )
+					buf.append( '&' );
+				buf.append( name );
+				buf.append( '=' );
+				buf.append( HtmlUtils.urlEncode(values[i]) );
+			}
+		}
+		return buf.toString();
+	}
+
+	private static String escape(String value) {
+		return value.replaceAll(";", "%3B");
+	}
+
+	private static String unescape(String value) {
+		return value.replaceAll("%3B", ";");
+	}
+
+	private static Cookie getCookie(HttpServletRequest request,String name) {
+		Cookie[] cookies = request.getCookies();
+		if( cookies == null )
+			return null;
+		for (Cookie cookie : cookies) {
+			if (cookie.getName().equals(name))
+				return cookie;
+		}
+		return null;
+	}
+
+	public static String getCookieValue(HttpServletRequest request,String name) {
+		Cookie cookie = getCookie(request,name);
+		return cookie==null ? null : unescape(cookie.getValue());
+	}
+
+	public static void setCookie(HttpServletRequest request,HttpServletResponse response,String name,String value,boolean isPersistent, String domain) {
+		Cookie cookie = getCookie(request,name);
+		if( cookie==null || !cookie.getValue().equals(value) ) {
+			cookie = new Cookie(name, escape(value));
+			cookie.setPath("/");
+			if (domain != null && domain.length() > 0)
+				cookie.setDomain(domain);
+			if( isPersistent )
+				cookie.setMaxAge(10000000);
+			response.addCookie(cookie);
+		}
+	}
+
+	public static void removeCookie(HttpServletRequest request,
+									HttpServletResponse response,
+									String name,
+									String domain
+
+	) {
+		Cookie cookie = getCookie(request, name);
+		if(cookie != null) {
+			Cookie delCookie = new Cookie(name, "delete");
+			delCookie.setPath("/");
+			delCookie.setMaxAge(0);
+			if (domain != null && domain.length() > 0)
+				delCookie.setDomain(domain);
+			response.addCookie(delCookie);
+		}
+	}
+
+
+	public static String getRemoteAddr(HttpServletRequest request) {
+		String addr = request.getHeader("X-Forwarded-For");
+		if( addr==null )
+			addr = request.getRemoteAddr();
+		return addr;
+	}
+
+/*
+	public static boolean authenticate(HttpServletRequest request,HttpServletResponse response,String authRealm,String authUsernameAndPassword)
+		throws IOException
+	{
+		String auth = request.getHeader("Authorization");
+		if( auth==null ) {
+			response.setHeader("WWW-Authenticate","Basic realm=\""+authRealm+"\"");
+			response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+			return false;
+		}
+		String[] a = auth.split(" +");
+		if( a.length != 2 )
+			throw new RuntimeException("auth = "+auth);
+		if( !a[0].equals("Basic") )
+			throw new RuntimeException("auth = "+auth);
+		if( !new String(Base64.decode(a[1])).equals(authUsernameAndPassword) ) {
+			response.setHeader("WWW-Authenticate","Basic realm=\""+authRealm+"\"");
+			response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+			return false;
+		}
+		return true;
+	}
+*/
+	public static String getAuthorization(HttpServletRequest request) {
+		String auth = request.getHeader("Authorization");
+		if( auth==null )
+			return null;
+		String[] a = auth.split(" +");
+		if( a.length != 2 )
+			throw new RuntimeException("auth = "+auth);
+		if( !a[0].equals("Basic") )
+			throw new RuntimeException("auth = "+auth);
+		return new String(Base64.decode(a[1]));
+	}
+
+	public static void sendAuthenticate(HttpServletResponse response,String authRealm)
+		throws IOException
+	{
+		response.setHeader("WWW-Authenticate","Basic realm=\""+authRealm+"\"");
+		response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+	}
+}