thirdparty/google_appengine/lib/webob/docs/comment-example-code/example.py
changeset 109 620f9b141567
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/google_appengine/lib/webob/docs/comment-example-code/example.py	Tue Aug 26 21:49:54 2008 +0000
@@ -0,0 +1,150 @@
+import os
+import urllib
+import time
+import re
+from cPickle import load, dump
+from webob import Request, Response, html_escape
+from webob import exc
+    
+class Commenter(object):
+
+    def __init__(self, app, storage_dir):
+        self.app = app
+        self.storage_dir = storage_dir
+        if not os.path.exists(storage_dir):
+            os.makedirs(storage_dir)
+
+    def __call__(self, environ, start_response):
+        req = Request(environ)
+        if req.path_info_peek() == '.comments':
+            return self.process_comment(req)(environ, start_response)
+        # This is the base path of *this* middleware:
+        base_url = req.application_url
+        resp = req.get_response(self.app)
+        if resp.content_type != 'text/html' or resp.status_int != 200:
+            # Not an HTML response, we don't want to
+            # do anything to it
+            return resp(environ, start_response)
+        # Make sure the content isn't gzipped:
+        resp.decode_content()
+        comments = self.get_data(req.url)
+        body = resp.body
+        body = self.add_to_end(body, self.format_comments(comments))
+        body = self.add_to_end(body, self.submit_form(base_url, req))
+        resp.body = body
+        return resp(environ, start_response)
+
+    def get_data(self, url):
+        # Double-quoting makes the filename safe
+        filename = self.url_filename(url)
+        if not os.path.exists(filename):
+            return []
+        else:
+            f = open(filename, 'rb')
+            data = load(f)
+            f.close()
+            return data
+
+    def save_data(self, url, data):
+        filename = self.url_filename(url)
+        f = open(filename, 'wb')
+        dump(data, f)
+        f.close()
+
+    def url_filename(self, url):
+        return os.path.join(self.storage_dir, urllib.quote(url, ''))
+
+    _end_body_re = re.compile(r'</body.*?>', re.I|re.S)
+
+    def add_to_end(self, html, extra_html):
+        """
+        Adds extra_html to the end of the html page (before </body>)
+        """
+        match = self._end_body_re.search(html)
+        if not match:
+            return html + extra_html
+        else:
+            return html[:match.start()] + extra_html + html[match.start():]
+
+    def format_comments(self, comments):
+        if not comments:
+            return ''
+        text = []
+        text.append('<hr>')
+        text.append('<h2><a name="comment-area"></a>Comments (%s):</h2>' % len(comments))
+        for comment in comments:
+            text.append('<h3><a href="%s">%s</a> at %s:</h3>' % (
+                html_escape(comment['homepage']), html_escape(comment['name']),
+                time.strftime('%c', comment['time'])))
+            # Susceptible to XSS attacks!:
+            text.append(comment['comments'])
+        return ''.join(text)
+
+    def submit_form(self, base_path, req):
+        return '''<h2>Leave a comment:</h2>
+        <form action="%s/.comments" method="POST">
+         <input type="hidden" name="url" value="%s">
+         <table width="100%%">
+          <tr><td>Name:</td>
+              <td><input type="text" name="name" style="width: 100%%"></td></tr>
+          <tr><td>URL:</td>
+              <td><input type="text" name="homepage" style="width: 100%%"></td></tr>
+         </table>
+         Comments:<br>
+         <textarea name="comments" rows=10 style="width: 100%%"></textarea><br>
+         <input type="submit" value="Submit comment">
+        </form>
+        ''' % (base_path, html_escape(req.url))
+
+    def process_comment(self, req):
+        try:
+            url = req.params['url']
+            name = req.params['name']
+            homepage = req.params['homepage']
+            comments = req.params['comments']
+        except KeyError, e:
+            resp = exc.HTTPBadRequest('Missing parameter: %s' % e)
+            return resp
+        data = self.get_data(url)
+        data.append(dict(
+            name=name,
+            homepage=homepage,
+            comments=comments,
+            time=time.gmtime()))
+        self.save_data(url, data)
+        resp = exc.HTTPSeeOther(location=url+'#comment-area')
+        return resp
+
+if __name__ == '__main__':
+    import optparse
+    parser = optparse.OptionParser(
+        usage='%prog --port=PORT BASE_DIRECTORY'
+        )
+    parser.add_option(
+        '-p', '--port',
+        default='8080',
+        dest='port',
+        type='int',
+        help='Port to serve on (default 8080)')
+    parser.add_option(
+        '--comment-data',
+        default='./comments',
+        dest='comment_data',
+        help='Place to put comment data into (default ./comments/)')
+    options, args = parser.parse_args()
+    if not args:
+        parser.error('You must give a BASE_DIRECTORY')
+    base_dir = args[0]
+    from paste.urlparser import StaticURLParser
+    app = StaticURLParser(base_dir)
+    app = Commenter(app, options.comment_data)
+    from wsgiref.simple_server import make_server
+    httpd = make_server('localhost', options.port, app)
+    print 'Serving on http://localhost:%s' % options.port
+    try:
+        httpd.serve_forever()
+    except KeyboardInterrupt:
+        print '^C'
+
+    
+