summaryrefslogtreecommitdiff
path: root/shortener.py
blob: 7709a28bfed8b1a728b65122ed985e6d9abb8733 (plain)
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
import bottle
import hashlib
import base64
import MySQLdb
import urlparse
import bottle_mysql
from bottle import request


app = bottle.default_app()
app.config.load_config('shortener.cfg')

bottle.install(bottle_mysql.Plugin(
    dbuser=app.config['database.user'],
    dbpass=app.config['database.password'],
    dbname=app.config['database.name']))


@bottle.route('/new')
def new_url(db):
    url = request.query.url
    token = base64.b64encode(hashlib.sha1(url).digest(), ['0', '1'])[:8]

    try:
        db.execute('INSERT INTO urls VALUES (%s, %s)', (token, url))
    except MySQLdb.IntegrityError:
        pass

    url = urlparse.urlunparse((request.urlparts[0], request.urlparts[1], token, '', '', ''))

    return url 


@bottle.route('/all')
def remote(db):
    db.execute('SELECT u.*, COUNT(s.token) AS hits FROM urls u LEFT JOIN url_access s ON s.token = u.token GROUP BY u.token')
    return dict(
        (i['token'], { 'url': i['url'], 'hits': i['hits'] })
        for i in db.fetchall()) 


@bottle.route('/<token>')
def visit_url(db, token):
    db.execute('SELECT * FROM urls WHERE token = %s', (token,))
    result = db.fetchone()

    if not result:
        bottle.abort(404, 'Not Found')
    else:
        db.execute('INSERT INTO url_access(token, ip) VALUES (%s, %s)',
            (result['token'], request.remote_addr))
        bottle.redirect(result['url'])