2010-02-26 6 views
2

J'écris un proxy html basique dans python (3), et jusqu'à présent je n'utilise pas de classes prebuild comme http.server.Les données de socket Python renvoient l'objet <byte>. Comment le regexp?

Je viens juste de commencer une prise qui accepte la connexion:

self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
self.listen_socket.bind((socket.gethostname(), 4321)) 
self.listen_socket.listen(5) 
(a, b) = self.listen_socket.accept() 
content = a.recv(100000) 

maintenant contenu stocke les données comme:

b'GET http://www.google.com/firefox HTTP/1.1\r\nHost: www.google.com\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100207 Namoroka/3.6\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 115\r\nProxy-Connection: keep-alive\r\nCookie: PREF=ID=1ac935f4d893f655:U=73a4849dc5fc23a4:TM=1266851688:LM=1267023171:S=Log1PmXRMlNjX3Of; NID=32=EnrZjTqILuW2_aMLtgsJ96FdEMF3s5FoMJSVq9GMr9dhLhTAd3F5RcQ3ImyVBiO2eYNKKMhzlGg7r8zXmeSq50EigS5sdKtCL9BMHpgCxZazA2NiyB0bTRWhp8-0BObn\r\n\r\n' 

Comment puis-je regexp il? La conversion en chaîne ne fonctionne pas pour moi.

Ou, finalement, j'ai besoin de trouver l'adresse qui est demandé, comme http://www.google.com/firefox dans ce cas. Y a-t-il un analyseur que je ne connais pas? Comment puis-je atteindre le résultat?

Merci d'avance.

+0

pourquoi ne pas str (b) 'travailler pour vous? Quel est le message d'erreur? –

+0

Aucun message d'erreur, mais comme souligné par Scott Griffiths, il renvoie "b'GET http: // ..." "qui est inutile pour mon besoin. –

Répondre

3

Vous devez inclure un codage lors de la conversion d'une chaîne, par exemple l'utilisation:

>>> str(b'GET http://...', 'UTF-8') 
'GET http://...' 

Si vous n'utilisez un codage alors que vous avez découvert que vous obtenez quelque chose d'un peu moins utile:

>>> str(b'GET http://...') 
"b'GET http://...'" 
+0

Cela semble fonctionner. Puis-je supposer le codage par défaut 'UTF-8' pour les requêtes HTTP? –

+0

Je ne pense pas que vous pouvez supposer UTF-8, je pense qu'il peut indiquer d'autres charsets (je ne suis pas un expert HTTP si). –

+3

Selon la norme, tous les caractères non-ASCII dans un en-tête HTTP sont ISO-8859-1. En pratique, les navigateurs diffèrent. Firefox utilise l'octet bas de l'unité de code UTF-16, Opera et Chrome utilisent UTF-8, Safari rompt généralement, et IE utilisera la page de codes système par défaut de la machine sur laquelle il est installé (qui ne sera jamais UTF-8) . En résumé, les caractères non ASCII non codés dans les en-têtes sont totalement non fiables. Probablement que vous ne vous souciez pas, dans lequel pouvez-vous juste repenser à ISO-8859-1. – bobince

1

De même, vous pouvez vérifier les classes *HTTPServer. Ils fournissent un emballage autour des serveurs HTTP et analysent également les en-têtes pour vous.

Si vous ne pouvez pas, eh bien, à tout le moins, ils fourniront des exemples de code source sur la façon de le faire!

+0

Oui, je l'ai remarqué, et j'ai quelques plans pour l'utiliser à l'avenir, mais maintenant je n'en ai pas besoin. –