Questo è un documento che deve essere necessariamente presente, ma l'implementazione del protocollo wire è implementata in un single object, quindi non dovrebbe essere troppo difficile da trovare da lì. Lo message spec doc collegato include il contenuto a livello di applicazione di ciascun campo, ma non il modo in cui viene serializzato su zeromq. Supponendo di avere un messaggio, come descritto in quel documento, il formato del filo è piuttosto semplice. Si tratta di un messaggio concatenato zeromq di almeno sei parti:
- Le parti principali del messaggio sono i zeromq identità di routing (zero-a-molti)
- Questi sono seguiti da un messaggio delimitatore, con il byte
<IDS|MSG>
- il HMAC
digest
del messaggio (una stringa vuota ''
se l'autenticazione è disabilitata)
header
parent_header
metadata
content
header
, parent_header
, metadata
e content
sono tutti descritti nel documento di messaggistica - questi sono dizionari e serializzato di byte con tutto ciò che la serializzazione è attualmente utilizzata. L'impostazione predefinita in IPython è JSON con codifica utf8, ma la serializzazione arbitraria è consentita (msgpack è il più comune non predefinito). Non ancora descritto nei documenti è il digest
, utilizzato per l'autenticazione. Questo è un MD5 HMAC Digest del messaggio. La chiave per il digest si trova nel campo key
del file di connessione. Il "messaggio" utilizzato dal digest HMAC è la concatenazione dei byte dell'intestazione serializzata, parent_header, metadati e contenuto, nello stesso ordine inviato sul filo.
È possibile disattivare il messaggio firma specificando il valore di configurazione
Session.key = ''
alle parti IPython relative del codice, nel qual caso il campo digest sarà sempre una stringa vuota ''
. Ti consiglio di farlo mentre inizi, in modo che tu possa prima capire le parti più interessanti dell'implementazione.
Ecco una richiesta di esecuzione di esempio e la sua risposta effettivamente inviata da IPython.
La richiesta:
[
<IDS|MSG>
6ea6b213262402cc1ad3c1d3e342a9f6
{"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"}
{}
{}
{"user_variables":[],"code":"1\n","silent":false,"allow_stdin":true,"store_history":true,"user_expressions":{}}
]
e la sua risposta:
[
5b03b89a-93c9-4113-bb85-17ba57233711
<IDS|MSG>
47d1052f6e8f333d18480938ca91719b
{"date":"2013-04-27T23:22:13.528239","username":"kernel","session":"d7eb303b-d2d0-4723-aef2-738545a8da11","msg_id":"9ed1d332-398c-4132-b203-1e7bf8fed712","msg_type":"execute_reply"}
{"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"}
{"dependencies_met":true,"engine":"645fb29f-37ab-40c9-bc01-b7fbfe3c2112","status":"ok","started":"2013-04-27T23:22:13.524114"}
{"status":"ok","execution_count":2,"user_variables":{},"payload":[],"user_expressions":{}}
]
C'è un post sul blog, che si collega a questa domanda, che descrive come implementare una http kernel ipython: // StackOverflow. it/questions/16240747/sending-messages-from-other-languages-to-an-ipython-kernel – dirceusemighini
http://andrew.gibiansky.com/blog/ipython/ipython-kernels/ è ciò di cui parla @dirceusemighini. –