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()