#include "config.h"
#include "UserAgent.h"
#include "HTTPParsers.h"
#include "UserAgentQuirks.h"
#include <wtf/NeverDestroyed.h>
#include <wtf/URL.h>
#include <wtf/text/StringBuilder.h>
#if OS(UNIX)
#include <sys/utsname.h>
#endif
namespace WebCore {
static const char* platformForUAString()
{
#if OS(MAC_OS_X)
return "Macintosh";
#else
return "X11";
#endif
}
static const String platformVersionForUAString()
{
#if OS(UNIX)
struct utsname name;
uname(&name);
static NeverDestroyed<const String> uaOSVersion(makeString(name.sysname, ' ', name.machine));
return uaOSVersion;
#else
static NeverDestroyed<const String> uaOSVersion(MAKE_STATIC_STRING_IMPL("Intel Mac OS X 10_13_4"));
return uaOSVersion;
#endif
}
static inline const char* versionForUAString()
{
return "605.1.15";
}
static String buildUserAgentString(const UserAgentQuirks& quirks)
{
StringBuilder uaString;
uaString.appendLiteral("Mozilla/5.0 ");
uaString.append('(');
if (quirks.contains(UserAgentQuirks::NeedsMacintoshPlatform))
uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsMacintoshPlatform));
else if (quirks.contains(UserAgentQuirks::NeedsLinuxDesktopPlatform))
uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsLinuxDesktopPlatform));
else {
uaString.append(platformForUAString());
uaString.appendLiteral("; ");
uaString.append(platformVersionForUAString());
}
uaString.appendLiteral(") AppleWebKit/");
uaString.append(versionForUAString());
uaString.appendLiteral(" (KHTML, like Gecko) ");
if (quirks.contains(UserAgentQuirks::NeedsChromeBrowser)) {
uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsChromeBrowser));
uaString.appendLiteral(" ");
}
uaString.appendLiteral("Version/13.0 Safari/");
uaString.append(versionForUAString());
return uaString.toString();
}
static const String standardUserAgentStatic()
{
static NeverDestroyed<const String> uaStatic(buildUserAgentString(UserAgentQuirks()));
return uaStatic;
}
String standardUserAgent(const String& applicationName, const String& applicationVersion)
{
String userAgent;
if (applicationName.isEmpty()) {
userAgent = standardUserAgentStatic();
} else {
String finalApplicationVersion = applicationVersion;
if (finalApplicationVersion.isEmpty())
finalApplicationVersion = versionForUAString();
userAgent = standardUserAgentStatic() + ' ' + applicationName + '/' + finalApplicationVersion;
}
ASSERT(isValidUserAgentHeaderValue(userAgent));
return userAgent;
}
String standardUserAgentForURL(const URL& url)
{
auto quirks = UserAgentQuirks::quirksForURL(url);
if (quirks.isEmpty())
return String();
String userAgent(buildUserAgentString(quirks));
ASSERT(isValidUserAgentHeaderValue(userAgent));
return userAgent;
}
}