-USING: accessors io io.streams.string kernel mime.multipart
-tools.test make multiline ;
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs continuations fry http.server io
+io.encodings.ascii io.files io.files.temp io.files.unique
+io.servers io.streams.duplex io.streams.string
+kernel ranges mime.multipart multiline namespaces random
+sequences sorting strings threads tools.test ;
IN: mime.multipart.tests
-[ { "a" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
+CONSTANT: separator1 "----WebKitFormBoundary6odjpVPXIighAE2L"
-[ { "a" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 2 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
+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"
-[ { "a" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 3 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
+: mime-test-stream ( -- stream )
+ upload1
+ [ "mime" "test" unique-file ] with-temp-directory
+ ascii [ set-file-contents ] [ <file-reader> ] 2bi ;
-[ { "a" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 4 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
-
-[ { "a" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 5 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
-
-
-[ { "a" "a" f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
-
-[ { "aa" f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 2 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
-
-[ { "aa" f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 3 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
+{ } [ mime-test-stream [ ] with-input-stream ] unit-test
-[ { "aa" f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 4 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
+{ t } [
+ mime-test-stream [ separator1 parse-multipart ] with-input-stream
+ "file1" swap key?
] unit-test
-[ { "aa" f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 5 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
+{ t } [
+ mime-test-stream [ separator1 parse-multipart ] with-input-stream
+ "file1" swap key?
] unit-test
-
-
-[ { "a" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "zz" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
+{ t } [
+ mime-test-stream [ separator1 parse-multipart ] with-input-stream
+ "file1" of filename>> "up.txt" =
] unit-test
-[ { "a" "z" "z" "b" "z" "z" "c" "z" "z" "d" "zz" } ] [
- [
- "azzbzzczzdzz" <string-reader> "zzz" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] 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"
-[ { "a" "z" "z" "b" "z" "z" "c" "z" "z" "d" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
+{
+ "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
-[ { "az" "zb" "zz" "cz" "zd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 2 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] 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"
-[ { "a" "zzb" "zzc" "zzd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 3 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
+{
+ { "text" "text2" }
+} [
+ upload3 [ separator3 parse-multipart ] with-string-reader
+ keys natural-sort
] unit-test
-[ { "az" "zbzz" "czzd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 4 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
+SYMBOL: mime-test-server
-[ { "azz" "bzzcz" "zd" f } ] [
+: with-test-server ( quot -- )
[
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 5 >>n
- [ , ] [ ] multipart-step-loop drop
- ] { } make
-] unit-test
+ <http-server>
+ f >>secure
+ 0 >>insecure
+ ] dip with-threaded-server ; inline
+: test-server-port ( -- n )
+ mime-test-server get insecure>> ;
-[ { "a" f f "b" f f "c" f f "d" f f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "a" f f "b" f f "c" f f "d" f f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 2 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
+: a-stream ( n -- stream )
+ CHAR: a <string> <string-reader> ;
-[ { "a" f f "b" f f "c" f f "d" f f } ] [
+{ } [
[
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 3 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
+ ] with-test-server
] unit-test
-[ { "a" f f "b" f f "c" f f "d" f f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 4 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
+[
+ "--\r\n\r\n" <string-reader> [
+ "\r\n\r\n" <multipart>
+ "\r\n\r\n" parse-multipart
+ ] with-input-stream
+] [ mime-decoding-ran-out-of-bytes? ] must-fail-with
-[ { "a" f f "b" f f "c" f f "d" f f } ] [
- [
- "azzbzzczzdzz" <string-reader> "z" <multipart-stream> 5 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-
-[ { "a" "a" f f "b" f f "c" f f "d" f f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "aa" f f "b" f f "c" f f "d" f f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 2 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "aa" f f "b" f f "c" f f "d" f f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 3 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "aa" f f "b" f f "c" f f "d" f f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 4 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "aa" f f "b" f f "c" f f "d" f f } ] [
- [
- "aazzbzzczzdzz" <string-reader> "z" <multipart-stream> 5 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-
-
-[ { "a" f "b" f "c" f "d" f } ] [
- [
- "azzbzzczzdzz" <string-reader> "zz" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "a" "z" "z" "b" "z" "z" "c" "z" "z" "d" "zz" } ] [
- [
- "azzbzzczzdzz" <string-reader> "zzz" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "a" "z" "z" "b" "z" "z" "c" "z" "z" "d" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 1 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "az" "zb" "zz" "cz" "zd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 2 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "a" "zzb" "zzc" "zzd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 3 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "az" "zbzz" "czzd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 4 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test
-
-[ { "azz" "bzzcz" "zd" f } ] [
- [
- "azzbzzczzdzzz" <string-reader> "zzz" <multipart-stream> 5 >>n
- [ , ] [ ] multipart-loop-all
- ] { } make
-] unit-test