Mercurial > mozilla > hg > licenser
view licenser/web.py @ 28:eb3749dbdbf5 default tip
finish web handler
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Fri, 25 Nov 2011 17:30:28 -0800 |
parents | 7e0c931a201d |
children |
line wrap: on
line source
#!/usr/bin/env python """ web handler for MPL licenser """ import licenses import tempfile import urllib2 import urlparse from StringIO import StringIO from webob import Request, Response, exc class Handler(object): required = set(['author', 'email', 'url']) template = """<html> <head><title>MPL licenser</title></head> <body> <h1>MPL Licenser</h1> <div><i>license your files with MPL. Currently works for files of type: %(filetypes)s</i></div> <div><form method="POST" enctype="multipart/form-data"> <p>Enter a file: <input type="file" name="file"/></p> <p>or a URL: <input type="text" name="url" value="%(url)s"/></p> <p>And enter your name: <input type="text" name="author" value="%(author)s"/></p> <p>and email: <input type="text" name="email" value="%(email)s"/></p> <input type="submit"/> <p> You can use this with curl on a local file if you have <tt>tempfile</tt> (<tt>/bin/tempfile</tt>): </p> <pre> export TEMPFILE=$(tempfile) && curl -F "file=@foo.py" 'http://localhost:8080/?author=Jeff+Hammel&email=jhammel@example.com' > ${TEMPFILE} && mv ${TEMPFILE} foo.py </pre> </body> </html>""" def __init__(self, **kw): self.license = licenses.MPL() self.methods = {'GET': self.GET, 'POST': self.POST} def __call__(self, environ, start_response): request = Request(environ) if request.method in self.methods: response = self.methods[request.method](request) else: response = exc.HTTPMethodNotAllowed() return response(environ, start_response) def GET(self, request): variables = {} for i in self.required: if i in request.GET: variables[i] = request.GET[i] if set(variables.keys()) == self.required: try: filename, body = self.fetch(request.GET['url']) author = request.GET['author'] email = request.GET['email'] retval = self.interpolate(filename, body, author, email) return Response(content_type='text/plain', body=retval) except: pass return self.render(**variables) def render(self, **variables): for i in self.required: if i not in variables: variables[i] = '' variables['filetypes'] = licenses.filetypes_string() return Response(content_type='text/html', body=(self.template % variables)) def fetch(self, url): """fetch a url. returns body, filename""" parsed = urlparse.urlsplit(url) path = parsed[2].rstrip('/') body = urllib2.urlopen(url).read() filename = path.split('/')[-1] return filename, body def POST(self, request): variables = dict([(i, request.params[i]) for i in self.required if i in request.params]) if 'file' in request.POST and hasattr(request.POST['file'], 'filename'): body = request.POST['file'].file.getvalue() filename = request.POST['file'].filename elif 'url' in request.params: try: filename, body = self.fetch(request.params['url']) except: return self.render(**variables) else: return self.render(variables) if not set(['author', 'email']).issubset(request.params): return self.render(**variables) author = request.params['author'] email = request.params['email'] retval = self.interpolate(filename, body, author, email) return Response(content_type='text/plain', body=retval) def interpolate(self, filename, body, author, email): buffer = StringIO() buffer.write(body) value = buffer.getvalue().splitlines() if self.license.has_license(buffer): return body filetype = self.license.filetype(filename) if not filetype: return body variables = self.license.obtain_variables(author=author, email=email) license = self.license.interpolate_license(**variables) value = [i + '\r\n' for i in value] filetype._lines = value buffer = StringIO() filetype.filename = buffer filetype(license) return buffer.getvalue() if __name__ == '__main__': from wsgiref import simple_server app = Handler() server = simple_server.make_server(host='0.0.0.0', port=8080, app=app) server.serve_forever()