Skip to content

Commit 6fab6fa

Browse files
committed
refactor rfc2397
1 parent 71f8210 commit 6fab6fa

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

pub/functora/src/web/Functora/Rfc2397.hs

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import qualified Data.ByteString.Base64 as B64
1010
import Functora.Prelude
1111
import qualified Network.URI as URI
1212
import qualified Network.URI.Encode as UE
13-
import qualified Prelude
1413

1514
data Rfc2397 = Rfc2397
1615
{ rfc2397Mime :: Unicode,
@@ -57,45 +56,44 @@ encodeRfc2397
5756
)
5857

5958
decodeRfc2397 :: Unicode -> Maybe Rfc2397
60-
decodeRfc2397 xs =
61-
case break (== ':') xs of
62-
("data", rhs) | not (null rhs) -> decodeContents $ drop 1 rhs
59+
decodeRfc2397 raw =
60+
case break (== ':') raw of
61+
("data", mimeAndBytes)
62+
| not (null mimeAndBytes) ->
63+
splitMimeAndBytes $ drop 1 mimeAndBytes
6364
_ -> Nothing
6465

65-
decodeContents :: Unicode -> Maybe Rfc2397
66-
decodeContents xs =
67-
case break (== ',') xs of
68-
(lhs, rhs) | not (null rhs) -> decodePrefix lhs $ drop 1 rhs
66+
splitMimeAndBytes :: Unicode -> Maybe Rfc2397
67+
splitMimeAndBytes mimeAndBytes =
68+
case break (== ',') mimeAndBytes of
69+
(mime, bs) | not (null bs) -> decodeMime mime $ drop 1 bs
6970
_ -> Nothing
7071

71-
decodePrefix :: Unicode -> Unicode -> Maybe Rfc2397
72-
decodePrefix prefix thedata =
73-
case mediapart of
74-
[] -> decodeData ["text/plain", "charset=US-ASCII"] enc thedata
75-
(xs : _) ->
76-
case break (== '/') xs of
77-
(_, []) -> decodeData ("text/plain" : mediapart) enc thedata
78-
_ -> decodeData mediapart enc thedata
72+
decodeMime :: Unicode -> Unicode -> Maybe Rfc2397
73+
decodeMime encMime encBs =
74+
case mime of
75+
[] -> decodeBytes ["text/plain", "charset=US-ASCII"] enc encBs
76+
(typ : _) ->
77+
case break (== '/') typ of
78+
(_, []) -> decodeBytes ("text/plain" : mime) enc encBs
79+
_ -> decodeBytes mime enc encBs
7980
where
80-
fragments = breakList (== ';') prefix
81-
enc = case reverse fragments of
82-
("base64" : _) -> Rfc2397EncodingB64
83-
_ -> Rfc2397EncodingUrl
84-
mediapart
85-
| enc == Rfc2397EncodingB64 = Prelude.init fragments
86-
| otherwise = fragments
81+
(enc, mime) =
82+
case reverse $ breakList (== ';') encMime of
83+
("base64" : xs) -> (Rfc2397EncodingB64, reverse xs)
84+
xs -> (Rfc2397EncodingUrl, reverse xs)
8785

88-
decodeData :: [Unicode] -> Rfc2397Encoding -> Unicode -> Maybe Rfc2397
89-
decodeData mediatype enc thedata = do
86+
decodeBytes :: [Unicode] -> Rfc2397Encoding -> Unicode -> Maybe Rfc2397
87+
decodeBytes mime enc encBs = do
9088
bs <-
9189
case enc of
9290
Rfc2397EncodingUrl ->
93-
pure . encodeUtf8 . UE.decode $ from @Unicode @String thedata
91+
pure . encodeUtf8 . UE.decode $ from @Unicode @String encBs
9492
Rfc2397EncodingB64 ->
95-
either (const Nothing) Just . B64.decode $ encodeUtf8 thedata
93+
either (const Nothing) Just . B64.decode $ encodeUtf8 encBs
9694
pure
9795
Rfc2397
98-
{ rfc2397Mime = intercalate ";" mediatype,
96+
{ rfc2397Mime = intercalate ";" mime,
9997
rfc2397Bytes = bs,
10098
rfc2397Encoding = enc
10199
}

0 commit comments

Comments
 (0)