2010-04-02 3 views
1

Je ne suis pas sûr si c'est un bug ou si je fais juste quelque chose de mal. Si je devais faire une connexion HTTP comme ceci:Python HTTPSConnection.close() ne semble pas fermer la connexion?

import httplib 

http_connection = httplib.HTTPConnection("192.168.192.196") 
http_connection.request("GET", "/") 
http_connection.sock.settimeout(20) 
response = http_connection.getresponse() 
data = response.read() 
http_connection.close() 

Puis, à une invite DOS, je fais ceci:

netstat -ano | find /i "192.168.192.196:80" | find /i "ESTABLISHED" 

je reçois rien.

Cependant, si je fais la même chose, mais le changement à un HTTPSConnection:

import httplib 

http_connection = httplib.HTTPSConnection("192.168.192.196") 
http_connection.request("GET", "/") 
http_connection.sock.settimeout(20) 
response = http_connection.getresponse() 
data = response.read() 
http_connection.close() 

faites ceci:

netstat -ano | find /i "192.168.192.196:443" | find /i "ESTABLISHED" 

Je verrai en fait que la connexion reste établie jusqu'à ce que je fait^Z hors du shell Python.

Cela se produit dans l'une des applications dont je suis responsable. Python n'est pas vraiment suspendu - il laisse simplement la connexion ouverte.

Est-ce que je fais quelque chose de mal ici? Ai-je besoin de code supplémentaire pour fermer la connexion HTTPS?

Ceci est Python 2.6.4, btw.

+1

Lorsque j'essaie cela (sur Windows XP en utilisant Python 2.6.4), je vois que la connexion va à CLOSE_WAIT et finit par disparaître. Votre serveur fait-il quelque chose de bizarre? –

+1

C'est bizarre. Si vous supprimez la connexion ('del http_connection') et exécutez le garbage collector, la connexion se ferme. Cela fonctionne également avec Python 3.1, peut-être parce que le comportement du GC a changé, peut-être pas ... – AndiDog

+0

Dave Bacher: Non, je ne pense pas que le serveur fasse quelque chose de bizarre. J'ai aussi essayé cela sur un serveur web HTTPS standard et ça fait la même chose. AndiDog: Exécuter gc.collect() semble effacer la connexion ... Je ne suis pas sûr de l'impact que cela aura. – Dave

Répondre

0

Il s'avère que si vous envoyez l'en-tête HTTP "Connection: close", ce n'est pas un problème - bien que je pense toujours que .close() devrait fermer la connexion comme pour HTTPConnection.

Questions connexes