Difference between revisions of "LSL HTTP server/fr"

From Second Life Wiki
Jump to navigation Jump to search
m (moved LSL http server/fr to LSL HTTP server/fr: HTTP is capitalized)
 
(11 intermediate revisions by one other user not shown)
Line 37: Line 37:
:* methode vaut URL_REQUEST_GRANTED en cas de succès et URL_REQUEST_DENIED en cas d'échec à obtenir une URL
:* methode vaut URL_REQUEST_GRANTED en cas de succès et URL_REQUEST_DENIED en cas d'échec à obtenir une URL
:* corps est l'URL publique. S'il a été impossible d'obtenir une URL publique, corps sera vide.
:* corps est l'URL publique. S'il a été impossible d'obtenir une URL publique, corps sera vide.
* '''llHTTPResponse(key id, integer status, string body)'''
* '''llHTTPResponse(key id, integer etat, string corps)'''
: Send ''body'' to the requester with status code ''status''
: Envoie ''corps'' au demandeur avec le code d'état ''etat''
:* id is the id from http_request that maps to the specific request
:* id iest l'identifiant id reçu dans l'évènement http_request correspondant à la requête en question
* '''string llGetHTTPHeader(key id, string header)'''
* '''string llGetHTTPHeader(key id, string entete)'''
: Returns the string for the specified header in the specified request
: Renvoie une chaîne contenant la valeur de l'entête indiqué dans la requête indiquée
:* Supported headers are:
:* Les en-têtes reconnus sont :
::* "x-script-url": The base url, as originally recieved from llRequestPublicURL
::* "x-script-url" : l'URL de base, telle qu'elle a été reçue au début par ''llRequestPublicURL''
::* "x-path-info": Any trailing path information from the requested url
::* "x-path-info" : tout le chemin mentionné dans l'URL demandée
::* "x-query-string": Any query arguments, the text past a ? in the url
::* "x-query-string" : tous les arguments de type interrogation, c'est-à-dire le texte suivant le caractère ? dans l'URL
::* "x-remote-ip": IP address of the host that made the request
::* "x-remote-ip" : l'adresse IP de la machine qui a fait la requête
::* "user-agent": The user-agent header as reported by the requester
::* "user-agent" : l'entête user-agent envoyé par le demandeur
  requested url: ''https://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221/foo/bar?arg=gra''
  requested url: ''https://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221/foo/bar?arg=gra''
  x-script-url: ''https://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221''
  x-script-url: ''https://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221''
  x-path-info: ''/foo/bar''
  x-path-info: ''/truc/machin''
  x-query-string: ''arg=gra''
  x-query-string: ''arg=hop''
* '''changed(integer change)'''
* '''changed(integer changement)'''
:* CHANGED_REGION_RESTART: New changed() event triggered on region startup.
:* CHANGED_REGION_RESTART : l'évènement changed() est à présent déclenché quand la région redémarre.
* '''integer llGetFreeURLs()'''
* '''integer llGetFreeURLs()'''
: Returns the number of URLs available to this script.
: Renvoie le nombre d'URL disponibles pour le script.


