@@ -10,7 +10,6 @@ import qualified Data.ByteString.Base64 as B64
10
10
import Functora.Prelude
11
11
import qualified Network.URI as URI
12
12
import qualified Network.URI.Encode as UE
13
- import qualified Prelude
14
13
15
14
data Rfc2397 = Rfc2397
16
15
{ rfc2397Mime :: Unicode ,
@@ -57,45 +56,44 @@ encodeRfc2397
57
56
)
58
57
59
58
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
63
64
_ -> Nothing
64
65
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
69
70
_ -> Nothing
70
71
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
79
80
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)
87
85
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
90
88
bs <-
91
89
case enc of
92
90
Rfc2397EncodingUrl ->
93
- pure . encodeUtf8 . UE. decode $ from @ Unicode @ String thedata
91
+ pure . encodeUtf8 . UE. decode $ from @ Unicode @ String encBs
94
92
Rfc2397EncodingB64 ->
95
- either (const Nothing ) Just . B64. decode $ encodeUtf8 thedata
93
+ either (const Nothing ) Just . B64. decode $ encodeUtf8 encBs
96
94
pure
97
95
Rfc2397
98
- { rfc2397Mime = intercalate " ;" mediatype ,
96
+ { rfc2397Mime = intercalate " ;" mime ,
99
97
rfc2397Bytes = bs,
100
98
rfc2397Encoding = enc
101
99
}
0 commit comments