From 3296cbcefa4b9d7a3b80ef8aef5fc59a830dd97f Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Fri, 4 Apr 2014 18:15:55 +0400 Subject: [PATCH] check the string for being an IPv4 address When we encounter a string where a json object representing a domain is expected, check if this string looks like an IPv4 address, and return a domain object with this address. --- NmcJson.hs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/NmcJson.hs b/NmcJson.hs index 14a2f63..69e693f 100644 --- a/NmcJson.hs +++ b/NmcJson.hs @@ -8,6 +8,8 @@ module NmcJson ( NmcRes(..) import Data.ByteString.Lazy (ByteString) import Data.Text as T (unpack) +import Data.List.Split +import Data.Char import Data.Map as M (Map, lookup) import Control.Applicative ((<$>), (<*>), empty) import Data.Aeson @@ -66,9 +68,19 @@ data NmcDom = NmcDom { domService :: Maybe [[String]] -- [NmcRRService] } deriving (Show, Eq) instance FromJSON NmcDom where - -- Some just put the IP address in the value, especially in the map. - -- As an ugly hack, try to interpret string as IP (v4) address. - parseJSON (String s) = return emptyNmcDom { domIp = Just [T.unpack s] } + -- Wherever we expect a domain object, there may be a string + -- containing IPv4 address. Interpret it as such. + -- Question: shall we try to recognize IPv6 addresses too? + parseJSON (String s) = + return $ if isIPv4 s' + then emptyNmcDom { domIp = Just [s'] } + else emptyNmcDom + where + s' = T.unpack s + isIPv4 x = all isNibble $ splitOn "." x + isNibble x = + if all isDigit x then (read x :: Int) < 256 + else False parseJSON (Object o) = NmcDom <$> o .:? "service" <*> o .:? "ip" -- 2.39.2