== URL Lifetime Limitations ==
== Limitations de la durée de vie des URL ==
* URLs are '''temporary'''!
* les URL sont '''temporaires''' !
* URLs will be lost in the following cases, all detectable by the script events listed with them.
* les URL seront perdus dans les cas suivants, qui peuvent tous être détectés au moyen des évènements mentionnés en face.
** On object derez/rez: ''on_rez''
** Lorsque l'objet est empoché, puis rezzé : ''on_rez''
** On script save/reset: ''default state_entry()'' (trickier in multi-state scripts)
** Lorsque le script est enregistré ou réinitialisé : ''default state_entry()'' (plus dur à gérer dans les scripts multi-états)
** On region cross or TP(attachments): '''changed() event, CHANGED_REGION and CHANGED_TELEPORT''
** Lors du changement de région ou de téléportations (attachements) : '''évènement changed(), drapeaux CHANGED_REGION et CHANGED_TELEPORT''
** On region restart: ''changed() event, new flag CHANGED_REGION_RESTART''
** Lorsque la région redémarre : ''évènement changed(), nouveau drapeau CHANGED_REGION_RESTART''
* When urls are 'lost' it means that all public urls for that script are gone, new ones will need to be requested and the new urls will '''''not''''' resemble the old ones.
* Quand les URL sont "perdues", cela signifie que toutes les URL publiques pour ce script ont disparu, il faut en demander de nouvelles, et les nouvelles URL ne ressembleront  '''''pas''''' aux anciennes.
* Maintaining persistent URLs will require building or using an external service similar to how [http://en.wikipedia.org/wiki/Dynamic_DNS Dynamic DNS] services work for tying domain names to dynamic IP addresses.
* Pour disposer d'URL persistantes, il faut développer ou utiliser un service externe semblable dans leur fonctionnement aux [http://en.wikipedia.org/wiki/Dynamic_DNS DNS dynamiques], qui lient quant à eux des noms d'hôtes à des adresses IP dynamiques.


== Resource Limitations ==
== Limitations en ressources ==
* There are a limited number of URLs available in each region, split by land ownership exactly like prim limits.
* Le nombre d'URL disponibles dans chaque région est limité, il est divisé en fonction de la surface du terrain exactement comme les limitations en prims.
** Use llGetFreeURLs to get the exact number of available URLs for the script.
** llGetFreeURLs donne le nombre exact d'URL disponibles pour le script.
** The number of allowed URLs is the same as the number of allowed prims on the parcel the object is over.
** Le nombre d'URL disponibles est le même que le nombre de prims disponibles sur la parcelle sur laquelle l'objet se trouve.
**: ''Object owner does not matter, all objects over a parcel will use the resource pool for that parcel.''
**: ''Le propriétaire de l'objet ne compte pas, tous les objets d'un terrain utiliseront la réserve de ressources de ce terrain.''
**: ''Like prims, all the parcels owned by the same owner and in the same region share the same pool of resources.''
**: ''Comme pour les prims, toutes les parcelles appartenant au même propriétaire dans la même région partagent la même réserve de ressources.''
**: ''If you have two parcels in a region that each support 100 URLs, then you could use all 200 in object(s) on a single parcel.''
**: ''Si vous avez deux terrains dans une région qui peuvent chacun prendre en charge 100 URL, alors vous pouvez en utiliser 200 depuis le ou les objets d'une seule de ces parcelles.''
** The region's object bonus factor does not apply to available URLs.
** Le bonus en objets d'une région ne s'applique pas aux URL disponibles.
**: ''If a parcel has a max of 300 prims in a region with a 2x bonus factor there will only be 150 urls allowed.''
**: ''Si une parcelle a un maximum de 300 prims dans une région avec un facteur de bonus 2x il n'y aura que 150 URL autorisées.''
* Each resident has their own unique pool of available URLs with a max of 38 URLs per resident.
* Chaque résident dispose de sa propre réserve unique d'URL disponibles avec un maximum de 38 URL par résident.
** This is 1 per attachment point, but all 38 could be used by a single attachment for example.
** Cela correspond à 1 URL par point d'attachement, mais toutes les 38 pourraient être utilisées par un seul objet attaché, par exemple.
* Vehicles are special and lazily moved to resident pools by the following logic:
* Les véhicules sont traités à part et rattachés de manière lâche aux réserves des résidents selon la logique suivante :
** Any object that has a resident sitting on it is a 'vehicle'
** Tout objet sur lequel un résident est assis est un "véhicule"
** Vehicles will use the url resources from the parcel they are over until the cross a parcel border.
** Les véhicules utiliseront les ressources en URL de la parcelle sur laquelle ils se trouvent jusqu'à ce qu'ils dépassent une limite de terrain.
**: ''Specifically this prevents anyone from breaking your vending machine by sitting on it and making it a 'vehicle'.''
**: ''En particulier, cela empêche quelqu'un de détraquer votre vendeur automatisé en s'asseyant dessus en en faisant un "véhicule".''
** When any object using URL resources with a resident sitting on it crosses a parcel boundary the resources will switch to the first sitting resident with enough resources.  If no sitting agents have enough resources then the resources from the parcel being moved onto will be used.  If even then there are not enough resources to use then the vehicle will be blocked from moving.
** Quand un objet utilisant des ressources en URL avec un résident assis dessus traverse une limite de parcelle, les resources basculent vers le premier résident assis ayant assez de ressources. Si aucun agent assis n'a assez de ressources, alors les ressources de la parcelle dans laquelle on entre seront utilisées. S'il n'y a toujours pas assez de ressources à utiliser, alors le déplacement du véhicule est empêché.
**: ''In short we do everything we can to find a pool to host the resources needed by the vehicle, but will block movement if we can't.''
**: ''Pour résumer, nous faisons tout notre possible pour trouver une réserve où piocher les ressources nécessaires pour le véhicule, mais nous bloquons le mouvement si c'est impossible.''
* Parcel Sale: When a parcel is sold such that it changes the total available URLs in the region for either resident (seller or buyer) such that more URLs are being used than are available some objects will be returned.
* Vente de terrain : quand un terrain est vendu, cela change le nombre total d'URL disponibles dans la région pour les deux résidents (le vendeur et l'acheteur). Si à cette occasion, plus d'URL sont utilisées qu'il n'y en a de disponibles, des objets seront renvoyés.
** The objects returned will be from youngest object to oldest object of those using URLs in each category in order of object category: Temporary, Other, Group, Owner, Selected/Sat upon.
** Les objets renvoyés le seront du plus récent au plus ancien parmi ceux qui utilisent des URL, pour chaque catégorie parmi les catégories suivantes : temporaire, apaprtenant à une autre personne, appartenant à un membre du groupe, appartenant au propriétaire, sélectionné ou assis dessus.
**: ''The '''only''' time objects are possibly returned is when parcels change owner, and only if more resources are being used than allowed.''
**: ''Le '''seul''' cas où des objets sont ranvoyés c'est lorsque les terrains changent de propriétaire et uniquement lorsque plus de ressources qu'il n'y en a de disponibles sont utilisées.''
**: ''We return youngest temporary objects before older temporary objects before younger 'other' (owned by non-group, non-parcel-owner) objects etc.''
**: ''On renvoie les objets temporaires les plus récents avant les objets temporaires plus anciens avant les objets appartenant à une autre personne les plus récents avant... etc.''


