mime

MIME data-shape handling: a built-in extension-to-type registry, Content-Type and Content-Disposition parsing, multipart boundary generation, type classification, and Accept-header content negotiation. The registry covers ~200 common extensions offline and is extensible at runtime. The data-shape companion to cx-stdlib/url, composing with cx-stdlib/email for multipart messages.

mime:type-for-extension

[$mime:type-for-extension] -> string — Look up the canonical MIME type for a file extension (dot optional); 'application/octet-stream' if unknown.

            [?lib 'cx-stdlib/mime']
[$mime:type-for-extension ".txt"]
          
            'text/plain'
          

mime:extension-for-type

[$mime:extension-for-type] -> string — Return the most common file extension for a MIME type; empty string if unknown.

            [?lib 'cx-stdlib/mime']
[$mime:extension-for-type "image/jpeg"]
          
            '.jpg'
          

mime:all-extensions-for-type

[$mime:all-extensions-for-type] -> [sequence string] — Return every known file extension for a MIME type.

            [?lib 'cx-stdlib/mime']
[$count [$mime:all-extensions-for-type "image/jpeg"]]
          
            2
          

mime:register-type

[$mime:register-type] -> null — Add one extension-to-type mapping to the process-wide registry, overriding any built-in.

            [?lib 'cx-stdlib/mime']
[?let [= $_ [$mime:register-type ".avif" "image/avif"]] [$mime:type-for-extension ".avif"]]
          
            'image/avif'
          

mime:load-mime-types

[$mime:load-mime-types] -> int — Merge a mime.types file into the registry and return the count loaded; raises CXER2804 on a missing or malformed file.

            [?lib 'cx-stdlib/mime']
[$mime:load-mime-types "/no/such/mime.types/file/xyz"]
          
            cx-err:CXER2804
          

mime:parse-content-type

[$mime:parse-content-type] -> element — Parse a Content-Type header into a [content-type] element; raises CXER2800 on parse failure.

            [?lib 'cx-stdlib/mime']
[?let [= $p [$mime:parse-content-type "text/html; charset=utf-8"]] $p/@type]
          
            'text'
          

mime:format-content-type

[$mime:format-content-type] -> string — Serialize a parsed content-type back to a header string, quoting values where required.

            [?lib 'cx-stdlib/mime']
[$mime:format-content-type [$mime:parse-content-type "text/html"]]
          
            'text/html'
          

mime:get-parameter

[$mime:get-parameter] -> string — Return a named parameter's value from a parsed content-type; empty string if absent.

            [?lib 'cx-stdlib/mime']
[$mime:get-parameter [$mime:parse-content-type "text/html; charset=\"UTF-8\""] "charset"]
          
            'UTF-8'
          

mime:parse-content-disposition

[$mime:parse-content-disposition] -> element — Parse a Content-Disposition header into a [content-disposition] element; raises CXER2801 on parse failure.

            [?lib 'cx-stdlib/mime']
[?let [= $p [$mime:parse-content-disposition "attachment; filename=\"report.pdf\""]] $p/@type]
          
            'attachment'
          

mime:format-content-disposition

[$mime:format-content-disposition] -> string — Serialize a parsed content-disposition, emitting an RFC 5987 filename* plus ASCII fallback for non-ASCII names.

            [?lib 'cx-stdlib/mime']
[$mime:disposition-filename [$mime:parse-content-disposition [$mime:format-content-disposition [$mime:parse-content-disposition "attachment; filename=\"report.pdf\""]]]]
          
            'report.pdf'
          

mime:disposition-filename

[$mime:disposition-filename] -> string — Return the decoded filename, preferring filename* over filename; raises CXER2803 on a malformed filename*.

            [?lib 'cx-stdlib/mime']
[$mime:disposition-filename [$mime:parse-content-disposition "attachment; filename=\"report.pdf\""]]
          
            'report.pdf'
          

mime:multipart-boundary

[$mime:multipart-boundary] -> string — Generate a fresh 24-char multipart boundary ('=_Part_' prefix plus 17 random hex chars).

            [?lib 'cx-stdlib/mime']
[?lib 'cx-stdlib/strings']
[$strings:starts-with [$mime:multipart-boundary] "=_Part_"]
          
            true
          

mime:is-valid-boundary

[$mime:is-valid-boundary] -> bool — Report whether a string is a valid multipart boundary per RFC 2046 (1-70 chars, restricted set).

            [?lib 'cx-stdlib/mime']
[$mime:is-valid-boundary "----=_Part_12345"]
          
            true
          

mime:is-text-type

[$mime:is-text-type] -> bool — Report whether a MIME type has the text top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-text-type "text/html"]
          
            true
          

mime:is-binary-type

[$mime:is-binary-type] -> bool — Report whether a MIME type denotes binary (non-text) content.

            [?lib 'cx-stdlib/mime']
[$mime:is-binary-type "application/pdf"]
          
            true
          

mime:is-image-type

[$mime:is-image-type] -> bool — Report whether a MIME type has the image top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-image-type "image/svg+xml"]
          
            true
          

mime:is-audio-type

[$mime:is-audio-type] -> bool — Report whether a MIME type has the audio top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-audio-type "audio/mpeg"]
          
            true
          

mime:is-video-type

[$mime:is-video-type] -> bool — Report whether a MIME type has the video top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-video-type "video/mp4"]
          
            true
          

mime:is-message-type

[$mime:is-message-type] -> bool — Report whether a MIME type has the message top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-message-type "message/rfc822"]
          
            true
          

mime:is-multipart-type

[$mime:is-multipart-type] -> bool — Report whether a MIME type has the multipart top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-multipart-type "multipart/mixed"]
          
            true
          

mime:is-application-type

[$mime:is-application-type] -> bool — Report whether a MIME type has the application top-level type.

            [?lib 'cx-stdlib/mime']
[$mime:is-application-type "application/pdf"]
          
            true
          

mime:is-structured-syntax

[$mime:is-structured-syntax] -> string — Return the structured-syntax suffix per RFC 6838 (svg+xml gives 'xml'); empty string if none.

            [?lib 'cx-stdlib/mime']
[$mime:is-structured-syntax "image/svg+xml"]
          
            'xml'
          

mime:charset-of

[$mime:charset-of] -> string — Extract the charset parameter from a parsed content-type; empty string if absent.

            [?lib 'cx-stdlib/mime']
[$mime:charset-of [$mime:parse-content-type "text/html; charset=utf-8"]]
          
            'utf-8'
          

mime:with-charset

[$mime:with-charset] -> element — Return a new content-type element with the charset parameter set, replacing any existing.

            [?lib 'cx-stdlib/mime']
[$mime:charset-of [$mime:with-charset [$mime:parse-content-type "text/html"] "iso-8859-1"]]
          
            'iso-8859-1'
          

mime:parse-accept

[$mime:parse-accept] -> [sequence element] — Parse an Accept header into [accept] elements sorted by q-value then specificity.

            [?lib 'cx-stdlib/mime']
[$count [$mime:parse-accept "text/html;q=0.9, */*;q=0.8"]]
          
            2
          

mime:match-accept

[$mime:match-accept] -> string — Return the best-matching offered MIME type for an Accept header per RFC 7231; empty if none acceptable.

            [?lib 'cx-stdlib/mime']
[$mime:match-accept "text/*;q=0.5, text/html;q=0.9" ["text/plain", "text/html"]]
          
            'text/html'