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

com.liferay.portal.servlet.BrowserSnifferImpl Maven / Gradle / Ivy

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library 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; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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.
 */

package com.liferay.portal.servlet;

import com.liferay.petra.string.CharPool;
import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.servlet.BrowserMetadata;
import com.liferay.portal.kernel.servlet.BrowserSniffer;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;

import javax.servlet.http.HttpServletRequest;

/**
 * See http://www.zytrax.com/tech/web/browser_ids.htm for examples.
 *
 * @author Eduardo Lundgren
 * @author Nate Cavanaugh
 */
public class BrowserSnifferImpl implements BrowserSniffer {

	@Override
	public boolean acceptsGzip(HttpServletRequest httpServletRequest) {
		String acceptEncoding = httpServletRequest.getHeader(
			HttpHeaders.ACCEPT_ENCODING);

		if ((acceptEncoding != null) && acceptEncoding.contains("gzip")) {
			return true;
		}

		return false;
	}

	@Override
	public String getBrowserId(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		if (browserMetadata.isChrome()) {
			return BROWSER_ID_CHROME;
		}
		else if (browserMetadata.isEdge()) {
			return BROWSER_ID_EDGE;
		}
		else if (browserMetadata.isIe()) {
			return BROWSER_ID_IE;
		}
		else if (browserMetadata.isFirefox()) {
			return BROWSER_ID_FIREFOX;
		}

		return BROWSER_ID_OTHER;
	}

	@Override
	public BrowserMetadata getBrowserMetadata(
		HttpServletRequest httpServletRequest) {

		return new BrowserMetadata(getUserAgent(httpServletRequest));
	}

	@Override
	public float getMajorVersion(HttpServletRequest httpServletRequest) {
		return GetterUtil.getFloat(getVersion(httpServletRequest));
	}

	@Override
	public String getRevision(HttpServletRequest httpServletRequest) {
		String revision = (String)httpServletRequest.getAttribute(
			WebKeys.BROWSER_SNIFFER_REVISION);

		if (revision != null) {
			return revision;
		}

		revision = parseVersion(
			getUserAgent(httpServletRequest), revisionLeadings,
			revisionSeparators);

		httpServletRequest.setAttribute(
			WebKeys.BROWSER_SNIFFER_REVISION, revision);

		return revision;
	}

	@Override
	public String getVersion(HttpServletRequest httpServletRequest) {
		String version = (String)httpServletRequest.getAttribute(
			WebKeys.BROWSER_SNIFFER_VERSION);

		if (version != null) {
			return version;
		}

		String userAgent = getUserAgent(httpServletRequest);

		version = parseVersion(userAgent, versionLeadings, versionSeparators);

		if (version.isEmpty()) {
			version = parseVersion(
				userAgent, revisionLeadings, revisionSeparators);
		}

		httpServletRequest.setAttribute(
			WebKeys.BROWSER_SNIFFER_VERSION, version);

		return version;
	}

	@Override
	public boolean isAir(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isAir();
	}

	@Override
	public boolean isAndroid(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isAndroid();
	}

	@Override
	public boolean isChrome(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isChrome();
	}

	@Override
	public boolean isEdge(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isEdge();
	}

	@Override
	public boolean isFirefox(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isFirefox();
	}

	@Override
	public boolean isGecko(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isGecko();
	}

	@Override
	public boolean isIe(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isIe();
	}

	@Override
	public boolean isIeOnWin32(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isIeOnWin32();
	}

	@Override
	public boolean isIeOnWin64(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isIeOnWin64();
	}

	@Override
	public boolean isIphone(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isIphone();
	}

	@Override
	public boolean isLinux(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isLinux();
	}

	@Override
	public boolean isMac(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isMac();
	}

	@Override
	public boolean isMobile(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isMobile();
	}

	@Override
	public boolean isMozilla(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isMozilla();
	}

	@Override
	public boolean isOpera(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isOpera();
	}

	@Override
	public boolean isRtf(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isRtf(getVersion(httpServletRequest));
	}

	@Override
	public boolean isSafari(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isSafari();
	}

	@Override
	public boolean isSun(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isSun();
	}