== Other Limitations ==
== Autres limitations ==
* Size of the body of the requests will be limited to 2k bytes.
* La taille du corps des requêtes sera limitée à 2 ko.
* Size of headers of requests will be limited to 255 bytes.
* La taille des entêtes de requêtes sera limitée à 255 octets.
* The size of responses to requests is not currently limited, but this is subject to review during testing.
* La taille des réponses aux requêtes n'est pour le moment pas limitée, mais cela pourra changer.
* The content type of the returned data is always 'text/plain; utf-8'
* Le type de contenu des données renvoyées est pour le moment toujours 'text/plain; utf-8'
*: ''Allowing more content type options is a possibility for the future, but not guaranteed.''
*: ''On pourrait autoriser d'autres types de contenu dans le futur, mais ce n'est pas garanti.''
* There is a cap of 64 in flight requests per script. This is based on the maximum number of pending events in LSL.
* On laisse tomber toutes les requêtes au delà de la 64ème en cours. C'est une conséquence du nombre maximal d'évènements en attente en LSL.
* ''We may throttle the rate we accept hits at the CAP server level as well. This is possible, but has not yet been decided.''
* ''On pourrait également réduire le rythme maximal auquel on accepte les requêtes sur le serveur de "capabilities". C'est possible, mais n'a pas encore été décidé.''


== Liens ==
== Liens ==

Latest revision as of 11:45, 5 November 2009

Introduction

Les fonctions de serveur HTTP en LSL sont le pendant de llHTTPRequest. Alors que llHTTPRequest permet aux scripts LSL de Second Life de récupérer des données sur des sources accessibles en HTTP, ces fonctions entrantes HTTP permettent à des sources externes de récuperer des données depuis des scripts de Second Life. La différences principale est que llHTTPRequest échange des données au moment désiré par le script dans SL, alors que les fonctions entrantes HTTP permettent à des sources externes de déterminer à quel moment elles ont besoin de communiquer avec des scripts de SL.

Avant les fonctions de serveur HTTP, on pouvait obtenir un résultat équivalent en consultant à intervalles régulier avec llHTTPRequest, llEmail et XML-RPC. Les trois solutions étaient lourdes et les deux dernières avaient du mal à monter en charge.

