Created
March 31, 2009 04:30
-
-
Save johnboxall/88057 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
# Some mobile browsers which look like desktop browsers. | |
RE_MOBILE = re.compile(r"(iphone|ipod|blackberry|android|palm|windows\s+ce)", re.I) | |
RE_DESKTOP = re.compile(r"(windows|linux|os\s+[x9]|solaris|bsd)", re.I) | |
RE_BOT = re.compile(r"(spider|crawl|slurp|bot)") | |
def is_desktop(user_agent): | |
""" | |
Anything that looks like a phone isn't a desktop. | |
Anything that looks like a desktop probably is. | |
Anything that looks like a bot should default to desktop. | |
""" | |
return not bool(RE_MOBILE.search(user_agent)) and \ | |
bool(RE_DESKTOP.search(user_agent)) or \ | |
bool(RE_BOT.search(user_agent)) | |
def get_user_agent(request): | |
# Some mobile browsers put the User-Agent in a HTTP-X header | |
return request.headers.get('HTTP_X_OPERAMINI_PHONE_UA') or \ | |
request.headers.get('HTTP_X_SKYFIRE_PHONE') or \ | |
request.headers.get('HTTP_USER_AGENT', '') |
Ruby version converted into a gem, for the lazier:
The Java version:
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
public class UserAgentUtils {
private static final String HTTP_X_OPERAMINI_PHONE_UA = "X-Operamini-Phone-UA";
private static final String HTTP_X_SKYFIRE_PHONE = "X-Skyfire-Phone";
private static final String HTTP_USER_AGENT = "User-Agent";
private static final Pattern mobile = Pattern.compile("(iphone|ipod|ipad|blackberry|android|palm|windows\\s+ce)",
Pattern.CASE_INSENSITIVE);
private static final Pattern desktop = Pattern.compile("(windows|linux|os\\s+[x9]|solaris|bsd)",
Pattern.CASE_INSENSITIVE);
private static final Pattern bot = Pattern.compile("(spider|crawl|slurp|bot)", Pattern.CASE_INSENSITIVE);
public static String getUserAgent(HttpServletRequest request) {
String ua = request.getHeader(HTTP_X_OPERAMINI_PHONE_UA);
if (StringUtils.isBlank(ua))
ua = request.getHeader(HTTP_X_SKYFIRE_PHONE);
if (StringUtils.isBlank(ua))
ua = request.getHeader(HTTP_USER_AGENT);
if (StringUtils.isBlank(ua))
ua = "";
return ua;
}
public static boolean isDesktop(HttpServletRequest request) {
return isDesktop(getUserAgent(request));
}
public static boolean isDesktop(String userAgent) {
//
// Anything that looks like a phone isn't a desktop.
// Anything that looks like a desktop probably is.
// Anything that looks like a bot should default to desktop.
//
return (!matches(mobile, userAgent) && matches(desktop, userAgent)) || matches(bot, userAgent);
}
private static boolean matches(Pattern p, String s) {
return p.matcher(s).find();
}
public static boolean isMobile(HttpServletRequest request) {
return isMobile(getUserAgent(request));
}
public static boolean isMobile(String userAgent) {
return !isDesktop(userAgent);
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ruby version for the lazy: