make mime parsing return a single hashtable instead of several different ones
							parent
							
								
									6f12877418
								
							
						
					
					
						commit
						43830f5fcc
					
				| 
						 | 
				
			
			@ -42,7 +42,7 @@ ERROR: no-boundary ;
 | 
			
		|||
    ";" 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
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ ERROR: no-boundary ;
 | 
			
		|||
 | 
			
		||||
: 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 ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,11 +20,11 @@ IN: mime.multipart.tests
 | 
			
		|||
 | 
			
		||||
[ t ] [
 | 
			
		||||
    mime-test-stream [ upload-separator parse-multipart ] with-input-stream
 | 
			
		||||
    nip "\"up.txt\"" swap key?
 | 
			
		||||
    "\"up.txt\"" swap key?
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[ t ] [
 | 
			
		||||
    mime-test-stream [ upload-separator parse-multipart ] with-input-stream
 | 
			
		||||
    drop "\"text1\"" swap key?
 | 
			
		||||
    "\"text1\"" swap key?
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,8 +16,7 @@ header
 | 
			
		|||
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 ;
 | 
			
		||||
| 
						 | 
				
			
			@ -25,8 +24,7 @@ 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 ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -87,16 +85,16 @@ ERROR: end-of-stream multipart ;
 | 
			
		|||
    ] [
 | 
			
		||||
        [ [ 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 )
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +122,7 @@ ERROR: unknown-content-disposition 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*
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +155,6 @@ ERROR: no-content-disposition multipart ;
 | 
			
		|||
    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>> ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue