2010-10-04 24 views
3

J'utilise CherryPy pour un serveur Web, mais je voudrais qu'il traite les demandes HTTP/1.1 Upgrade. Ainsi, lorsqu'un client envoie:Gestion des demandes de mise à niveau HTTP/1.1 dans CherryPy

OPTIONS * HTTP/1.1 
Upgrade: NEW_PROTOCOL/1.0 
Connection: Upgrade 

Je voudrais que le serveur pour remettre la connexion à certains de gestionnaire NEW_PROTOCOL après avoir répondu à la HTTP/1.1 101 Switching Protocols... nécessaire, comme indiqué dans RFC 2817. Je suis assez nouveau à CherryPy, et n'a pas pu trouver quoi que ce soit dans la documentation sur la façon de gérer des demandes client spécifiques telles que ci-dessus. Si quelqu'un pouvait me diriger vers un tutoriel ou des parties de la documentation CherryPy ou même une solution, ce serait très utile.

Répondre

2

Ceci est assez facile à faire dans le coffre (qui sera finalement 3.2 finale). Je suis sûr que c'est possible dans les versions plus anciennes mais beaucoup plus alambiquées.

Tout ce que vous avez à faire est de créer une nouvelle sous-classe de wsgiserver.Gateway qui recherche les en-têtes en question et qui vous permet de passer la connexion ou de passer à la passerelle habituelle. Par exemple:

class UpgradeGateway(Gateway): 
    def respond(self): 
     h = self.req.inheaders 
     if h.get("Connection", "") == "Upgrade": 
      # Turn off auto-output of HTTP response headers 
      self.req.sent_headers = True 
      # Not sure exactly what you want to pass or how, here's a start... 
      return protocols[h['Upgrade']].handle(self.req.rfile, self.req.wfile) 
     else: 
      return old_gateway(self.req).respond() 

old_gateway = cherrypy.server.httpserver.gateway 
cherrypy.server.httpserver.gateway = UpgradeGateway 

Il peut y avoir quelques autres points fins, mais c'est la technique générale.

+0

Merci! J'utilise 3.1 et j'ai fini par sous-classer HTTPConnection et HTTPRequest pour le faire fonctionner. C'était plutôt moche, mais plutôt amusant ... Je vais refactoriser la technique ci-dessus quand 3.2 est prêt. – user464164