2010-08-04 3 views
1

Je dirige ce code (à partir de: http://blog.somethingaboutcode.com/?p=155):Twisted Web Proxy

from twisted.internet import reactor 
from twisted.web import http 
from twisted.web.proxy import Proxy, ProxyRequest, ProxyClientFactory, ProxyClient 
from ImageFile import Parser 
from StringIO import StringIO 

class InterceptingProxyClient(ProxyClient): 
    def __init__(self, *args, **kwargs): 
     ProxyClient.__init__(self, *args, **kwargs) 
     self.image_parser = None 

    def handleHeader(self, key, value): 
     if key == "Content-Type" and value in ["image/jpeg", "image/gif", "image/png"]: 
      self.image_parser = Parser() 
     if key == "Content-Length" and self.image_parser: 
      pass 
     else: 
      ProxyClient.handleHeader(self, key, value) 

    def handleEndHeaders(self): 
     if self.image_parser: 
      pass #Need to calculate and send Content-Length first 
     else: 
      ProxyClient.handleEndHeaders(self) 

    def handleResponsePart(self, buffer): 
     print buffer 
     if self.image_parser: 
      self.image_parser.feed(buffer) 
     else: 
      ProxyClient.handleResponsePart(self, buffer) 

    def handleResponseEnd(self): 
     if self.image_parser: 
      image = self.image_parser.close() 
      try: 
       format = image.format 
       image = image.rotate(180) 
       s = StringIO() 
       image.save(s, format) 
       buffer = s.getvalue() 
      except: 
       buffer = "" 
      ProxyClient.handleHeader(self, "Content-Length", len(buffer)) 
      ProxyClient.handleEndHeaders(self) 
      ProxyClient.handleResponsePart(self, buffer) 
     ProxyClient.handleResponseEnd(self) 

class InterceptingProxyClientFactory(ProxyClientFactory): 
    protocol = InterceptingProxyClient 

class InterceptingProxyRequest(ProxyRequest): 
    protocols = {'http': InterceptingProxyClientFactory} 
    ports = {"http" : 80} 

class InterceptingProxy(Proxy): 
    requestFactory = InterceptingProxyRequest 

factory = http.HTTPFactory() 
factory.protocol = InterceptingProxy 

reactor.listenTCP(8000, factory) 
reactor.run() 

Chaque fois que je reçois cela et aller à 127.0.0.1:8000 je reçois ceci:

Traceback (most recent call last): 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\log.py", 
line 84, in callWithLogger 
    return callWithContext({"system": lp}, func, *args, **kw) 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\log.py", 
line 69, in callWithContext 
    return context.call({ILogContext: newCtx}, func, *args, **kw) 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\context.p 
y", line 59, in callWithContext 
    return self.currentContext().callWithContext(ctx, func, *args, **kw) 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\python\context.p 
y", line 37, in callWithContext 
    return func(*args,**kw) 
--- <exception caught here> --- 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\internet\selectr 
eactor.py", line 146, in _doReadOrWrite 
    why = getattr(selectable, method)() 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\internet\tcp.py" 
, line 460, in doRead 
    return self.protocol.dataReceived(data) 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\protocols\basic. 
py", line 251, in dataReceived 
    why = self.lineReceived(line) 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li 
ne 1573, in lineReceived 
    self.allContentReceived() 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li 
ne 1641, in allContentReceived 
    req.requestReceived(command, path, version) 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\http.py", li 
ne 807, in requestReceived 
    self.process() 
    File "C:\Program Files\Python 2.6.2\lib\site-packages\twisted\web\proxy.py", l 
ine 147, in process 
    port = self.ports[protocol] 
exceptions.KeyError: '' 

Chaque fois que je setup firefox ou chrome ou opera pour utiliser le proxy sur localhost: 8000 il n'y a pas de connexions faites au proxy (et je ne peux plus me connecter à une page, bien que ce soit probablement parce que ce n'est pas une connexion au proxy).


Ok il échoue encore et l'exploitation forestière je reçois cette sortie quand je mets Firefox pour utiliser le proxy à localhost: 8000 et ne visite pas le proxy directement à partir du navigateur Web (par exemple en tapant localhost: 8000 dans la barre d'adresse de firefox)

2010-08-04 12:31:18-0400 [-] Log opened. 
2010-08-04 12:31:29-0400 [-] twisted.web.http.HTTPFactory starting on 8000 
2010-08-04 12:31:29-0400 [-] Starting factory <twisted.web.http.HTTPFactory inst 
ance at 0x010B3EE0> 
2010-08-04 12:33:55-0400 [-] Received SIGINT, shutting down. 
2010-08-04 12:33:55-0400 [twisted.web.http.HTTPFactory] (Port 8000 Closed) 
2010-08-04 12:33:55-0400 [twisted.web.http.HTTPFactory] Stopping factory <twiste 
d.web.http.HTTPFactory instance at 0x010B3EE0> 
2010-08-04 12:33:55-0400 [-] Main loop terminated. 

Cependant, lorsque je visite directement le proxy, j'obtiens l'erreur de clé.

Aussi pour renifler je ne peux pas; Wireshark ne semble pas renifler le trafic localhost et si j'utilise fiddler 2 il se positionne comme proxy (et donc je n'utilise plus mon serveur proxy) et fonctionne (car il utilise le proxy de fiddler 2).

+0

Juste une suggestion dans le formatage: n'utilisez pas de balises [code]. Vous avez besoin de 4 espaces avant le texte pour que ce soit du code. Vous pouvez copier + coller ici, sélectionnez et appuyez sur le bouton avec le [1010101] au-dessus de la boîte. Il fera automatiquement les 4 espaces pour vous. – avacariu

Répondre

1

L'exception KeyError que vous voyez lorsque vous vous connectez directement est due au fait que les demandes à un proxy doivent inclure une URL absolue, pas une relative. Si votre navigateur ne sait pas qu'il parle à un proxy, il demandera une URL comme /foo/bar. S'il sait qu'il parle à un proxy, il demandera à la place quelque chose comme http://example.com/foo/bar. La partie http://example.com/ est importante car c'est la seule façon pour le proxy de savoir ce qu'il est censé faire et récupérer. En ce qui concerne les raisons pour lesquelles Firefox, Chrome ou Opera ne se connecte pas au proxy une fois que vous les avez configurés, cela est un peu plus difficile à expliquer. Assurez-vous que vous configurez un "proxy HTTP", et non les autres types de proxy pris en charge. Une fois que vous avez vérifié cela, vous pouvez utiliser un outil comme Wireshark pour mieux voir ce qui se passe sur la couche réseau.

Il est possible que les connexions soient réellement effectuées vers le proxy mais que quelque chose d'autre ne fonctionne pas qui les empêche de se terminer. Dans ce cas, sans que la journalisation ne soit activée, vous pourriez ne pas être en mesure de dire que le proxy reçoit des connexions simplement en regardant sa sortie. Pour activer la journalisation, essayez:

from sys import stdout 
from twisted.python.log import startLogging 
startLogging(stdout) 
+0

Corrigé, les paramètres du proxy étaient incorrects; Définissez l'adresse IP comme 192.x.x.x ou 10.x.x.x ou quoi que ce soit au lieu de 127.0.0.1 ou localhost – Zimm3r