Created

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

Example of basic libevent http server in Racket using FFI

View racket-libevent-webserver-example.rkt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#lang racket
(require ffi/unsafe
ffi/unsafe/define)
 
(define-ffi-definer define-libevent (ffi-lib "libevent"))
 
; Event Base
(define evbase-ptr (_cpointer 'evbase))
(define-libevent event_base_new (_fun -> evbase-ptr))
(define-libevent event_base_dispatch (_fun evbase-ptr -> _void))
(define-libevent event_base_free (_fun evbase-ptr -> _void))
 
; evbuffer
(define evbuffer-ptr (_cpointer 'evbuffer))
(define-libevent evbuffer_new (_fun -> evbuffer-ptr))
(define-libevent evbuffer_add (_fun evbuffer-ptr _string _intptr -> _int))
(define-libevent evbuffer_free (_fun evbuffer-ptr -> _void))
 
; evhttp
(define evhttp-ptr (_cpointer 'evhttp))
(define-libevent evhttp_new (_fun evbase-ptr -> evhttp-ptr))
(define-libevent evhttp_bind_socket (_fun evhttp-ptr _string _ushort -> _int))
(define-libevent evhttp_free (_fun evhttp-ptr -> _void))
(define evkeyvalq-ptr (_cpointer 'evkeyvalq))
(define-libevent evhttp_add_header (_fun evkeyvalq-ptr _string _string -> _int))
 
; evhttp requests
(define evhttp-request-ptr (_cpointer 'evhttp_request))
(define-libevent evhttp_send_reply (_fun evhttp-request-ptr _int _string evbuffer-ptr -> _void))
(define-libevent evhttp_request_get_input_headers (_fun evhttp-request-ptr -> evkeyvalq-ptr))
(define-libevent evhttp_request_get_output_headers (_fun evhttp-request-ptr -> evkeyvalq-ptr))
(define _evhttp_callback (_fun evhttp-request-ptr _gcpointer -> _void))
(define-libevent evhttp_set_cb (_fun evhttp-ptr _string _evhttp_callback _pointer -> _int))
(define (http-handler request arg)
(void
(evhttp_add_header (evhttp_request_get_output_headers request) "Content-Type" "text/plain")
(let ([buffer (evbuffer_new)])
(evbuffer_add buffer "Hello" 5)
(evhttp_send_reply request 200 "OK" buffer)
(evbuffer_free buffer))))
 
(define (main)
(let ([base (event_base_new)])
(let ([httpd (evhttp_new base)])
(evhttp_bind_socket httpd "localhost" 8093)
(evhttp_set_cb httpd "/" http-handler #f)
(event_base_dispatch base)
(evhttp_free httpd)
(event_base_free base))))
 
(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.