2010-12-10 38 views
2

L'ajout d'un middleware qui modifie uniquement les en-têtes HTTP (comme FirePython) est assez simple, mais lorsque vous appelez webapp.WSGIApplication (environ, start_response), il renvoie [ « »] au lieu d'un itérables avec le corps:Comment ajouter à AppEngine un middleware WSGI qui modifie le corps de la réponse

def __call__(self, environ, start_response): 
    ... 
    response.wsgi_write(start_response) 
    return [''] 

response.wsgi_write est en fait le responsable de l'impression du corps:

def wsgi_write(self, start_response): 
    ... 
    write = start_response('%d %s' % self.__status, self.__wsgi_headers) 
    write(body) 
    self.out.close() 

Cela rend difficile de modifier le corps par un middleware WSGI. En général, je voudrais juste faire:

class Upperware: 
    def __init__(self, app): 
     self.wrapped_app = app 

def __call__(self, environ, start_response): 
    for data in self.wrapped_app(environ, start_response): 
     return data.upper() 

Mais cela ne fonctionne pas, comme la valeur de retour de wrapped_app est [ « »]. Comment puis-je faire fonctionner le middleware d'Upperware dans Google App Engine? Quelle est la décision de conception qui a conduit à écrire la réponse au lieu de la renvoyer?

Répondre

3

Si vous voulez intercepter les écritures sur le corps de la demande, vous devez définir vos propres start_response et write fonctions, comme ceci:

class Upperware(object): 
    def __init__(self, app): 
    self.wrapped_app = app 

    def __call__(self, environ, start_response): 
    def my_start_response(status, response_headers, exc_info=None): 
     write = start_response(status, response_headers, exc_info) 
     def my_write(body_data): 
     # Do your middleware handling of writes here 
     body_data = body_data.upper() 
     write(body_data) 
     return my_write 
    return self.wrapped_app(environ, my_start_response) 

Quant à savoir pourquoi webapp a été écrit de cette façon, je suis j'ai peur, je ne peux pas dire. Il devrait être possible de changer son comportement pour donner un itérateur ou une liste à la place, sans rien casser, alors n'hésitez pas à file a bug.

+0

Merci pour la réponse. WRT le rapport de bug, fait http://code.google.com/p/googleappengine/issues/detail?id=4244 –