--- openssl/openssl.scm 2013-07-02 17:52:17.369403454 +0100 +++ openssl2/openssl.scm 2013-07-02 17:34:32.194484359 +0100 @@ -441,24 +442,43 @@ EOF fd (tcp-read-timeout) "SSL read timed out"))) buffer)))) - (out - (make-output-port - ;; write - (lambda (buffer) - (startup) - (when (> (##sys#size buffer) 0) ; Undefined behaviour for 0 bytes! - (let loop ((offset 0) (size (##sys#size buffer))) - (let ((ret (ssl-call/timeout - 'ssl-write - (lambda () (ssl-write ssl buffer offset size)) - fd (tcp-write-timeout) "SSL write timed out"))) - (when (fx< ret size) ; Partial write - (loop (fx+ offset ret) (fx- size ret))))))) - ;; close - (lambda () - (when (startup #t) - (set! out-open? #f) - (shutdown)))))) + (out + (let* ((buffer #f) + (outbufsize (tcp-buffer-size)) + (outbuf (and outbufsize (fx> outbufsize 0) "")) + (output + (lambda (buffer) + (startup) + (when (> (##sys#size buffer) 0) ; Undefined behaviour for 0 bytes! + (let loop ((offset 0) (size (##sys#size buffer))) + (let ((ret (ssl-call/timeout + 'ssl-write + (lambda () (ssl-write ssl buffer offset size)) + fd (tcp-write-timeout) "SSL write timed out"))) + (when (fx< ret size) ; Partial write + (loop (fx+ offset ret) (fx- size ret))))))))) + (make-output-port + ;; write + (lambda (buffer) + (if outbuf + (begin(set! outbuf (string-append outbuf buffer)) + (when (fx>= (string-length outbuf) outbufsize) + (output outbuf) + (set! outbuf ""))) + (output buffer))) + ;; close + (lambda () + (when (startup #t) + (if outbuf + (begin (output outbuf) + (set! outbuf ""))) + (set! out-open? #f) + (shutdown))) + ;; flush + (lambda () + (if outbuf + (begin (output outbuf) + (set! outbuf "")))))))) (##sys#setslot in 3 "(ssl)") (##sys#setslot out 3 "(ssl)") ;; first "reserved" slot