Je cherche à écrire quelques requêtes de base sur le protocole SPDY . Le protocole définit les trames que vous envoyez comme étant composées de données binaires d'une longueur et d'un ordre d'octets très spécifiques.
Je n'ai jamais écrit que de petits programmes qui envoient des chaînes sur des sockets (HTTP). Comment puis-je implémenter un en-tête de cadre de contrôle SPDY par exemple? J'ai essayé d'utiliser la bibliothèque bitstring et numpy pour contrôler la taille de toutes les différentes sections d'un en-tête de cadre de contrôle par exemple, mais rien ne fonctionne vraiment. La bibliothèque SPDY actuelle pour python utilise les types de données cython et C et je l'ai trouvée très imprévisible. Je me demandais comment je peux créer des requêtes simples avec python ou très simplement comment puis-je construire quelque chose exactement comme le définit le protocole et l'envoyer sur un socket?
Généralement, la classe bytearray
sera votre ami (si je comprends bien votre question). Vous pouvez l'envoyer via socket:
my_bytes = bytearray()
my_bytes.append(123)
my_bytes.append(125)
// my_bytes is b'{}' now
s.send(my_bytes)
Suivez la spécification du protocole et créez octet après octet. Cela fonctionne également lorsque vous recevez des données:
data = s.recv(2048)
my_bytes = bytearray(data)
Je ne sais pas grand chose sur le protocole SPDY mais par exemple le bit de contrôle est le premier bit (pas d'octet) dans le message. Vous pouvez le récupérer à partir de my_bytes
via ET binaire par exemple:
control_frame = my_bytes[0] & 128
ceci est dû au fait 128
est 10000000
en binaire et donc binaire ET vous donnera uniquement le premier bit (rappelez-vous que chaque octet a 8 bits, c'est pourquoi nous avons 7 zéros).
Voilà comment les choses se font manuellement. Bien sûr, je suggère d'utiliser une bibliothèque, car l'écriture d'un gestionnaire de protocole approprié prendra beaucoup de temps, vous pouvez la trouver assez difficile et ce peut ne pas être efficace (en fonction de vos besoins, bien sûr).
Vous pouvez également utiliser le module struct pour définir le format d'en-tête avec une chaîne et l'analyser directement.
Pour générer un paquet:
fmt = 'B I 4b'
your_binary_data = pack(fmt, header_data)
sock.sendall(your_binary_data)
Où fmt indique le format d'en-tête ('B I 4b' est juste un, ne fonctionne clairement pas pour votre en-tête SPDY, exemple). Malheureusement, vous devrez traiter les champs d'en-tête non alloués, probablement en analysant de plus gros morceaux puis en les divisant selon votre format.
De plus, pour analyser l'en-tête:
unpacker = struct.Struct('B I 4b')
unpacked_data = unpacker.unpack(s.recv(unpacker.size))
unpacked_data contiendra un Tuple avec les données analysées.
Le module de struct effectue des conversions entre les valeurs Python et les structures C représentées par Python Je n'ai aucune garantie quant à l'efficacité de cette approche, mais cela m'a aidé à analyser différents protocoles simplement en ajustant la chaîne fmt .