0001import simplejson
0002import cgi
0003
0004class JSONFilter(object):
0005 def __init__(self, app, mime_type='text/x-json'):
0006 self.app = app
0007 self.mime_type = mime_type
0008
0009 def __call__(self, environ, start_response):
0010
0011 response = {'status': '200 OK', 'headers': []}
0012 def json_start_response(status, headers):
0013 response['status'] = status
0014 response['headers'].extend(headers)
0015 environ['jsonfilter.mime_type'] = self.mime_type
0016 if environ.get('REQUEST_METHOD', '') == 'POST':
0017 if environ.get('CONTENT_TYPE', '') == self.mime_type:
0018 args = [_ for _ in [environ.get('CONTENT_LENGTH')] if _]
0019 data = environ['wsgi.input'].read(*map(int, args))
0020 environ['jsonfilter.json'] = simplejson.loads(data)
0021 res = simplejson.dumps(self.app(environ, json_start_response))
0022 jsonp = cgi.parse_qs(environ.get('QUERY_STRING', '')).get('jsonp')
0023 if jsonp:
0024 content_type = 'text/javascript'
0025 res = ''.join(jsonp + ['(', res, ')'])
0026 elif 'Opera' in environ.get('HTTP_USER_AGENT', ''):
0027
0028 content_type = 'text/plain'
0029 else:
0030 content_type = self.mime_type
0031 headers = [
0032 ('Content-type', content_type),
0033 ('Content-length', len(res)),
0034 ]
0035 headers.extend(response['headers'])
0036 start_response(response['status'], headers)
0037 return [res]
0038
0039def factory(app, global_conf, **kw):
0040 return JSONFilter(app, **kw)