1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs destructors http io io.encodings.ascii
4 io.encodings.binary io.encodings.string io.encodings.utf8
5 io.files io.files.info io.pathnames kernel math.parser sequences
6 strings urls.encoding ;
7 IN: http.client.post-data
9 TUPLE: measured-stream stream size ;
11 C: <measured-stream> measured-stream
15 GENERIC: (set-post-data-headers) ( header data -- header )
17 M: sequence (set-post-data-headers)
18 length "content-length" pick set-at ;
20 M: measured-stream (set-post-data-headers)
21 size>> "content-length" pick set-at ;
23 M: object (set-post-data-headers)
24 drop "chunked" "transfer-encoding" pick set-at ;
28 : set-post-data-headers ( header post-data -- header )
29 [ data>> (set-post-data-headers) ]
30 [ content-type>> "content-type" pick set-at ] bi ;
34 GENERIC: (write-post-data) ( data -- )
36 M: sequence (write-post-data) write ;
38 M: measured-stream (write-post-data)
39 stream>> [ [ write ] each-block ] with-input-stream ;
41 : write-chunk ( chunk -- )
42 [ length >hex ";\r\n" append ascii encode write ] [ write ] bi ;
44 M: object (write-post-data)
45 [ [ write-chunk ] each-block ] with-input-stream
46 "0;\r\n" ascii encode write ;
48 GENERIC: >post-data ( object -- post-data )
52 M: post-data >post-data ;
56 "application/octet-stream" <post-data>
60 "application/x-www-form-urlencoded" <post-data>
64 "application/octet-stream" <post-data>
67 : pathname>measured-stream ( pathname -- stream )
69 [ binary <file-reader> &dispose ]
70 [ file-info size>> ] bi
73 : normalize-post-data ( request -- request )
76 assoc>query ascii encode >>data
78 dup data>> pathname? [
79 [ pathname>measured-stream ] change-data
86 : unparse-post-data ( request -- request )
87 [ >post-data ] change-post-data
90 : write-post-data ( request -- request )
91 dup post-data>> [ data>> (write-post-data) ] when* ;