Skip to content

Instantly share code, notes, and snippets.

@metaleap
Created June 15, 2024 16:34
Show Gist options
  • Save metaleap/1e79c892eb89cf77222aaf77c2de346f to your computer and use it in GitHub Desktop.
Save metaleap/1e79c892eb89cf77222aaf77c2de346f to your computer and use it in GitHub Desktop.
;; repro: just `gerbil new` something and paste this into its main.ss
(import :std/io
:std/sugar
:std/format
:std/text/json
:std/net/json-rpc
(only-in :std/net/httpd/handler read-request-headers read-request-body))
(export main)
(include "../manifest.ss")
(def +input-buffer-size+ (expt 2 13))
(def +output-buffer-size+ (expt 2 15))
(def (bytes->json b) ;; Don't intern JSON keys, using strings
(parameterize ((json-symbolic-keys #f)) (bytes->json-object b)))
(defstruct Transport ((reader : BufferedReader) (writer : BufferedWriter)) final: #t)
(def (transport-stdio)
(make-Transport (open-buffered-reader (current-input-port) +input-buffer-size+)
(open-buffered-writer (current-output-port) +output-buffer-size+)))
(def (main . args)
(def transport (transport-stdio))
(using (transport :- Transport)
(while #t
(let (headers (read-request-headers transport.reader))
(def json (bytes->json (read-request-body transport.reader headers)))
(&BufferedReader-reset! transport.reader transport.reader #f)
(&BufferedWriter-write-string transport.writer (format "~a" json))
(thread-yield!)
; (&BufferedWriter-reset! transport.writer transport.writer #f)
))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment