@@ -11,7 +11,6 @@ import six
1111from functools import wraps
1212from jsonschema import Draft4Validator
1313
14- from . import before_request, after_request
1514from .schemas import validators, scopes, normalize, filters
1615
1716
@@ -70,86 +69,86 @@ class ValidatorAdaptor(object):
7069 return normalize(self.validator.schema, value)[0], errors
7170
7271def request_validate(obj):
73- request = obj.request
74- endpoint = obj.endpoint
75- user_info = obj.current_user
76- if (endpoint, request.method) in scopes and not set(
77- scopes[( endpoint, request.method)]
78- ).issubset(set( user_info.scopes)):
79- raise tornado.web.HTTPError(403)
80-
81- method = request.method
82- if method == 'HEAD':
83- method = 'GET'
84- locations = validators.get((endpoint, method), { } )
85- for location, schema in six.iteritems(locations) :
86- if location == 'json':
87- value = getattr(request, 'body', MultiDict() )
88- elif location == 'args' :
89- value = getattr(request, 'query_arguments', MultiDict())
90- for k,v in value.iteritems():
91- if isinstance(v, list) and len(v) == 1 :
92- value[k] = v[0]
93- value = MultiDict (value)
94- else :
95- value = getattr(request, location, MultiDict())
96- validator = ValidatorAdaptor(schema )
97- result, reasons = validator.validate(value)
98- if reasons:
99- raise tornado.web.HTTPError(422, message='Unprocessable Entity',
100- reason=json.dumps(reasons) )
101- setattr(obj, location, result)
102-
103-
104- def response_filter (obj, resp):
105- request = obj.request
106- endpoint = obj.endpoint
107- method = request.method
108- if method == 'HEAD':
109- method = 'GET'
110- headers = None
111- status = None
112- if isinstance(resp, tuple):
113- resp, status, headers = unpack(resp)
114- filter = filters.get((endpoint, method), None )
115- if filter:
116- if len(filter) == 1:
117- if six.PY3:
118- status = list(filter.keys())[0]
119- else:
120- status = filter.keys()[0]
121-
122- schemas = filter.get(status)
123- if not schemas:
124- # return resp, status, headers
125- raise tornado.web.HTTPError(
126- 500, message='`%d` is not a defined status code.' % status)
127-
128- resp, errors = normalize(schemas['schema'], resp)
129- if schemas['headers'] :
130- headers, header_errors = normalize(
131- { ' properties ' : schemas[ ' headers ' ] } , headers)
132- errors.extend(header_errors )
133- if errors :
134- raise tornado.web.HTTPError(
135- 500, message='Expectation Failed',
136- reason=json.dumps(errors) )
137- obj.set_status(status)
138- obj.set_headers(headers )
139- obj.write(json.dumps(resp))
140-
141-
142- def validate_filter(view):
143-
144- @wraps(view)
145- def wrapper(*args, **kwargs):
146- self = view.im_self
147- request_validate(self )
148- before_request(self )
149- resp = view(*args, **kwargs )
150- after_request(self)
151- response_filter(self, resp)
152- return wrapper
72+ def _request_validate(view):
73+ @wraps(view)
74+ def wrapper(*args, **kwargs):
75+ request = obj.request
76+ endpoint = obj.endpoint
77+ user_info = obj.current_user
78+ if (endpoint, request.method) in scopes and not set(
79+ scopes[(endpoint, request.method)]
80+ ).issubset(set(user_info.scopes)):
81+ raise tornado.web.HTTPError(403)
82+
83+ method = request.method
84+ if method == 'HEAD' :
85+ method = 'GET'
86+ locations = validators.get((endpoint, method), { } )
87+ for location, schema in six.iteritems(locations) :
88+ if location == 'json':
89+ value = getattr(request, 'body', MultiDict())
90+ elif location == 'args' :
91+ value = getattr(request, 'query_arguments', MultiDict())
92+ for k,v in six.iteritems (value):
93+ if isinstance(v, list) and len(v) == 1 :
94+ value[k] = v[0]
95+ value = MultiDict(value )
96+ else:
97+ value = getattr(request, location, MultiDict())
98+ validator = ValidatorAdaptor(schema)
99+ result, reasons = validator.validate(value )
100+ if reasons:
101+ raise tornado.web.HTTPError(422, message='Unprocessable Entity',
102+ reason=json.dumps(reasons))
103+ setattr (obj, location, result)
104+ return view(*args, **kwargs)
105+ return wrapper
106+ return _request_validate
107+
108+
109+ def response_filter(obj):
110+ def _response_filter(view):
111+ @wraps(view)
112+ def wrapper(*args, **kwargs):
113+ resp = view(*args, **kwargs )
114+ request = obj.request
115+ endpoint = obj.endpoint
116+ method = request.method
117+ if method == 'HEAD':
118+ method = 'GET'
119+ headers = None
120+ status = None
121+ if isinstance(resp, tuple):
122+ resp, status, headers = unpack(resp)
123+ filter = filters.get((endpoint, method), None)
124+ if filter:
125+ if len(filter) == 1:
126+ if six.PY3:
127+ status = list(filter.keys())[0]
128+ else :
129+ status = filter.keys()[0]
130+
131+ schemas = filter.get(status )
132+ if not schemas :
133+ # return resp, status, headers
134+ raise tornado.web.HTTPError(
135+ 500, message='`%d` is not a defined status code.' % status )
136+
137+ resp, errors = normalize(schemas['schema'], resp )
138+ if schemas['headers']:
139+ headers, header_errors = normalize(
140+ { ' properties ' : schemas[ ' headers ' ] } , headers)
141+ errors.extend(header_errors)
142+ if errors:
143+ raise tornado.web.HTTPError(
144+ 500, message='Expectation Failed',
145+ reason=json.dumps(errors))
146+ obj.set_status(status )
147+ obj.set_headers(headers )
148+ obj.write(json.dumps(resp) )
149+ return
150+ return wrapper
151+ return _response_filter
153152
154153
155154def unpack(value):
0 commit comments