public
Description: Kup is a URL redirection service meant to be hosted on Google App Engine.
Homepage: http://www.kup.in
Clone URL: git://github.com/gvishnu/kup.git
Search Repo:
kup / kup.py
100644 115 lines (96 sloc) 2.744 kb
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import cgi
import os
import wsgiref.handlers
from urlparse import urlparse
 
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext import db
 
class Kupify:
  def next(self, previous_pattern):
    if(previous_pattern == ''):
      return 'a'
    if(previous_pattern == 'z'):
      return 'aa'      
    if(previous_pattern.endswith("z")):
      return self.next(previous_pattern[0:-1]) + 'a'
    else:
      return previous_pattern[0:-1] + chr(ord(previous_pattern[-1]) + 1)
 
class URL(db.Model):
  url = db.StringProperty()
  url_id = db.IntegerProperty()
  pattern = db.StringProperty()
 
  def check_already_existing(self, url):
    u = False
    try:
      u = db.GqlQuery("SELECT * from URL WHERE url = :1", url)
      u = u[0]
      return u
    except (IndexError, AttributeError):
      return False
    
  def find_last_url(self):
    u = False
    try:
      u = db.GqlQuery("SELECT * from URL ORDER BY url_id DESC LIMIT 1")[0]
      return u
    except IndexError:
      return False
  
  def url_for_pattern(self, pattern):
    u = False
    try:
      u = db.GqlQuery("SELECT * from URL WHERE pattern = :1 LIMIT 1", pattern)[0]
      return u
    except IndexError:
      return False
 
class Index(webapp.RequestHandler):
  def get(self):
    template = file(os.path.join(os.path.dirname(__file__), 'index.html'))
    template = template.read()
    self.response.content_type = "text/html; charset=utf8"
    self.response.out.write(template)
 
class Redirect(webapp.RequestHandler):
  def get(self):
    pattern = self.request.environ['PATH_INFO'][1:].strip()
    
    u = URL()
    url = u.url_for_pattern(pattern)
    if(url):
      self.redirect(url.url)
    else:
      self.response.out.write("Can't find a URL to redirect!")
 
class Kup(webapp.RequestHandler):
  def post(self):
    u = URL()
    k = Kupify()
    
    next_url = self.request.get('url')
    
    #only if http or https
    scheme = urlparse(next_url)[0]
    if(not (scheme == 'http' or scheme == 'https')):
      self.response.out.write('ERROR')
      return
    
    #if already existing, return that record.
    b = u.check_already_existing(next_url)
    if(b):
      self.response.out.write('http://r.kup.in/' + b.pattern)
      return
      
    last_url = u.find_last_url()
    last_url_pattern = ''
    last_url_id = 0
    try:
      last_url_pattern = last_url.pattern
      last_url_id = last_url.url_id
    except AttributeError:
      pass
      
    next_url_pattern = k.next(last_url_pattern)
    
    u.url = self.request.get('url')
    u.url_id = last_url_id + 1
    u.pattern = next_url_pattern
    u.put()
        
    self.response.out.write('http://r.kup.in/' + next_url_pattern)
 
def main():
  application = webapp.WSGIApplication(
    [('/', Index),
    ('/_', Kup),
    ('/.*', Redirect)],
    debug=True)
  wsgiref.handlers.CGIHandler().run(application)
 
if __name__ == "__main__":
  main()