Skip to content

Instantly share code, notes, and snippets.

@gbaptista
Last active August 9, 2020 21:56
Show Gist options
  • Save gbaptista/8eb2d925c0ad2bc36d6c6d97c8859175 to your computer and use it in GitHub Desktop.
Save gbaptista/8eb2d925c0ad2bc36d6c6d97c8859175 to your computer and use it in GitHub Desktop.
Vega Server - Fennel Examples https://fennel-lang.org/reference
(local vega (require "vega"))
(λ port []
(let [default 3000 cli (. arg 1)]
(if cli cli default)))
(λ telnet-handler [name response meta]
(meta.log:info (.. "Log from" (meta.log.color:yellow " Telnet Handler")))
(response:write (.. "\nHello " (tostring name) "!\n\n")))
(local telnet-protocol
{:identifier "Telnet"
:dispatcher (λ [] true)
:handler telnet-handler})
(local vega-config
{:port (port)
:protocol telnet-protocol})
(vega.tcp vega-config)
(local vega (require "vega"))
(local http1 (require "vega-http1"))
(λ port []
(let [default 3000 cli (. arg 1)]
(if cli cli default)))
(fn handler [header ?body response meta]
(meta.log:info (.. "Log from" (meta.log.color:light-green " HTTP/1.1 Handler")))
(response:set-status 200)
(response:set-header "Content-Type" "text/plain")
(response:write "OK"))
(local vega-config
{:port (port)
:protocol (http1 {:handler handler})})
(vega.tcp vega-config)
(local vega (require "vega"))
(local http1 (require "vega-http1"))
(local vega-tls (require "vega-tls"))
(λ port []
(let [default 4570 cli (. arg 1)]
(if cli cli default)))
(local tls-config {:cafile "ca.pem"
:certificate "certificate.pem"
:key "key.pem"
:alpn ["http/1.1"]})
(fn handler [header ?body response meta]
(meta.log:info (.. "Log from" (meta.log.color:light-green " HTTP/1.1 Handler")))
(response:set-status 200)
(response:set-header "Content-Type" "text/plain")
(response:write "OK"))
(local vega-config
{:port (port)
:middleware/acceptor (vega-tls tls-config)
:protocol (http1 {:handler handler})})
(vega.tcp vega-config)
(local vega (require "vega"))
(local http1 (require "vega-http1"))
(local http2 (require "vega-http2"))
(λ port []
(let [default 4570 cli (. arg 1)]
(if cli cli default)))
(fn http1-handler [header ?body response meta]
(meta.log:info (.. "Log from" (meta.log.color:light-green " HTTP/1.1 Handler")))
(response:set-status 101)
(response:set-header "Connection" "Upgrade")
(response:set-header "Upgrade" "h2c"))
(fn http2-handler [header ?body response meta]
(meta.log:info (.. "Log from" (meta.log.color:light-green " HTTP/2 Handler")))
(response:set-status 200)
(response:set-header :content-type :text/plain)
(response:write "OK"))
(local vega-config
{:port (port)
:protocols [(http1 {:handler http1-handler})
(http2 {:handler http2-handler})]})
(vega.tcp vega-config)
(local vega (require "vega"))
(local http2 (require "vega-http2"))
(local vega-tls (require "vega-tls"))
(λ port []
(let [default 4570 cli (. arg 1)]
(if cli cli default)))
(local tls-config {:cafile "ca.pem"
:certificate "certificate.pem"
:key "key.pem"
:alpn ["h2"]})
(fn handler [header ?body response meta]
(meta.log:info (.. "Log from" (meta.log.color:light-green " HTTP/2 Handler")))
(response:set-status 200)
(response:set-header :content-type :text/plain)
(response:write "OK"))
(local vega-config
{:port (port)
:middleware/acceptor (vega-tls tls-config)
:protocol (http2 {:handler handler})})
(vega.tcp vega-config)
(λ handler [header ?body response meta]
(let [headers (. header :headers)
method (. headers ":method")
path (. headers ":path")]
(match path
"/headers" (handler-headers header ?body response meta)
"/data" (handler-data header ?body response meta)
"/empty" (handler-empty header ?body response meta)
_ (handler-default header ?body response meta))))
(local vega (require "vega"))
(λ port []
(let [default 3000 cli (. arg 1)]
(if cli cli default))
(λ tcp-acceptor [client meta]
; Set client connection configs...
; Get client information (IP and Port)...
; Apply middlewares (e.g. TLS middleware)..
(meta.config.receiver client meta))
(λ tcp-receiver [client meta]
(let [alpn meta.info.client.alpn
first-protocol (. meta.config.protocols 1)
line (client:receive "*l")]
(if (first-protocol.dispatcher line alpn meta)
(first-protocol.controller line client first-protocol.config meta))))
(λ telnet-dispatcher [] true)
(λ telnet-controller [content client protocol-config meta]
(let [writer
{:buffer "" :write (λ [instance data] (set instance.buffer (.. instance.buffer data)))}]
(protocol-config.handler content writer meta)
(client:send writer.buffer)
(client:close)
(meta.log:info (meta.log.color:light-red "Connection closed"))))
(λ telnet-handler [content response meta]
(meta.log:info (.. "Log from" (meta.log.color:light-green " Telnet Handler")))
(response:write (.. "\nHello " (tostring content) "!\n\n")))
(local telnet-protocol
{:identifier "Telnet"
:dispatcher telnet-dispatcher
:controller telnet-controller
:handler telnet-handler})
(local vega-config
{:port (port)
:acceptor tcp-acceptor
:receiver tcp-receiver
:protocol telnet-protocol})
(vega.tcp vega-config)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment