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