! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors assocs destructors http io io.encodings.ascii io.encodings.binary io.encodings.string io.encodings.utf8 io.files io.files.info io.pathnames kernel math.parser sequences strings urls.encoding ; IN: http.client.post-data TUPLE: measured-stream stream size ; C: measured-stream > "content-length" pick set-at ; M: object (set-post-data-headers) drop "chunked" "transfer-encoding" pick set-at ; PRIVATE> : set-post-data-headers ( header post-data -- header ) [ data>> (set-post-data-headers) ] [ content-type>> "content-type" pick set-at ] bi ; > [ [ write ] each-block ] with-input-stream ; : write-chunk ( chunk -- ) [ length >hex ";\r\n" append ascii encode write ] [ write ] bi ; M: object (write-post-data) [ [ write-chunk ] each-block ] with-input-stream "0;\r\n" ascii encode write ; GENERIC: >post-data ( object -- post-data ) M: f >post-data ; M: post-data >post-data ; M: string >post-data utf8 encode "application/octet-stream" swap >>data ; M: assoc >post-data "application/x-www-form-urlencoded" swap >>params ; M: object >post-data "application/octet-stream" swap >>data ; : pathname>measured-stream ( pathname -- stream ) string>> [ binary &dispose ] [ file-info size>> ] bi ; : normalize-post-data ( request -- request ) dup post-data>> [ dup params>> [ assoc>query ascii encode >>data ] when* dup data>> pathname? [ [ pathname>measured-stream ] change-data ] when drop ] when* ; PRIVATE> : unparse-post-data ( request -- request ) [ >post-data ] change-post-data normalize-post-data ; : write-post-data ( request -- request ) dup post-data>> [ data>> (write-post-data) ] when* ;