";" split1 nip
"=" split1 nip [ no-boundary ] unless* ;
-: read-multipart-data ( request -- form-variables uploaded-files )
+: read-multipart-data ( request -- mime-parts )
[ "content-type" header ]
[ "content-length" header string>number ] bi
unlimit-input
: parse-content ( request content-type -- post-data )
[ <post-data> swap ] keep {
- { "multipart/form-data" [ read-multipart-data assoc-union >>params ] }
+ { "multipart/form-data" [ read-multipart-data >>params ] }
{ "application/x-www-form-urlencoded" [ read-content query>assoc >>params ] }
[ drop read-content >>data ]
} case ;
content-disposition bytes
filename temp-file
name name-content
-uploaded-files
-form-variables ;
+mime-parts ;
TUPLE: mime-file headers filename temporary-path ;
TUPLE: mime-variable headers key value ;
: <multipart> ( mime-separator -- multipart )
multipart new
swap >>mime-separator
- H{ } clone >>uploaded-files
- H{ } clone >>form-variables ;
+ H{ } clone >>mime-parts ;
ERROR: bad-header bytes ;
] [
[ [ header>> ] [ filename>> ] [ temp-file>> ] tri mime-file boa ]
[ filename>> ]
- [ uploaded-files>> set-at ] tri
+ [ mime-parts>> set-at ] tri
] if ;
-: save-form-variable ( multipart -- )
+: save-mime-part ( multipart -- )
dup name>> empty-name? [
drop
] [
[ [ header>> ] [ name>> ] [ name-content>> ] tri mime-variable boa ]
[ name>> ]
- [ form-variables>> set-at ] tri
+ [ mime-parts>> set-at ] tri
] if ;
: dump-mime-file ( multipart filename -- multipart )
] [
"name" lookup-disposition [
[ dup mime-separator>> dump-string >>name-content ] dip
- >>name dup save-form-variable
+ >>name dup save-mime-part
] [
unknown-content-disposition
] if*
read-header
dup end-of-stream?>> [ process-header parse-multipart-loop ] unless ;
-: parse-multipart ( separator -- form-variables uploaded-files )
+: parse-multipart ( separator -- mime-parts )
<multipart> parse-beginning parse-multipart-loop
- [ form-variables>> ] [ uploaded-files>> ] bi ;
+ mime-parts>> ;