5f4e9eadcba8a9ee8b3f89bbe873caec478013ec tdreszer Tue Jul 27 15:10:43 2010 -0700 Added cgiClientBrowser() routine to determine browser from HTTP_USER_AGENT diff --git src/lib/cheapcgi.c src/lib/cheapcgi.c index f42e51f..71e117c 100644 --- src/lib/cheapcgi.c +++ src/lib/cheapcgi.c @@ -96,6 +96,100 @@ return getenv("HTTP_USER_AGENT"); } +enum browserType cgiClientBrowser(char **browserQualifier, enum osType *clientOs, char **clientOsQualifier) +/* Return client browser type determined from (HTTP_USER_AGENT) + Optionally requuest the additional info about the client */ +{ +// WARNING: The specifics of the HTTP_USER_AGENT vary widely. +// This has only been tested on a few cases. +static enum browserType clientBrowser = btUnknown; +static enum browserType clientOsType = osUnknown; +static char *clientBrowserExtra = NULL; +static char *clientOsExtra = NULL; + +if (clientBrowser == btUnknown) + { + char *userAgent = cgiUserAgent(); + if (userAgent != NULL) + { + //warn(userAgent); // Use this to investigate other cases + char *ptr=NULL; + + // Determine the browser + if ((ptr = stringIn("Opera",userAgent)) != NULL) // Must be before IE + { + clientBrowser = btOpera; + } + else if ((ptr = stringIn("MSIE ",userAgent)) != NULL) + { + clientBrowser = btIE; + ptr += strlen("MSIE "); + clientBrowserExtra = cloneFirstWordByDelimiter(ptr,';'); + } + else if ((ptr = stringIn("Firefox",userAgent)) != NULL) + { + clientBrowser = btFF; + ptr += strlen("(Firefox/"); + clientBrowserExtra = cloneFirstWordByDelimiter(ptr,' '); + } + else if ((ptr = stringIn("Chrome",userAgent)) != NULL) // Must be before Safari + { + clientBrowser = btChrome; + ptr += strlen("Chrome/"); + clientBrowserExtra = cloneFirstWordByDelimiter(ptr,' '); + } + else if ((ptr = stringIn("Safari",userAgent)) != NULL) + { + clientBrowser = btSafari; + ptr += strlen("Safari/"); + clientBrowserExtra = cloneFirstWordByDelimiter(ptr,' '); + } + else + { + clientBrowser = btOther; + } + + // Determine the OS + if ((ptr = stringIn("(Windows",userAgent)) != NULL) + { + clientOsType = osWindows; + ptr += strlen("Windows "); + clientOsExtra = cloneFirstWordByDelimiter(ptr,';'); + } + else if (stringIn("Linux",userAgent) || stringIn("(X11)",userAgent)) + { + clientOsType = osLinux; + } + else if (stringIn("Mac",userAgent)) + { + clientOsType = osMac; + } + else + { + clientOsType = osOther; + } + } + } +if (browserQualifier != NULL) + { + if (clientBrowserExtra != NULL) + *browserQualifier = cloneString(clientBrowserExtra); + else + *browserQualifier = NULL; + } +if (clientOs != NULL) + *clientOs = clientOsType; +if (clientOsQualifier != NULL) + { + if (clientOsExtra != NULL) + *clientOsQualifier = cloneString(clientOsExtra); + else + *clientOsQualifier = NULL; + } + +return clientBrowser; +} + char *_cgiRawInput() /* For debugging get the unprocessed input. */ {