ua-parser 0.3 → 0.4
raw patch · 4 files changed
+91/−29 lines, 4 filesdep ~aesondep ~yaml
Dependency ranges changed: aeson, yaml
Files
- regexes.yaml +82/−20
- src/Web/UAParser/Core.hs +3/−3
- test/src/TestSuite.hs +2/−2
- ua-parser.cabal +4/−4
regexes.yaml view
@@ -88,7 +88,7 @@ # Lightning (for Thunderbird) # http://www.mozilla.org/projects/calendar/lightning/- - regex: '(Lightning)/(\d+)\.(\d+)([ab]?\d+[a-z]*)'+ - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))' # Swiftfox - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'@@ -156,6 +156,18 @@ - regex: '(FlyFlow)/(\d+)\.(\d+)' family_replacement: 'Baidu Explorer' + # QQ Browsers+ - regex: '(MQQBrowser)/(\d+)\.(\d+)\.(\d+)'+ family_replacement: 'QQ Browser Mobile'+ - regex: '(MQQBrowser)/(\d+)\.(\d+)'+ family_replacement: 'QQ Browser Mobile'+ - regex: '(QQBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'+ family_replacement: 'QQ Browser'+ - regex: 'MQQBrowser'+ family_replacement: 'QQ Browser Mobile'+ - regex: 'QQBrowser'+ family_replacement: 'QQ Browser'+ # Pingdom - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)' family_replacement: 'PingdomBot'@@ -164,10 +176,18 @@ - regex: '(facebookexternalhit)/(\d+)\.(\d+)' family_replacement: 'FacebookBot' + # LinkedIn+ - regex: '(LinkedInBot)/(\d+)\.(\d+)'+ family_replacement: 'LinkedInBot'+ # Twitterbot - regex: '(Twitterbot)/(\d+)\.(\d+)' family_replacement: 'TwitterBot' + # Google Plus+ - regex: 'Google.*/\+/web/snippet'+ family_replacement: 'GooglePlusBot'+ # Rackspace Monitoring - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)' family_replacement: 'RackspaceBot'@@ -191,13 +211,35 @@ #### MAIN CASES - this catches > 50% of all browsers #### # Browser/major_version.minor_version.beta_version- - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)'+ - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)' + # Outlook 2007+ - regex: 'MSOffice 12'+ family_replacement: 'Outlook'+ v1_replacement: '2007'++ # Outlook 2010+ - regex: 'MSOffice 14'+ family_replacement: 'Outlook'+ v1_replacement: '2010'++ # Outlook 2013+ - regex: 'Microsoft Outlook 15\.\d+\.\d+'+ family_replacement: 'Outlook'+ v1_replacement: '2013'++ # Apple Air Mail+ - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'++ # Thunderbird+ - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)'+ family_replacement: 'Thunderbird'+ # Chrome/Chromium/major_version.minor_version.beta_version - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)' # Browser/major_version.minor_version- - regex: '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser)/(\d+)\.(\d+)'+ - regex: '(bingbot|Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser)/(\d+)\.(\d+)' # Chrome/Chromium/major_version.minor_version - regex: '(Chromium|Chrome)/(\d+)\.(\d+)'@@ -238,10 +280,6 @@ - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7' family_replacement: 'IE Large Screen' - # AFTER THE EDGE CASES ABOVE!- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'- - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'- #### END MAIN CASES #### #### SPECIAL CASES ####@@ -283,9 +321,6 @@ - regex: '(BonEcho)/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Bon Echo' - - regex: 'M?QQBrowser'- family_replacement: 'QQ Browser'- - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)' family_replacement: 'Mobile Safari' - regex: '(iPod).*Version/(\d+)\.(\d+)'@@ -315,8 +350,10 @@ - regex: '(QtCarBrowser)' v1_replacement: '1' - - regex: '(iBrowser/Mini)(\d+).(\d+)'+ - regex: '^(iBrowser/Mini)(\d+).(\d+)' family_replacement: 'iBrowser Mini'+ - regex: '^(iBrowser|iRAPP)/(\d+).(\d+)'+ # nokia browsers # based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices - regex: '^(Nokia)'@@ -397,10 +434,22 @@ - regex: '(Phantom)/V(\d+)\.(\d+)' family_replacement: 'Phantom Browser' - - regex: '([MS]?IE) (\d+)\.(\d+)'+ - regex: 'Trident(.*)rv.(\d+)\.(\d+)' family_replacement: 'IE' - - regex: 'Trident(.*)rv.(\d+)\.(\d+)'+ # Apple Mail++ # apple mail - not directly detectable, have it after Safari stuff+ - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'+ family_replacement: 'AppleMail'++ # AFTER THE EDGE CASES ABOVE!+ # AFTER IE11+ # BEFORE all other IE+ - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'+ - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'++ - regex: '([MS]?IE) (\d+)\.(\d+)' family_replacement: 'IE' - regex: '(python-requests)/(\d+)\.(\d+)'@@ -527,11 +576,14 @@ - regex: '(Windows NT 6\.2; ARM;)' os_replacement: 'Windows RT'-- # is this a spoof or is nt 6.2 out and about in some capacity? - regex: '(Windows NT 6\.2)' os_replacement: 'Windows 8' + - regex: '(Windows NT 6\.3; ARM;)'+ os_replacement: 'Windows RT 8.1'+ - regex: '(Windows NT 6\.3)'+ os_replacement: 'Windows 8.1'+ - regex: '(Windows NT 5\.0)' os_replacement: 'Windows 2000' @@ -571,7 +623,7 @@ # iOS # http://en.wikipedia.org/wiki/IOS_version_history ##########- - regex: '(CPU OS|iPhone OS) (\d+)_(\d+)(?:_(\d+))?'+ - regex: '(CPU OS|iPhone OS|CPU iPhone) (\d+)[_\.](\d+)(?:[_\.](\d+))?' os_replacement: 'iOS' # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs@@ -606,7 +658,7 @@ # Symbian + Symbian OS # http://en.wikipedia.org/wiki/History_of_Symbian ##########- - regex: '(Symbian[Oo][Ss])/(\d+)\.(\d+)'+ - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)' os_replacement: 'Symbian OS' - regex: '(Symbian/3).+NokiaBrowser/7\.3' os_replacement: 'Symbian^3 Anna'@@ -614,7 +666,7 @@ os_replacement: 'Symbian^3 Belle' - regex: '(Symbian/3)' os_replacement: 'Symbian^3'- - regex: '(Series 60|SymbOS|S60)'+ - regex: '\b(Series 60|SymbOS|S60Version|S60V\d|S60\b)' os_replacement: 'Symbian OS' - regex: '(MeeGo)' - regex: 'Symbian [Oo][Ss]'@@ -641,7 +693,7 @@ ########## # Firefox OS ##########- - regex: '\(Mobile;.+Firefox/\d+\.\d+'+ - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+' os_replacement: 'Firefox OS' ##########@@ -763,6 +815,16 @@ device_replacement: 'Kindle Fire HD 8.9" WiFi' - regex: '(KFJWA Build)' device_replacement: 'Kindle Fire HD 8.9" 4G'+ - regex: '(KFSOWI Build)'+ device_replacement: 'Kindle Fire HD 7" WiFi'+ - regex: '(KFTHWI Build)'+ device_replacement: 'Kindle Fire HDX 7" WiFi'+ - regex: '(KFTHWA Build)'+ device_replacement: 'Kindle Fire HDX 7" 4G'+ - regex: '(KFAPWI Build)'+ device_replacement: 'Kindle Fire HDX 8.9" WiFi'+ - regex: '(KFAPWA Build)'+ device_replacement: 'Kindle Fire HDX 8.9" 4G' - regex: '(Kindle Fire)' - regex: '(Kindle)' - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'@@ -1068,6 +1130,6 @@ ########## # Spiders (this is hack...) ##########- - regex: '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks|crawler)'+ - regex: '(bingbot|bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks|crawler)' device_replacement: 'Spider'
src/Web/UAParser/Core.hs view
@@ -72,7 +72,7 @@ mkRes [_,f,v1,v2] = Just $ UAResult (repF f) (repV1 v1) (Just v2) Nothing mkRes [_,f,v1] = Just $ UAResult (repF f) (repV1 v1) Nothing Nothing mkRes [_, f] = Just $ UAResult (repF f) Nothing Nothing Nothing- mkRes x = Nothing+ mkRes _ = Nothing -- error $ "Unsupported match in parseUA" ++ show x repV1 x = uaV1Rep `mplus` Just x@@ -127,7 +127,7 @@ mkRes [_,f,v1,v2] = Just $ OSResult (repF f) (Just v1) (Just v2) Nothing Nothing mkRes [_,f,v1] = Just $ OSResult (repF f) (Just v1) Nothing Nothing Nothing mkRes [_, f] = Just $ OSResult (repF f) Nothing Nothing Nothing Nothing- mkRes x = Nothing+ mkRes _ = Nothing -- error $ "Unsupported match in parseOS" ++ show x repF x = maybe x id osFamRep@@ -202,7 +202,7 @@ ------------------------------------------------------------------------------- parseRegex :: Object -> Parser Regex-parseRegex v = flip compile [] `liftM` (v .: "regex")+parseRegex v = flip compile [] `liftM` (T.encodeUtf8 <$> v .: "regex") -------------------------------------------------------------------------------
test/src/TestSuite.hs view
@@ -159,7 +159,7 @@ ------------------------------------------------------------------------------- instance FromJSON UserAgentTestCase where parseJSON (Object v) =- UATC <$> v .: "user_agent_string"+ UATC <$> T.encodeUtf8 <$> v .: "user_agent_string" <*> (v .: "family" <|> return "") <*> (v .:? "v1" <|> return Nothing) <*> (v .:? "v2" <|> return Nothing)@@ -180,7 +180,7 @@ ------------------------------------------------------------------------------- instance FromJSON OSTestCase where parseJSON (Object v) =- OSTC <$> (v .: "user_agent_string" <|> return "")+ OSTC <$> (T.encodeUtf8 <$> v .: "user_agent_string" <|> return "") <*> (v .: "family" <|> return "") <*> nonBlank (v .:? "major" <|> return Nothing) <*> nonBlank (v .:? "minor" <|> return Nothing)
ua-parser.cabal view
@@ -1,7 +1,7 @@ Name: ua-parser Description: Please refer to the git/github README on the project for example usage.-Version: 0.3-Synopsis: Port of ua-parser in Haskell+Version: 0.4+Synopsis: A library for parsing User-Agent strings, official Haskell port of ua-parser License: BSD3 License-file: LICENSE Author: Ozgun Ataman@@ -31,8 +31,8 @@ , bytestring , text , pcre-light- , yaml >= 0.7- , aeson+ , yaml >= 0.7 && < 0.9+ , aeson >= 0.7 && < 0.8 , filepath , data-default , syb