diff --git a/transport/stdio.lisp b/transport/stdio.lisp index 6cbac43..d69d7cf 100644 --- a/transport/stdio.lisp +++ b/transport/stdio.lisp @@ -6,6 +6,7 @@ #:connection #:connection-socket) (:import-from #:yason) + (:import-from #:babel) (:import-from #:bordeaux-threads #:make-thread #:destroy-thread) @@ -60,14 +61,15 @@ connection)) (defmethod send-message-using-transport ((transport stdio-transport) connection message) - (let ((json (with-output-to-string (s) - (yason:encode message s))) + (let ((json (babel:string-to-octets + (with-output-to-string (s) + (yason:encode message s)))) (stream (connection-socket connection))) - (format stream "Content-Length: ~A~C~C~:*~:*~C~C~A" + (format stream "Content-Length: ~A~C~C~:*~:*~C~C" (length json) #\Return - #\Newline - json) + #\Newline) + (write-sequence json stream) (force-output stream))) (defmethod receive-message-using-transport ((transport stdio-transport) connection) @@ -75,8 +77,14 @@ (headers (read-headers stream)) (length (ignore-errors (parse-integer (gethash "content-length" headers))))) (when length - (let ((body (make-string length))) - (read-sequence body (stdio-transport-input transport)) + (let ((body + (with-output-to-string (out) + (loop + :for c := (read-char stream) + :do (write-char c out) + (decf length (babel:string-size-in-octets (string c))) + (when (<= length 0) + (return)))))) (parse-message body))))) ;; character stream