def dispatch(self): """Dispatches the requested method.""" request = self.request method_name = request.route.handler_method if not method_name: method_name = webapp2._normalize_handler_method(request.method) method = getattr(self, method_name, None) if method is None: # 405 Method Not Allowed. valid = ', '.join(webapp2._get_handler_methods(self)) self.abort(405, headers=[('Allow', valid)]) # The handler only receives *args if no named variables are set. # TODO: Warum? args, kwargs = request.route_args, request.route_kwargs if kwargs: args = () # bind session on dispatch (not in __init__) try: self.session = get_current_session() except AttributeError: # session handling not activated self.session = {} # pylint: disable=R0204 # init messages array based on session but avoid modifying session if not needed if self.session.get('_gaetk_messages', None): self.session['_gaetk_messages'] = self.session.get('_gaetk_messages', []) # Give authentication Hooks opportunity to do their thing self.authchecker(method, *args, **kwargs) try: response = method(*args, **kwargs) except Exception, e: return self.handle_exception(e, self.app.debug)
def dispatch(self): """Dispatches the requested method.""" request = self.request method_name = request.route.handler_method if not method_name: method_name = webapp2._normalize_handler_method(request.method) method = getattr(self, method_name, None) if method is None: # 405 Method Not Allowed. # The response MUST include an Allow header containing a # list of valid methods for the requested resource. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.6 valid = ', '.join(webapp2._get_handler_methods(self)) self.abort(405, headers=[('Allow', valid)]) # The handler only receives *args if no named variables are set. args, kwargs = request.route_args, request.route_kwargs if kwargs: args = () # bind session on dispatch (not in __init__) self.session = get_current_session() # init messages array based on session but avoid modifying session if not needed if self.session.get('_gaetk_messages', None): self.session['_gaetk_messages'] = self.session.get('_gaetk_messages', []) # Give authentication Hooks opportunity to do their thing self.authchecker(method, *args, **kwargs) # Execute the method. reply = method(*args, **kwargs) # find out which return convention was used - first set defaults ... content = reply statuscode = 200 cachingtime = self.default_cachingtime # ... then check if we got a 2-tuple reply ... if isinstance(reply, tuple) and len(reply) == 2: content, statuscode = reply # ... or a 3-tuple reply. if isinstance(reply, tuple) and len(reply) == 3: content, statuscode, cachingtime = reply # Finally begin sending the response response = self.serialize(content) if cachingtime: self.response.headers['Cache-Control'] = 'max-age=%d, public' % cachingtime # If we have gotten a `callback` parameter, we expect that this is a # [JSONP](http://en.wikipedia.org/wiki/JSONP#JSONP) cann and therefore add the padding if self.request.get('callback', None): response = "%s (%s)" % (self.request.get('callback', None), response) self.response.headers['Content-Type'] = 'text/javascript' else: self.response.headers['Content-Type'] = 'application/json' # Set status code and write JSON to output stream self.response.set_status(statuscode) self.response.out.write(response) self.response.out.write('\n')
def dispatch(self): """Dispatches the requested method fom the WSGI App. Meant for internal use by the stack. """ request = self.request method_name = request.route.handler_method if not method_name: method_name = webapp2._normalize_handler_method(request.method) method = getattr(self, method_name, None) if hasattr(self, '__class__'): sentry_client.tags_context({ 'handler': self.__class__.__name__, 'method': method_name }) if method is None: # 405 Method Not Allowed. valid = b', '.join(webapp2._get_handler_methods(self)) raise exc.HTTP405_HTTPMethodNotAllowed( 'Method not allowed in {}'.format(self.__class__.__name__), headers=[(b'Allow', valid)], ) # The handler only receives *args if no named variables are set. args, kwargs = request.route_args, request.route_kwargs if kwargs: args = () # bind session on dispatch (not in __init__) try: self.session = gaesessions.get_current_session() except AttributeError: # probably session middleware not loaded self.session = {} if str(self.session) != 'uninitialized session': sentry_client.note('storage', 'Session loaded', data=dict(session=self.session)) try: self._call_all_inherited('pre_authentication_hook', method_name, *args, **kwargs) self._call_all_inherited('authentication_preflight_hook', method_name, *args, **kwargs) self._call_all_inherited('authentication_hook', method_name, *args, **kwargs) self._call_all_inherited('authorisation_hook', method_name, *args, **kwargs) self._call_all_inherited('method_preperation_hook', method_name, *args, **kwargs) try: response = method(*args, **kwargs) except TypeError: # parameter missmatch is the error we see most often # so help to pin down where it happens klass = introspection.get_class_that_defined_method(method) methname = method.__name__ sourcepos = '{}:{}'.format( os.path.basename(method.__func__.__code__.co_filename), method.__func__.__code__.co_firstlineno, ) LOGGER.debug( 'method called: %s.%s(%r) from %s', klass.__name__, methname, (args, kwargs), sourcepos, ) LOGGER.debug('defined at: %s %s', klass, sourcepos) raise response = self.response_overwrite(response, method, *args, **kwargs) except exc.HTTPException as e: # for HTTP exceptions execute `finished_hooks` if e.code < 500: self._call_all_inherited('finished_hook', method_name, *args, **kwargs) return self.handle_exception(e, self.app.debug) except BaseException as e: return self.handle_exception(e, self.app.debug) if response and not getattr(self, '_gaetk2_allow_strange_responses', False): assert isinstance(response, webapp2.Response) self._set_cache_headers() self._call_all_inherited('finished_hook', method_name, *args, **kwargs) self.finished_overwrite(response, method, *args, **kwargs) return response
def options(self): """Be a good netizen citizen and return HTTP verbs allowed.""" valid = ', '.join(webapp2._get_handler_methods(self)) self.response.set_status(200) self.response.headers['Allow'] = valid return self.response.out