mime.multipart: removed call to maybe-fill-bytes, fixes multipart parsing of short payloads

db4
Björn Lindqvist 2014-10-29 19:34:08 +01:00 committed by John Benediktsson
parent f75ee294e7
commit 9058fbff01
2 changed files with 32 additions and 13 deletions

View File

@ -4,37 +4,60 @@ USING: accessors assocs continuations fry http.server io
io.encodings.ascii io.files io.files.unique io.encodings.ascii io.files io.files.unique
io.servers io.streams.duplex io.streams.string io.servers io.streams.duplex io.streams.string
kernel math.ranges mime.multipart multiline namespaces random kernel math.ranges mime.multipart multiline namespaces random
sequences strings threads tools.test ; sequences sorting strings threads tools.test ;
IN: mime.multipart.tests IN: mime.multipart.tests
: upload-separator ( -- seq ) CONSTANT: separator1 "----WebKitFormBoundary6odjpVPXIighAE2L"
"----WebKitFormBoundary6odjpVPXIighAE2L" ;
: upload ( -- seq ) CONSTANT: upload1 "------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"file1\"; filename=\"up.txt\"\r\nContent-Type: text/plain\r\n\r\nuploaded!\n\r\n------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"file2\"; filename=\"\"\r\n\r\n\r\n------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"file3\"; filename=\"\"\r\n\r\n\r\n------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"text1\"\r\n\r\nlol\r\n------WebKitFormBoundary6odjpVPXIighAE2L--\r\n"
"------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"file1\"; filename=\"up.txt\"\r\nContent-Type: text/plain\r\n\r\nuploaded!\n\r\n------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"file2\"; filename=\"\"\r\n\r\n\r\n------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"file3\"; filename=\"\"\r\n\r\n\r\n------WebKitFormBoundary6odjpVPXIighAE2L\r\nContent-Disposition: form-data; name=\"text1\"\r\n\r\nlol\r\n------WebKitFormBoundary6odjpVPXIighAE2L--\r\n" ;
: mime-test-stream ( -- stream ) : mime-test-stream ( -- stream )
upload upload1
"mime" "test" make-unique-file ascii "mime" "test" make-unique-file ascii
[ set-file-contents ] [ <file-reader> ] 2bi ; [ set-file-contents ] [ <file-reader> ] 2bi ;
[ ] [ mime-test-stream [ ] with-input-stream ] unit-test [ ] [ mime-test-stream [ ] with-input-stream ] unit-test
[ t ] [ [ t ] [
mime-test-stream [ upload-separator parse-multipart ] with-input-stream mime-test-stream [ separator1 parse-multipart ] with-input-stream
"file1" swap key? "file1" swap key?
] unit-test ] unit-test
[ t ] [ [ t ] [
mime-test-stream [ upload-separator parse-multipart ] with-input-stream mime-test-stream [ separator1 parse-multipart ] with-input-stream
"file1" swap key? "file1" swap key?
] unit-test ] unit-test
[ t ] [ [ t ] [
mime-test-stream [ upload-separator parse-multipart ] with-input-stream mime-test-stream [ separator1 parse-multipart ] with-input-stream
"file1" of filename>> "up.txt" = "file1" of filename>> "up.txt" =
] unit-test ] unit-test
CONSTANT: separator2 "768de80194d942619886d23f1337aa15"
CONSTANT: upload2 "--768de80194d942619886d23f1337aa15\r\nContent-Disposition: form-data; name=\"text\"; filename=\"upload.txt\"\r\nContent-Type: text/plain\r\n\r\nhello\r\n--768de80194d942619886d23f1337aa15--\r\n"
[
"upload.txt"
H{
{ "content-disposition"
"form-data; name=\"text\"; filename=\"upload.txt\"" }
{ "content-type" "text/plain" }
}
] [
upload2 [ separator2 parse-multipart ] with-string-reader
"text" of [ filename>> ] [ headers>> ] bi
] unit-test
CONSTANT: separator3 "3f116598c7f0431b9f98148ed235c822"
CONSTANT: upload3 "--3f116598c7f0431b9f98148ed235c822\r\nContent-Disposition: form-data; name=\"text\"; filename=\"upload.txt\"\r\n\r\nhello\r\n--3f116598c7f0431b9f98148ed235c822\r\nContent-Disposition: form-data; name=\"text2\"; filename=\"upload.txt\"\r\n\r\nhello\r\n--3f116598c7f0431b9f98148ed235c822--\r\n"
[
{ "text" "text2" }
] [
upload3 [ separator3 parse-multipart ] with-string-reader
keys natural-sort
] unit-test
SYMBOL: mime-test-server SYMBOL: mime-test-server
: with-test-server ( quot -- ) : with-test-server ( quot -- )

View File

@ -44,9 +44,6 @@ ERROR: end-of-stream multipart ;
[ '[ _ B{ } append-as ] change-bytes ] [ '[ _ B{ } append-as ] change-bytes ]
[ t >>end-of-stream? ] if* ; [ t >>end-of-stream? ] if* ;
: maybe-fill-bytes ( multipart -- multipart )
dup bytes>> length 256 < [ fill-bytes ] when ;
: split-bytes ( bytes separator -- leftover-bytes safe-to-dump ) : split-bytes ( bytes separator -- leftover-bytes safe-to-dump )
dupd [ length ] bi@ 1 - - short cut-slice swap ; dupd [ length ] bi@ 1 - - short cut-slice swap ;
@ -68,7 +65,6 @@ ERROR: end-of-stream multipart ;
[ dump-until-separator ] with-string-writer ; [ dump-until-separator ] with-string-writer ;
: read-header ( multipart -- multipart ) : read-header ( multipart -- multipart )
maybe-fill-bytes
dup bytes>> "--\r\n" sequence= [ dup bytes>> "--\r\n" sequence= [
t >>end-of-stream? t >>end-of-stream?
] [ ] [