URL shortener, pastebin & file-sharing service, written from the ground up in C. https://r8r.be
 
 
 
 
 
Go to file
Jef Roosens dae8a2f30e
ci/woodpecker/push/build Pipeline was successful Details
feat(ltm): support custom data reader functions
2023-12-16 23:00:00 +01:00
.woodpecker
bench
include
landerctl feat(landerctl): add option to use custom config file 2023-12-09 10:37:10 +01:00
lnm feat(lnm): switch to epoll 2023-12-12 22:22:55 +01:00
lsm
ltm feat(ltm): support custom data reader functions 2023-12-16 23:00:00 +01:00
src feat(lnm): switch to epoll 2023-12-12 22:22:55 +01:00
test
.dockerignore
.editorconfig
.gitignore
ARCHITECTURE.md
CHANGELOG.md feat(lnm): switch to epoll 2023-12-12 22:22:55 +01:00
Dockerfile
Makefile
README.md
config.mk
docker-compose.yml

README.md

Lander

Lander is an HTTP/1.1 server that acts as a URL shortener, pastebin and file-sharing service. It's written from the ground up in C, complete with an HTTP framework built on top of an event loop implementation based on Build Your Own Redis with C/C++. Lookup of entries is done using an in-memory trie data structure, and on-disk storage uses a custom binary database format.

The codebase uses one thirdparty library, namely picohttpparser for parsing HTTP requests.

The idea

A URL shortener has always been on my list of things I'd like to write myself. It's simple, yet useful.

for our Algorithms & Datastructures 3 class, we had to implement three different tries (Patricia trie, ternary trie, and a custom one). Considering these are efficient string-based search trees, this gave me the idea to use it as the backend for a URL shortener!

The name

I gave up giving my projects original names a long time ago, so now I just use the names of my friends ;p

Benchmarking

I benchmark this tool using the wrk2 utility. I've provided two Lua scripts to aid with this. To bench publishing redirects, use the following:

wrk2 -s bench/post.lua -t 10 -R 10k -d30s -c32 http://localhost:18080

And to bench GET requests:

wrk2 -s bench/get.lua -t 10 -R 25k -d30s -c32 http://localhost:18080

Of course you're free to change the parameters, but the provided Lua files generate URLs that can be used in the benchmark.