FCPv2 et ses API
De Freenet Doc.
Attention cet article est en cours de rédaction, par conséquent les informations que vous pouvez y trouver peuvent être erronées et/ou incomplètes.
Le protocole FCPv2 permet aux applications clientes de communiquer avec le noeud.
Résumé
Ce protocole est assez simple à implémenter dans une application, puisqu'il est basé sur des messages textes. Il permet de :
- Insérer des données dans Freenet;
- Récupérer des données depuis Freenet;
- Connaître le status actuel du noeud;
- Gérer les peers connectés au noeud.
Historique
Freenet 0.7 est la première version à supporter le protocole FCPv2, qui n'est pas rétro-compatible avec les anciennes versions, à cause de changements fondamentaux de la version 0.7 par rapport aux précédentes. Télécharger de gros fichiers avec l'ancienne version était complexe, et demandait pas mal de lignes de code, qui étaient dupliquées dans de nombreuses applications clientes. La philosophie de la version 2 est donc de donner la possibilité d'écrire des applications simples pour Freenet sans se préoccuper de ce qui se passe dans le noeud.
Transport
FCP fonctionne à travers un transport TCP, typiquement entre Freenet et une application tournant sur la même machine. Par défaut, Freenet écoute les connexions FCP sur le port 9481 (notez que les versions précédentes utilisaient le port 8481). Le protocol est basé sur du texte, l'encodage à utiliser étant l'UTF-8. Notez qu'il est aussi possible que le noeud et l'application utilisant FCP ne soient pas sur la même machine, et que le port par défaut aie été changé.
Schéma de base des messages
L'unité de base de FCP est un message, qui consiste en un nom de message, et 0 ou plusieurs pair de clés appelés champs. La casse utilisée pour les noms de messages et de champs est la CamelCase, utilisant des caractères alpha-numériques. Les messages peuvent être envoyé du client vers le serveur, ou du serveur vers le client. Plusieurs messages peuvent être envoyés dans la même direction les uns après les autres.
Exemple de message :
MessageName Field1=Value1 Field2=Value2 ... EndMessage
Liste des messages
Client -> Serveur
- ClientHello
- ListPeer
- ListPeers
- ListPeerNotes
- AddPeer
- ModifyPeer
- ModifyPeerNote
- RemovePeer
- GetNode
- GetConfig
- ModifyConfig
- TestDDARequest
- TestDDAResponse
- GenerateSSK
- ClientPut
- ClientPutDiskDir
- ClientPutComplexDir
- ClientGet
- GetPluginInfo
- FCPPluginMessage
- SuscribeUSK
- WatchGlobal
- GetRequestStatus
- ListPersistentRequests
- RemovePersistentRequest
- ModifyPersistentRequest
- Shutdown
Serveur -> client
- NodeHello
- CloseConnectionDuplicateClientName
- Peer
- PeerNote
- EndListPeers
- EndListPeerNotes
- PeerRemoved
- NodeData
- ConfigData (since 1027)
- TestDDAReply (since 1027)
- TestDDAComplete (since 1027)
- SSKKeypair
- PersistentGet
- PersistentPut
- PersistentPutDir
- URIGenerated
- PutSuccessful
- PutFetchable
- DataFound
- AllData
- StartedCompression
- FinishedCompression
- SimpleProgress
- EndListPersistentRequests
- PersistentRequestRemoved (since 1016)
- PersistentRequestModified (since 1016)
- PutFailed
- GetFailed
- ProtocolError
- IdentifierCollision
- UnknownNodeIdentifier
- UnknownPeerNoteType
- SuscribeUSKUpdate
- PluginInfo (since 1075)
- FCPPluginReply (since 1075)
Code des erreurs liées au protocole
- ClientHello doit être le premier message
- Les ClientHellos ne sont pas autorisés plus tard dans le protocole
- Message parse error
- URI parse error
- Champ manquant
- Error parsing number
- Message invalide
- Champ invalide
- Fichier introuvable
- Disk target exists
- Filename and temporary filename must be in the same directory
- Impossible de créer le fichier
- Impossible d'écrire le fichier
- Impossible de renommer le fichier
- No such identifier
- Not supported
- Erreur interne
- Shutting down
- No such node identifier (Unused since 995)
- URL parse error
- Reference parse error
- File parse error
- Pas un fichier
- Accès refusé
- Direct Disk Access denied
- Impossible de lire le fichier
- Reference signature failed to verify
- Node cannot peer with itself
- Node already has a peer with that ref
- Opennet is currently disabled by the node's configuration
- Operation is only available on a darknet peer
- No such plugin
Code des erreurs liées à la récupération de données
- Too many levels of archive recursion
- Unknown splitfile metadata
- Unknown metadata
- Invalid metadata
- Archive failure
- Block decode error
- Too many metadata levels
- Too many archive restarts
- Too many levels of recursion
- Tried to access an archive file but not in an archive (this isn't an archive, but you seem to be telling me it is)
- The URI has more metastrings and I can't deal with them
- Bucket error (ie. internal, ie. not your fault!)
- Data not found (I've looked, and it's really not there. Get over it)
- Route not found (I can't get to where it would be)
- Rejected overload (A downstream node was too busy to deal with us right now)
- Too many redirects
- Internal error
- Transfer failed (I found it, but never managed to get the data)
- Splitfile error
- Invalid URI
- Too big!
- Metadata is too big
- Too many blocks per segment (in a splitfile)
- Not enough metastrings (be more specific - put /something at the end)
- Cancelled
- Archive restart
- Permanent redirect (there's a newer version of the USK you asked for)
- All data not found (means we fetched some data but not all - perhaps a redirect to a file that hasn't been inserted)
Code des erreurs liées à l'insertion de données
- Invalid URI
- Bucket error (as above)
- Internal error
- Rejected Overload (a downstream node was overloaded and said no)
- Route not found
- Fatal errors in Blocks (Fatal errors in a splitfile insert)
- Too many retries in block (a splitfile had a certain block that just didn't want to go in)
- Route really not found (It couldn't even leave the node)
- Collision (there's already different data at that key)
- Canceled (by you)
Priorités
- Maximum priority: anything more important than Fproxy
- Interactive priority class: Fproxy
- Semi-interactive priority class: Fproxy immediate-mode (not to disk) large file downloads
- Updatable site checks
- Bulk offline splitfile fetches (usually to disk)
- Prefetch priority class
- Minimum priority class (anything less important than prefetch)
Types de données
- Boolean
- Byte amount
- Floating point number
- Number
- String
- String list
- Time
- Time interval
- User input string
Librairies d'implémentation
- JavaFCPLib
- PyFCP - an FCP library for Python client apps
- RubyFCP
- perlFreenet - Perl modules to access Freenet
- CppFCPLib
Aller plus loin
Référence
Cette page a été créée à partir de la page du wiki anglais suivante : http://wiki.freenetproject.org/FreenetFCPSpec2Point0.

