FCPv2 et ses API

Un article 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.

Sommaire

[modifier] 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.

[modifier] 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.

[modifier] 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é.

[modifier] 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

[modifier] Liste des messages

[modifier] Client -> Serveur

[modifier] Serveur -> client

[modifier] Code des erreurs liées au protocole

  1. ClientHello doit être le premier message
  2. Les ClientHellos ne sont pas autorisés plus tard dans le protocole
  3. Message parse error
  4. URI parse error
  5. Champ manquant
  6. Error parsing number
  7. Message invalide
  8. Champ invalide
  9. Fichier introuvable
  10. Disk target exists
  11. Filename and temporary filename must be in the same directory
  12. Impossible de créer le fichier
  13. Impossible d'écrire le fichier
  14. Impossible de renommer le fichier
  15. No such identifier
  16. Not supported
  17. Erreur interne
  18. Shutting down
  19. No such node identifier (Unused since 995)
  20. URL parse error
  21. Reference parse error
  22. File parse error
  23. Pas un fichier
  24. Accès refusé
  25. Direct Disk Access denied
  26. Impossible de lire le fichier
  27. Reference signature failed to verify
  28. Node cannot peer with itself
  29. Node already has a peer with that ref
  30. Opennet is currently disabled by the node's configuration
  31. Operation is only available on a darknet peer
  32. No such plugin

[modifier] Code des erreurs liées à la récupération de données

  1. Too many levels of archive recursion
  2. Unknown splitfile metadata
  3. Unknown metadata
  4. Invalid metadata
  5. Archive failure
  6. Block decode error
  7. Too many metadata levels
  8. Too many archive restarts
  9. Too many levels of recursion
  10. 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)
  11. The URI has more metastrings and I can't deal with them
  12. Bucket error (ie. internal, ie. not your fault!)
  13. Data not found (I've looked, and it's really not there. Get over it)
  14. Route not found (I can't get to where it would be)
  15. Rejected overload (A downstream node was too busy to deal with us right now)
  16. Too many redirects
  17. Internal error
  18. Transfer failed (I found it, but never managed to get the data)
  19. Splitfile error
  20. Invalid URI
  21. Too big!
  22. Metadata is too big
  23. Too many blocks per segment (in a splitfile)
  24. Not enough metastrings (be more specific - put /something at the end)
  25. Cancelled
  26. Archive restart
  27. Permanent redirect (there's a newer version of the USK you asked for)
  28. All data not found (means we fetched some data but not all - perhaps a redirect to a file that hasn't been inserted)

[modifier] Code des erreurs liées à l'insertion de données

  1. Invalid URI
  2. Bucket error (as above)
  3. Internal error
  4. Rejected Overload (a downstream node was overloaded and said no)
  5. Route not found
  6. Fatal errors in Blocks (Fatal errors in a splitfile insert)
  7. Too many retries in block (a splitfile had a certain block that just didn't want to go in)
  8. Route really not found (It couldn't even leave the node)
  9. Collision (there's already different data at that key)
  10. Canceled (by you)

[modifier] Priorités

  1. Maximum priority: anything more important than Fproxy
  2. Interactive priority class: Fproxy
  3. Semi-interactive priority class: Fproxy immediate-mode (not to disk) large file downloads
  4. Updatable site checks
  5. Bulk offline splitfile fetches (usually to disk)
  6. Prefetch priority class
  7. Minimum priority class (anything less important than prefetch)

[modifier] Types de données

  • Boolean
  • Byte amount
  • Floating point number
  • Number
  • String
  • String list
  • Time
  • Time interval
  • User input string

[modifier] Librairies d'implémentation

  • JavaFCPLib
  • PyFCP - an FCP library for Python client apps
  • RubyFCP
  • perlFreenet - Perl modules to access Freenet
  • CppFCPLib

[modifier] Aller plus loin

[modifier] Référence

Cette page a été créée à partir de la page du wiki anglais suivante : http://wiki.freenetproject.org/FreenetFCPSpec2Point0.