annotate lxmlmiddleware/middleware.py @ 2:bb7d50d54cb6

correct huge mistake in how i try to get the response
author k0s <k0scist@gmail.com>
date Sun, 24 Jan 2010 23:13:03 -0500
parents 2bf25337048f
children ca1f58f5bad4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
1 """
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
2 LXML middleware
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
3 """
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
4
1
2bf25337048f worth a real version
k0s <k0scist@gmail.com>
parents: 0
diff changeset
5 import lxml.html
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
6 from lxml import etree
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
7 from webob import Request, Response
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
8
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
9 class LXMLMiddleware(object):
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
10 """
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
11 abstract base class; inherit from and implement the manipulate method
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
12 """
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
13
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
14 def __init__(self, app):
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
15 self.app = app
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
16
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
17 ### methods dealing with HTTP
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
18 def __call__(self, environ, start_response):
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
19
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
20 # set up to recompose on the way out
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
21 if not 'lxml.recomposer' in environ:
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
22 environ['lxml.recomposer'] = self
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
23
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
24 request = Request(environ)
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
25 # get the response
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
26 response = request.get_response(self.app)
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
27 response.decode_content()
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
28
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
29 # get the DOM, if not already made
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
30 # TODO: check response.content_type
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
31 if not 'lxml.etree' in environ:
1
2bf25337048f worth a real version
k0s <k0scist@gmail.com>
parents: 0
diff changeset
32 try:
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
33 environ['lxml.etree'] = etree.fromstring(response.body)
1
2bf25337048f worth a real version
k0s <k0scist@gmail.com>
parents: 0
diff changeset
34 except etree.XMLSyntaxError: # not XML
2bf25337048f worth a real version
k0s <k0scist@gmail.com>
parents: 0
diff changeset
35 environ.pop('lxml.recomposer')
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
36 return response(environ, start_response)
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
37
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
38 # manipulate the DOM
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
39 environ['lxml.etree'] = self.manipulate(environ, environ['lxml.etree'])
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
40
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
41 # recompose the DOM if the last in the chain
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
42 if environ['lxml.recomposer'] is self:
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
43 response.body = lxml.html.tostring(environ['lxml.etree'])
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
44
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
45 # return the response
2
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
46 return response(environ, start_response)
bb7d50d54cb6 correct huge mistake in how i try to get the response
k0s <k0scist@gmail.com>
parents: 1
diff changeset
47
0
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
48
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
49 def manipulate(self, environ, tree):
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
50 """manipulate the DOM; should return an etree._Element"""
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
51 return tree
d1067d921e97 initial import of lxml middleware
k0s <k0scist@gmail.com>
parents:
diff changeset
52