Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
92 lines (67 sloc) 2.57 KB

Birr - Simple URL shortening using WSGI

Birr, would be the sound of a URL redirection if one could hear it. :)

Requirements

Python 2.7 and a WSGI capable server will be needed to use Birr. But since it is a very simple code I would think it can be easily ported to another server.

Workings

Birr reads a configuration file, default name shorturls.cfg, and matches with the query path, if the query path is found Birr will reply with a 303 See Other and redirects the browser. If not found, a 404 Not Found with empty body is issued.

The configuration file is defined as:

# This is a comment and will be ignored

shortA redirectionForShortA
shortB shortC redirectionForShortBandC
shortD shortE shortF redirectionForShortDandEandF

Each word is a short url for the last word in the configuration file. This allows for multiple short urls to point to the same place. At least two words, a shortcut and a target, need to be defined for a shortcut to work. Comments, empty lines and lines with few than 2 words will be ignored.

Technical Details

Bellow is the expected requests and responses in terms of HTTP from Birr. The file passenger_wsgi.py handles the HTTP queries and redirection while parse_config.py does the configuration parsing. The configuration parsing is the equivalent of creating a dict in python where the keys point to the redirection value. Like so:

# For a config like:
shortA shortB redirection

# It will be the same as:
# shortcuts = { 'shortA': 'redirection', 'shortB': 'redirection' }

It is possible to test Birr using the command line and check its behavior:

python -c 'import passenger_wsgi as p; import sys; p.application({"PATH_INFO": "/test"}, lambda x, y: sys.stdout.write(x + str(y) + "\n" ))'
  • shortcut /shortA is found:
GET /shortA HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: testhost
User-Agent: HTTPie/1.0.3


HTTP/1.1 303 See Other
Connection: Keep-Alive
Date: Wed, 27 Nov 2019 17:10:18 GMT
Keep-Alive: timeout=2, max=100
Location: redirectionForShortA
Server: Apache
Status: 303 See Other
Transfer-Encoding: chunked
Upgrade: h2
  • shortcut /notexistent is not found:
GET /notexistent HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: testhost
User-Agent: HTTPie/1.0.3


HTTP/1.1 404 Not Found
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/plain
Date: Wed, 27 Nov 2019 17:12:51 GMT
Keep-Alive: timeout=2, max=100
Server: Apache
Status: 404 Not Found
Upgrade: h2
You can’t perform that action at this time.