Artemis | Blog | Portfolio | About & Contact

2018 / 01 / 29

A very simple and fast URL shortener

Yesterday, I came home and, before going to sleep and half-asleep, I decided to code something.

What ? I had no idea at the moment I did so.

So I wanted something dead-simple and minimalistic.

It serves only one purpose: shortening URLs.

For that reason, I have two routes: a POST route at which a user can create a new shortened URL, giving the target ; a GET route which, when passing the shortened code, will redirect the user to the target URL.

Database ? Why bother ?

We have a very simple identity: the file name is the shortened code, the file content is the target URL.

Which means that, when the user tries to retrieve a target (and be redirected), since he gives us the shortened code, we can simply check for file existence in the storage folder and either return a 301 response with the target URL (if it could be found) or a 404 not found (if we couldn't find any file with this code).

Said that, I want to be able to easily count requests and errors.

I used a simple logging format composed of two files, respectively request-date(Y-m-d).log for requests and error-date(Y-m-d).log for errors.

Every incoming request starts with <-- and every error is contained in one line.

That means that we can know the request count and the error count, by day, by simply doing a grep '<--' request-{date}.log | wc -l for requests and wc -l error-{date}.log for errors.

Finally, for the web UI, I decided to simply go with Skeleton, as there's practically nothing.

The shortening request is made in AJAX, giving a clean result but in case the user disables Js, the URL will still be shortened and the code returned, or the error shown, so we're also okay here !

The project is available here and I wrote a very simple CLI client to also learn about Rust in the meantime, its source-code is available here.