2015-08-21 27 views
5

La mia domandainterrompere l'elaborazione richiesta in CherryPy e restituire 200 risposta da uno strumento

Sto cercando un modo per fermare richiesta di trasformazione in uno strumento senza sollevare un'eccezione. In altre parole: voglio interrompere la richiesta prima che arrivi al controller specificato e restituisca un codice di stato 2xx?

Sfondo

vogliamo che la nostra applicazione per supportare CORS e quindi la richiesta di verifica preliminare. L'idea era di scrivere uno strumento che agganci before_handler. Se viene effettuata una richiesta OPZIONI, restituire le intestazioni CORS pertinenti ed uscire.

Il problema è che non ho trovato un modo per interrompere il flusso di esecuzione. Ciò significa che l'URL originale viene elaborato, come sarebbe se richiesto normalmente. Il punto è: questo potrebbe portare a problemi di sicurezza, poiché la richiesta di verifica preliminare è sempre fatta. Questo è quello che ho finora:

class CORSTool(cherrypy.Tool): 
    def __init__(self): 
     cherrypy.Tool.__init__(self, 'before_handler', self.insert_cors_header, priority=40) 
     cherrypy.request.hooks.attach('before_handler', self.insert_cors_header, priority=40) 

    def _setup(self): 
     cherrypy.Tool._setup(self) 

    def insert_cors_header(self): 
     """ 
     Inserts the relevant CORS-Headers: 
     - Access-Control-Allow-Origin: <from-config> 
     - Access-Control-Allow-Methods: POST, GET, OPTIONS 
     - Access-Control-Max-Age: 86400 
     """ 
     if cherrypy.config.get('enable_cors') is True: 
      if cherrypy.request.method.upper() == "OPTIONS": 
       cherrypy.response.headers['Access-Control-Allow-Origin'] = cherrypy.config.get('cors_domains') 
       cherrypy.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
       cherrypy.response.headers['Access-Control-Max-Age'] = '86400' 

       # Stop execution 
       cherrypy.response.body = None 
       cherrypy.response.status = 200 
       cherrypy.response.finalize() 

       # And NOW stop doing anything else... 

Alternative probabilmente non funziona

So che c'è un plugin cherrypy-cors, ma dalla fonte non riesco a vedere come questo interrompe l'esecuzione.

So anche che CherryPy ha un MethodDispatcher, ma ciò significherebbe una completa riscrittura del nostro codice.

Ricerca in StackOverflow Ho trovato la risposta this, tuttavia non voglio "uccidere" l'esecuzione, voglio solo un modo per impedire che venga chiamato il gestore.

+0

vedere HandlerTool esempio in cherrypy [wiki] (http://tools.cherrypy.org/wiki/HandlerTool) – meuh

risposta

5

Basta avere il set di strumenti request.handler = Nessuno. Vedere Request.respond per il codice che implementa questa e the CachingTool per un esempio:

request = cherrypy.serving.request 
    if _caching.get(**kwargs): 
     request.handler = None