	@Override
	public boolean isWebKit(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isWebKit();
	}

	@Override
	public boolean isWindows(HttpServletRequest httpServletRequest) {
		BrowserMetadata browserMetadata = getBrowserMetadata(
			httpServletRequest);

		return browserMetadata.isWindows();
	}

	protected static String parseVersion(
		String userAgent, String[] leadings, char[] separators) {

		leading:
		for (String leading : leadings) {
			int index = 0;

			version:
			while (true) {
				index = userAgent.indexOf(leading, index);

				if ((index < 0) ||
					(((index += leading.length()) + 2) > userAgent.length())) {

					continue leading;
				}

				char c1 = userAgent.charAt(index);
				char c2 = userAgent.charAt(++index);

				if (((c2 >= '0') && (c2 <= '9')) || (c2 == '.')) {
					for (char separator : separators) {
						if (c1 == separator) {
							break version;
						}
					}
				}
			}

			// Major

			int majorStart = index;
			int majorEnd = index + 1;

			for (int i = majorStart; i < userAgent.length(); i++) {
				char c = userAgent.charAt(i);

				if ((c < '0') || (c > '9')) {
					majorEnd = i;

					break;
				}
			}

			String major = userAgent.substring(majorStart, majorEnd);

			if ((majorEnd >= userAgent.length()) ||
				(userAgent.charAt(majorEnd) != '.')) {

				return major;
			}

			// Minor

			int minorStart = majorEnd + 1;
			int minorEnd = userAgent.length();

			for (int i = minorStart; i < userAgent.length(); i++) {
				char c = userAgent.charAt(i);

				if ((c < '0') || (c > '9')) {
					minorEnd = i;

					break;
				}
			}

			String minor = userAgent.substring(minorStart, minorEnd);

			String version = StringBundler.concat(
				major, StringPool.PERIOD, minor);

			if (leading.equals("trident")) {
				if (version.equals("7.0")) {
					version = "11.0";
				}
				else if (version.equals("6.0")) {
					version = "10.0";
				}
				else if (version.equals("5.0")) {
					version = "9.0";
				}
				else if (version.equals("4.0")) {
					version = "8.0";
				}
			}

			return version;
		}

		return StringPool.BLANK;
	}

	protected String getAccept(HttpServletRequest httpServletRequest) {
		String accept = StringPool.BLANK;

		if (httpServletRequest == null) {
			return accept;
		}

		accept = String.valueOf(
			httpServletRequest.getAttribute(HttpHeaders.ACCEPT));

		if (Validator.isNotNull(accept)) {
			return accept;
		}

		accept = httpServletRequest.getHeader(HttpHeaders.ACCEPT);

		if (accept != null) {
			accept = StringUtil.toLowerCase(accept);
		}
		else {
			accept = StringPool.BLANK;
		}

		httpServletRequest.setAttribute(HttpHeaders.ACCEPT, accept);

		return accept;
	}

	protected String getUserAgent(HttpServletRequest httpServletRequest) {
		if (httpServletRequest == null) {
			return StringPool.BLANK;
		}

		Object userAgentObject = httpServletRequest.getAttribute(
			HttpHeaders.USER_AGENT);

		if (userAgentObject != null) {
			return userAgentObject.toString();
		}

		String userAgent = httpServletRequest.getHeader(HttpHeaders.USER_AGENT);

		if (userAgent != null) {
			userAgent = StringUtil.toLowerCase(userAgent);
		}
		else {
			userAgent = StringPool.BLANK;
		}

		httpServletRequest.setAttribute(HttpHeaders.USER_AGENT, userAgent);

		return userAgent;
	}

	protected static String[] revisionLeadings = {
		"rv", "it", "ra", "trident", "ie"
	};
	protected static char[] revisionSeparators = {
		CharPool.BACK_SLASH, CharPool.COLON, CharPool.SLASH, CharPool.SPACE
	};
	protected static String[] versionLeadings = {
		"edge", "chrome", "firefox", "version", "minefield", "trident"
	};
	protected static char[] versionSeparators = {
		CharPool.BACK_SLASH, CharPool.SLASH
	};

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy