25
|
1 #!/usr/bin/env python
|
|
2
|
|
3 """
|
|
4 web handler for MPL licenser
|
|
5 """
|
|
6
|
|
7 import licenses
|
26
|
8 import tempfile
|
28
|
9 import urllib2
|
|
10 import urlparse
|
27
|
11 from StringIO import StringIO
|
25
|
12 from webob import Request, Response, exc
|
|
13
|
|
14 class Handler(object):
|
|
15
|
27
|
16 required = set(['author', 'email', 'url'])
|
25
|
17
|
|
18 template = """<html>
|
|
19 <head><title>MPL licenser</title></head>
|
|
20 <body>
|
|
21 <h1>MPL Licenser</h1>
|
|
22 <div><i>license your files with MPL. Currently works for files of type: %(filetypes)s</i></div>
|
|
23 <div><form method="POST" enctype="multipart/form-data">
|
|
24 <p>Enter a file: <input type="file" name="file"/></p>
|
|
25 <p>or a URL: <input type="text" name="url" value="%(url)s"/></p>
|
27
|
26 <p>And enter your name: <input type="text" name="author" value="%(author)s"/></p>
|
25
|
27 <p>and email: <input type="text" name="email" value="%(email)s"/></p>
|
|
28 <input type="submit"/>
|
28
|
29 <p>
|
|
30 You can use this with curl on a local file if you have <tt>tempfile</tt> (<tt>/bin/tempfile</tt>):
|
|
31 </p>
|
|
32 <pre>
|
|
33 export TEMPFILE=$(tempfile) && curl -F "file=@foo.py" 'http://localhost:8080/?author=Jeff+Hammel&email=jhammel@example.com' > ${TEMPFILE} && mv ${TEMPFILE} foo.py
|
|
34 </pre>
|
25
|
35 </body>
|
|
36 </html>"""
|
|
37
|
|
38 def __init__(self, **kw):
|
27
|
39 self.license = licenses.MPL()
|
25
|
40 self.methods = {'GET': self.GET,
|
|
41 'POST': self.POST}
|
|
42
|
|
43 def __call__(self, environ, start_response):
|
|
44 request = Request(environ)
|
|
45 if request.method in self.methods:
|
|
46 response = self.methods[request.method](request)
|
|
47 else:
|
|
48 response = exc.HTTPMethodNotAllowed()
|
|
49 return response(environ, start_response)
|
|
50
|
|
51 def GET(self, request):
|
|
52 variables = {}
|
|
53 for i in self.required:
|
|
54 if i in request.GET:
|
|
55 variables[i] = request.GET[i]
|
|
56 if set(variables.keys()) == self.required:
|
|
57 try:
|
28
|
58 filename, body = self.fetch(request.GET['url'])
|
|
59 author = request.GET['author']
|
|
60 email = request.GET['email']
|
|
61 retval = self.interpolate(filename, body, author, email)
|
|
62 return Response(content_type='text/plain', body=retval)
|
25
|
63 except:
|
|
64 pass
|
|
65 return self.render(**variables)
|
|
66
|
|
67 def render(self, **variables):
|
|
68 for i in self.required:
|
|
69 if i not in variables:
|
|
70 variables[i] = ''
|
|
71 variables['filetypes'] = licenses.filetypes_string()
|
|
72 return Response(content_type='text/html', body=(self.template % variables))
|
|
73
|
28
|
74 def fetch(self, url):
|
|
75 """fetch a url. returns body, filename"""
|
|
76 parsed = urlparse.urlsplit(url)
|
|
77 path = parsed[2].rstrip('/')
|
|
78 body = urllib2.urlopen(url).read()
|
|
79 filename = path.split('/')[-1]
|
|
80 return filename, body
|
|
81
|
25
|
82 def POST(self, request):
|
27
|
83 variables = dict([(i, request.params[i])
|
|
84 for i in self.required
|
28
|
85 if i in request.params])
|
27
|
86 if 'file' in request.POST and hasattr(request.POST['file'], 'filename'):
|
|
87 body = request.POST['file'].file.getvalue()
|
|
88 filename = request.POST['file'].filename
|
28
|
89 elif 'url' in request.params:
|
27
|
90 try:
|
28
|
91 filename, body = self.fetch(request.params['url'])
|
27
|
92 except:
|
|
93 return self.render(**variables)
|
28
|
94 else:
|
|
95 return self.render(variables)
|
27
|
96 if not set(['author', 'email']).issubset(request.params):
|
|
97 return self.render(**variables)
|
|
98 author = request.params['author']
|
|
99 email = request.params['email']
|
|
100 retval = self.interpolate(filename, body, author, email)
|
|
101 return Response(content_type='text/plain', body=retval)
|
25
|
102
|
27
|
103 def interpolate(self, filename, body, author, email):
|
26
|
104
|
27
|
105 buffer = StringIO()
|
|
106 buffer.write(body)
|
|
107 value = buffer.getvalue().splitlines()
|
|
108 if self.license.has_license(buffer):
|
|
109 return body
|
|
110 filetype = self.license.filetype(filename)
|
|
111 if not filetype:
|
|
112 return body
|
|
113 variables = self.license.obtain_variables(author=author, email=email)
|
|
114 license = self.license.interpolate_license(**variables)
|
|
115 value = [i + '\r\n' for i in value]
|
|
116 filetype._lines = value
|
|
117 buffer = StringIO()
|
|
118 filetype.filename = buffer
|
|
119 filetype(license)
|
|
120 return buffer.getvalue()
|
26
|
121
|
25
|
122 if __name__ == '__main__':
|
|
123 from wsgiref import simple_server
|
|
124 app = Handler()
|
|
125 server = simple_server.make_server(host='0.0.0.0', port=8080, app=app)
|
|
126 server.serve_forever()
|
|
127
|