Shared library that exposes Go's
net/http.Server with externally-bindable
This is a silly project for experimenting with Go buildmodes. I gave a talk about this at PyCon 2016.
Status: Tiny subset of the
http.HandlerFunc callback gets passed to a C
handler callback. Python bindings are working, too.
git clone https://github.com/shazow/gohttplib/ cd gohttplib make examples
C example can be linked against a shared object (
libgohttp.so generated by
go build -buildmode=c-shared) or against a static library archive
libgohttp.a generated by
go build -buildmode=c-archive). By default, we
link against the shared object because that's what the Python example uses too.
Linked against our shared object:
make example-c DYLD_LIBRARY_PATH=build/ ./build/gohttp-c
Note that you'll need to make sure that
libgohttp.so is findable at runtime.
Now you can request
http://localhost:8000/hello and the C handler in
examples/c/main.c will handle it!
Linked against our static library archive:
$ make example-c-static $ ./build/gohttp-c-static
The static archive gets built into the binary so it's more portable during runtime. Note the size differences:
8.8K gohttp-c 5.1M gohttp-c-static 7.5M libgohttp.a 6.9M libgohttp.so
The Python example uses python-cffi (you'll need python-cffi installed) to link against the shared object.
make example-python cd examples/python python -m gohttp * Running on http://127.0.0.1:5000/
Or write your own handler using this library:
from gohttp import route, run def index(w, req): w.write("%s %s %s\n" % (req.method, req.host, req.url)) w.write("Hello, world.\n") run(host='127.0.0.1', port=5000)
This project was made possible thanks to Glider Labs.