2010-05-28 7 views

Répondre

4

L'endroit le plus facile à utiliser est probablement makefile() pour obtenir une interface de type fichier plus simple à la socket.

import socket, base64 

host= 'www.example.com' 
path= '/' 
username= 'fred' 
password= 'bloggs' 
token= base64.encodestring('%s:%s' % (username, password)).strip() 

lines= [ 
    'GET %s HTTP/1.1' % path, 
    'Host: %s' % host, 
    'Authorization: Basic %s' % token, 
    'Connection: close', 
] 

s= socket.socket() 
s.connect((host, 80)) 
f= s.makefile('rwb', bufsize=0) 
f.write('\r\n'.join(lines)+'\r\n\r\n') 
response= f.read() 
f.close() 
s.close() 

Vous devez faire beaucoup plus de travail que si vous avez besoin d'interpréter la réponse retournée à choisir les en-têtes HTML ou requis auth, et de gérer les redirections, erreurs, codage de transfert et tout ce qui droite. HTTP peut être complexe! Êtes-vous sûr de devoir utiliser une socket de bas niveau?

2

Regarder par exemple à sources d'urllib, en particulier la fonction http_error_401 (et l'expédition autour bien sûr): faire la requête HTTP, regarder pour une réponse 401, extraire son royaume, vérifier que son régime est basic, essayez à nouveau avec l'utilisateur et mot de passe pour ce domaine (cfr fonction retry_http_basic_auth dans ce même fichier source). Beaucoup de travail bien sûr, mais c'est le prix de la programmation "jusqu'au métal nu" comme vous le souhaitez.