@@ -7,13 +7,14 @@ import Prelude
77
88import Control.Alt ((<|>))
99
10- import Data.String as S
10+ import Data.Int as Int
11+ import Data.Maybe (Maybe (Just))
1112import Data.URI.Common (parseSubDelims , parsePCTEncoded , parseUnreserved , joinWith , rxPat )
1213import Data.URI.Types (Host (..))
1314
14- import Text.Parsing.StringParser (Parser , try )
15+ import Text.Parsing.StringParser (Parser , try , fail )
1516import Text.Parsing.StringParser.Combinators ((<?>), many1 )
16- import Text.Parsing.StringParser.String (string )
17+ import Text.Parsing.StringParser.String (string , char )
1718
1819parseHost ∷ Parser Host
1920parseHost = parseIPv6Address <|> parseIPv4Address <|> parseRegName
@@ -23,12 +24,24 @@ parseIPv6Address ∷ Parser Host
2324parseIPv6Address = IPv6Address <$> (string " [" *> rxPat " [a-f0-9\\ .:]+" <* string " ]" ) <?> " IPv6 address"
2425
2526parseIPv4Address ∷ Parser Host
26- parseIPv4Address = IPv4Address <$> rxPat pattern <?> " IPv4 address"
27+ parseIPv4Address = IPv4Address <$> parse <?> " IPv4 address"
2728 where
28- pattern ∷ String
29- pattern = S .joinWith " " [" (" , octet, " \\ ." , octet, " \\ ." , octet, " \\ ." , octet, " )" ]
30- octet ∷ String
31- octet = " (1[0-9]{2}|[1-9][0-9]|[0-9]|2[0-4][0-9]|25[0-5])"
29+ parse ∷ Parser String
30+ parse = do
31+ o1 <- octet
32+ _ <- char ' .'
33+ o2 <- octet
34+ _ <- char ' .'
35+ o3 <- octet
36+ _ <- char ' .'
37+ o4 <- octet
38+ pure $ show o1 <> " ." <> show o2 <> " ." <> show o3 <> " ." <> show o4
39+ octet ∷ Parser Int
40+ octet = do
41+ s <- rxPat " 0|([1-9][0-9]{0,2})"
42+ case Int .fromString s of
43+ Just n | n >= 0 && n <= 255 -> pure n
44+ _ -> fail " Invalid IPv4 address octet"
3245
3346parseRegName ∷ Parser Host
3447parseRegName =
0 commit comments