-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgui.py
More file actions
123 lines (101 loc) · 3.05 KB
/
gui.py
File metadata and controls
123 lines (101 loc) · 3.05 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
116
117
118
119
120
121
122
123
from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor
from twisted.python.log import err
from twisted.internet import defer
from twisted.web.util import Redirect
from twisted.web.error import NoResource
import cgi
'''
Dispatches this/[somecode] to a
UrlRedirector with [somecode]
'''
class UrlDispatcher(Resource):
def __init__(self,mongostore):
Resource.__init__(self)
self.mongostore = mongostore
def getChild(self, name, request):
return UrlRedirecter(name,self.mongostore)
'''
Renders GET and redirects to the
url stored for its urlid in a UrlStore
redirects to a generic failure page if
not url was associated with that urlid
'''
class UrlRedirecter(Resource):
def __init__(self,urlid,store):
Resource.__init__(self)
self.urlid = urlid
self.store = store
def handleFailure(self,failure,call):
err(failure,"fail")
call.cancel()
def redirectToSavedUrl(self,request):
url = self.store.getUrlById(self.urlid)
if (url == None):
request.setResponseCode(404)
request.write("No link attached to that code")
else:
request.redirect(url)
request.finish()
def render_GET(self,request):
call = defer.succeed(self.redirectToSavedUrl(request))
request.notifyFinish().addErrback(self.handleFailure,call)
return NOT_DONE_YET
'''
Generic static resource that
displays its htmlcode upon request
'''
class StaticResource(Resource):
def __init__(self,htmlcode):
self.htmlcode = htmlcode
def render_GET(self,request):
return self.htmlcode
'''
The resource that will be posted to
from the form.html
'''
class FormResponder(Resource):
def __init__(self, urlstore):
self.urlstore = urlstore
def parse_request(self,request):
host = str(request.getHeader("host"))
url_to_save = request.args["long-url"][0]
if (host in url_to_save):
request.redirect("/failure?msg=Dont redirect to me please..")
else:
newid = self.urlstore.storeUrl(url_to_save)
request.redirect("/resultpage?urlid="+newid)
request.finish()
def handleFailure(self,request,call):
err(failure,"Failed to parse form post")
call.cancel()
def render_POST(self,request):
call = defer.succeed(self.parse_request(request))
request.notifyFinish().addErrback(self.handleFailure,call)
return NOT_DONE_YET
class ResultPage(Resource):
def __init__(self):
response_file = open("response.tmpl","r")
responsetemplate = response_file.read()
response_file.close()
self.template = responsetemplate
def render_GET(self,request):
urlid = cgi.escape(request.args["urlid"][0])
host = str(request.getHeader("host"))
result = self.template
if (not urlid == None):
result = result.replace("[URL]",urlid)
result = result.replace("[root]",host)
return result
class FailurePage(Resource):
def __init__(self):
tmpl_file = open("failure.tmpl","r")
self.failure = tmpl_file.read()
tmpl_file.close()
def render_GET(self,request):
message = cgi.escape(request.args["msg"][0])
result = self.failure
if (not message == None):
result = result.replace("[MSG]",message)
return result