Applications

  • Fournir aisément des données depuis des scripts LSL à des navigateurs SL, des scripts ou des serveurs externes.
    • Interface web pour un compteur de visiteurs ou un autre outil statistique
  • Injecter aisément des données dans des scripts LSL scripts depuis des navigateurs SL, des scripts ou des serveurs externes.
    • Un magasin avec une interface web qui communique avec un objet du monde pour échanger des L$ et des éléments de son inventaire.
    • Un jeu dans le monde où la logique de jeu principale est prise en charge par un programme externe qui doit manipuler des éléments dans le monde.

Si vous ne voulez pas vous plonger dans les détails techniques qui suivent, allez directement voir les exemples de scripts.

Interface de programmation

  • key llRequestURL()
Demande une nouvelle URL publique de serveur LSL.
Un évènement http_request se déclenchera que cela échoue ou réussisse et contiendra la clé renvoyée.
Code LSL : request_id = llRequestURL(); 
  • key llRequestSecureURL()
Semblable à llRequestURL mais demande une URL HTTPS / SSL.
Un évènement http_request se déclenchera que cela échoue ou réussisse et contiendra la clé renvoyée.
Code LSL : request_id = llRequestSecureURL(); 
  • llReleaseURL(string url)
Libère l'URL indiquée, Utilisé à la fois pour les URL normales et sécurisées.
Code LSL : llReleaseURL("http://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221");
  • http_request(key id, string methode, string corps)
Évènement déclenché quand une URL est appelée :
  • id est unique à cette requête ;
  • Les méthodes prises en charge sont GET, POST, PUT et DELETE ;
  • corps : le corps de la réponse.
Évènement également déclenché en réponse à llRequestURL et à llRequestSecureURL
  • id correspond à la clé renvoyée par llRequestURL et llRequestSecureURL
  • methode vaut URL_REQUEST_GRANTED en cas de succès et URL_REQUEST_DENIED en cas d'échec à obtenir une URL
  • corps est l'URL publique. S'il a été impossible d'obtenir une URL publique, corps sera vide.
  • llHTTPResponse(key id, integer etat, string corps)
Envoie corps au demandeur avec le code d'état etat
  • id iest l'identifiant id reçu dans l'évènement http_request correspondant à la requête en question
  • string llGetHTTPHeader(key id, string entete)
Renvoie une chaîne contenant la valeur de l'entête indiqué dans la requête indiquée
  • Les en-têtes reconnus sont :
  • "x-script-url" : l'URL de base, telle qu'elle a été reçue au début par llRequestPublicURL
  • "x-path-info" : tout le chemin mentionné dans l'URL demandée
  • "x-query-string" : tous les arguments de type interrogation, c'est-à-dire le texte suivant le caractère ? dans l'URL
  • "x-remote-ip" : l'adresse IP de la machine qui a fait la requête
  • "user-agent" : l'entête user-agent envoyé par le demandeur
requested url: https://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221/foo/bar?arg=gra
x-script-url: https://sim123.agni/cap/f23b4b94-012d-44f2-bd0c-16c328321221
x-path-info: /truc/machin
x-query-string: arg=hop
  • changed(integer changement)
  • CHANGED_REGION_RESTART : l'évènement changed() est à présent déclenché quand la région redémarre.
  • integer llGetFreeURLs()
Renvoie le nombre d'URL disponibles pour le script.

Limitations de la durée de vie des URL

  • les URL sont temporaires !
  • les URL seront perdus dans les cas suivants, qui peuvent tous être détectés au moyen des évènements mentionnés en face.
    • Lorsque l'objet est empoché, puis rezzé : on_rez
    • Lorsque le script est enregistré ou réinitialisé : default state_entry() (plus dur à gérer dans les scripts multi-états)
    • Lors du changement de région ou de téléportations (attachements) : 'évènement changed(), drapeaux CHANGED_REGION et CHANGED_TELEPORT
    • Lorsque la région redémarre : évènement changed(), nouveau drapeau CHANGED_REGION_RESTART
  • Quand les URL sont "perdues", cela signifie que toutes les URL publiques pour ce script ont disparu, il faut en demander de nouvelles, et les nouvelles URL ne ressembleront pas aux anciennes.
  • Pour disposer d'URL persistantes, il faut développer ou utiliser un service externe semblable dans leur fonctionnement aux DNS dynamiques, qui lient quant à eux des noms d'hôtes à des adresses IP dynamiques.

Limitations en ressources

  • Le nombre d'URL disponibles dans chaque région est limité, il est divisé en fonction de la surface du terrain exactement comme les limitations en prims.
    • llGetFreeURLs donne le nombre exact d'URL disponibles pour le script.
    • Le nombre d'URL disponibles est le même que le nombre de prims disponibles sur la parcelle sur laquelle l'objet se trouve.
      Le propriétaire de l'objet ne compte pas, tous les objets d'un terrain utiliseront la réserve de ressources de ce terrain.
      Comme pour les prims, toutes les parcelles appartenant au même propriétaire dans la même région partagent la même réserve de ressources.
      Si vous avez deux terrains dans une région qui peuvent chacun prendre en charge 100 URL, alors vous pouvez en utiliser 200 depuis le ou les objets d'une seule de ces parcelles.
    • Le bonus en objets d'une région ne s'applique pas aux URL disponibles.
      Si une parcelle a un maximum de 300 prims dans une région avec un facteur de bonus 2x il n'y aura que 150 URL autorisées.
  • Chaque résident dispose de sa propre réserve unique d'URL disponibles avec un maximum de 38 URL par résident.
    • Cela correspond à 1 URL par point d'attachement, mais toutes les 38 pourraient être utilisées par un seul objet attaché, par exemple.
  • Les véhicules sont traités à part et rattachés de manière lâche aux réserves des résidents selon la logique suivante :
    • Tout objet sur lequel un résident est assis est un "véhicule"
    • Les véhicules utiliseront les ressources en URL de la parcelle sur laquelle ils se trouvent jusqu'à ce qu'ils dépassent une limite de terrain.
      En particulier, cela empêche quelqu'un de détraquer votre vendeur automatisé en s'asseyant dessus en en faisant un "véhicule".
    • Quand un objet utilisant des ressources en URL avec un résident assis dessus traverse une limite de parcelle, les resources basculent vers le premier résident assis ayant assez de ressources. Si aucun agent assis n'a assez de ressources, alors les ressources de la parcelle dans laquelle on entre seront utilisées. S'il n'y a toujours pas assez de ressources à utiliser, alors le déplacement du véhicule est empêché.
      Pour résumer, nous faisons tout notre possible pour trouver une réserve où piocher les ressources nécessaires pour le véhicule, mais nous bloquons le mouvement si c'est impossible.
  • Vente de terrain : quand un terrain est vendu, cela change le nombre total d'URL disponibles dans la région pour les deux résidents (le vendeur et l'acheteur). Si à cette occasion, plus d'URL sont utilisées qu'il n'y en a de disponibles, des objets seront renvoyés.
    • Les objets renvoyés le seront du plus récent au plus ancien parmi ceux qui utilisent des URL, pour chaque catégorie parmi les catégories suivantes : temporaire, apaprtenant à une autre personne, appartenant à un membre du groupe, appartenant au propriétaire, sélectionné ou assis dessus.
      Le seul cas où des objets sont ranvoyés c'est lorsque les terrains changent de propriétaire et uniquement lorsque plus de ressources qu'il n'y en a de disponibles sont utilisées.
      On renvoie les objets temporaires les plus récents avant les objets temporaires plus anciens avant les objets appartenant à une autre personne les plus récents avant... etc.

Autres limitations

  • La taille du corps des requêtes sera limitée à 2 ko.
  • La taille des entêtes de requêtes sera limitée à 255 octets.
  • La taille des réponses aux requêtes n'est pour le moment pas limitée, mais cela pourra changer.
  • Le type de contenu des données renvoyées est pour le moment toujours 'text/plain; utf-8'
    On pourrait autoriser d'autres types de contenu dans le futur, mais ce n'est pas garanti.
  • On laisse tomber toutes les requêtes au delà de la 64ème en cours. C'est une conséquence du nombre maximal d'évènements en attente en LSL.
  • On pourrait également réduire le rythme maximal auquel on accepte les requêtes sur le serveur de "capabilities". C'est possible, mais n'a pas encore été décidé.

Liens