262 lines
23 KiB
HTML
262 lines
23 KiB
HTML
|
<HTML><HEAD>
|
|||
|
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
|
|||
|
</HEAD>
|
|||
|
<BODY>
|
|||
|
<div><H3><b>Http Commandes Internes Tcl</b></H3></div>
|
|||
|
<HR ALIGN="center">
|
|||
|
<div><b>NOM</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Http - Impl<70>mentation client du protocole HTTP/1.0.
|
|||
|
</div><br>
|
|||
|
<div><b>SYNTAXE</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;"><b>package require http ?2.3?</b> <br>
|
|||
|
<b>::http::config </b><i>?options?</i> <br>
|
|||
|
<b>::http::geturl </b><i>url ?options?</i> <br>
|
|||
|
<b>::http::formatQuery </b><i>list</i> <br>
|
|||
|
<b>::http::reset </b><i>token</i><br>
|
|||
|
<b>::http::wait </b><i>token</i>
|
|||
|
<b>::http::status </b><i>token</i><br>
|
|||
|
<b>::http::size </b><i>token</i><br>
|
|||
|
<b>::http::code </b><i>token</i><br>
|
|||
|
<b>::http::ncode </b><i>token</i><br>
|
|||
|
<b>::http::data </b><i>token</i><br>
|
|||
|
<b>::http::error </b><i>token</i><br>
|
|||
|
<b>::http::cleanup </b><i>token</i><br>
|
|||
|
<b>::http::register </b><i>proto port command</i> <br>
|
|||
|
<b>::http::unregister </b><i>proto</i>
|
|||
|
</div><br>
|
|||
|
<div><b>DESCRIPTION</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Le paquetage <b>http</b> fournit la partie client du protocole HTTP/1.0. Le paquetage impl<70>mente les op<6F>rations GET, POST, et HEAD de HTTP/1.0. Il permet la configuration d'un
|
|||
|
proxy pour traverser les firewalls Le paquetage est compatible avec la politique de s<>curit<69><b> Safesock</b>, donc il peut <20>tre utilis<69> par un applet non v<>rifi<66> pour r<>cup<75>rer des URL <20> partir d'un ensemble restreint d'h<>tes. Ce paquetage peut <20>tre <20>tendu pour supporter d'autres protocoles de transport HTTP, tel que HTTPS, en fournissant une commande<A><b> socket </b></A>utilisateur, via <b>http::register</b>. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">La fonction<b> ::http::geturl</b> effectue une transaction HTTP. Ses <i>options </i> determinent si une transaction GET, POST, ou HEAD est effectu<74>e La valeur de retour de <b>::http::geturl</b> est un jeton pour la transaction. La valeur est aussi le nom d'un tableau dans le ::http namespace qui contient information d'<27>tat concernant la transaction Les <20>l<EFBFBD>ments de ce tableau sont d<>crits dans la section TABLEAU D'ETAT. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Si l'option <b>-command</b> est sp<73>cifi<66>e, alors l'op<6F>ration HTTP est faite en arri<72>re-plan. <b>::http::geturl</b> retourne imm<6D>diatement apr<70>s la g<>n<EFBFBD>ration de la requ<71>te HTTP et le callback est appel<65> quand la transaction se termine Pour que cela fonctionne, la boucle d'<27>v<EFBFBD>nement Tcl doit <20>tre active Dans les applications Tk c'est toujours vrai Pour les applications purement Tcl, l'appelant peut utiliser <b>::http::wait</b> apr<70>s l'appel de <b>::http::geturl</b> pour lancer la boucle d'<27>v<EFBFBD>nement.
|
|||
|
</div> <br>
|
|||
|
<div><b>COMMANDES</b></div> <br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">
|
|||
|
<DL>
|
|||
|
<DT><br><b>::http::config</b> ?<i>options</i>?</DT><DD>La commande<b>::http::config</b> est utilis<69> pour fixer et consulter le nom et le port du serveur proxy, et le nom de l'Agent Utilisateur utilis<69> dans les requ<71>tes HTTP Si aucunes options ne sont sp<73>cifi<66>es, alors la configuration courante est renvoy<6F>e Si un seul argument est sp<73>cifi<66>, alors il doit <20>tre un des flags d<>crits ci-dessous Dans ce cas la valeur courante de ce param<61>tre est renvoy<6F>e Autrement, les options seront un ensemble de flags et de valeurs qui definissent la configuration:
|
|||
|
<DL>
|
|||
|
<DT><br><b>-accept</b> <i>mimetypes</i>
|
|||
|
</DT><DD>L'en-t<>te Accept de la requ<71>te La valeur par d<>faut est */*, ce qui signifie que qui tout types de documents sont accept<70>s Autrement vous pouvez donner une liste s<>par<61>e par des virgules de types mime que vous souhaitez recevoir recevoir Par exemple, "image/gif, image/jpeg, text/*".
|
|||
|
</DD>
|
|||
|
<DT><br><b>-proxyhost</b> <i>hostname</i>
|
|||
|
</DT><DD>Le nom du proxy, s'il existe. Si cette valeur est la cha<68>ne vide, l'URL est contact<63> directement.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-proxyport</b> <i>number</i>
|
|||
|
</DT><DD>Le num<75>ro de port du proxy.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-proxyfilter</b> <i>command</i>
|
|||
|
</DT><DD>La commande est un callback qui est appel<65> pendant <b>::http::geturl</b> pour determiner si un proxy est requis pour un host donn<6E> Un argument, un nom de machine, est ajout<75> <20> <i>command</i> quand elle est appel<65>e Si un proxy est requis, le callback renverra une liste de deux <20>l<EFBFBD>ment contenant le serveur proxy et le port proxy Autrement le filtre renverra une liste vide Le filtre par d<>faut retourne les valeurs des param<61>tres <b>-proxyhost</b> et <b>-proxyport</b> si ils sont non-vides.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-useragent</b> <i>string</i>
|
|||
|
</DT><DD>La valeur de l'en-t<>te Agent Utilisateur dans la requ<71>te HTTP Par d<>faut <b>"Tcl http client package 2.2."</b>
|
|||
|
</DD>
|
|||
|
</DL>
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::geturl</b> <i>url</i> ?<i>options</i>?
|
|||
|
|
|||
|
</DT><DD>La commande<b>::http::geturl</b> est la fonction principale dans le paquetage. L'option <b>-</b> <b>query </b>provoque une op<6F>ration POST et l'option <b>-validate</b> provoque une op<6F>ration HEAD; autrement, une op<6F>ration GET est effectu<74>e La commande<b>::http::geturl</b> retourne une valeur <i>token </i>qui peut <20>tre utilis<69>e pour obtenir l'information concernant la transaction Voir les sections TABLEAU D'ETAT et ERRORS pour les d<>tails La commande<b>::http::geturl</b> bloque jusqu'a ce que l'op<6F>ration se termine, <20> moins que l'option <b>-command</b> sp<73>cifie un callback appel<65> quand la transaction HTTP se termine. <b>::http::geturl</b> accepte plusieurs options:
|
|||
|
<DL>
|
|||
|
<DT><br><b>-blocksize</b> <i>size</i></DT><DD>La taille de bloc utilis<69>e en lisant l'URL. Au plus <i>size</i> octets sont lus en une fois. Apr<70>s chaque bloc, un appel <20> <b>-progress</b> est fait (si cette option est sp<73>cifi<66>e).
|
|||
|
</DD>
|
|||
|
<DT><br><b>-channel</b> <i>name</i>
|
|||
|
</DT><DD>Copie l'URL contenu dans le canal <i>name</i> au lieu de le sauvegarder dans <b>state(body)</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-command</b> <i>callback</i>
|
|||
|
</DT><DD>Appelle <i>callback</i> apr<70>s la fin de la transaction HTTP. Cette option cause le retour imm<6D>diat de <b>::http::geturl</b>. Le <i>callback</i> recoit un argument suppl<70>mentaire qui est le <i>token </i>renvoy<EFBFBD> par <b>::http::geturl</b>. Ce jeton est le nom d'un tableau qui est d<>crit dans la section TABLEAU D'ETAT.Voici un mod<6F>le pour le callback:
|
|||
|
<br>proc httpCallback {token} {
|
|||
|
<br> upvar #0 $token state
|
|||
|
<br> # Acc<63>de au tableau d'<27>tat Tcl
|
|||
|
<br>}
|
|||
|
</DD>
|
|||
|
<DT><br><b>-handler</b> <i>callback</i>
|
|||
|
</DT><DD>Appelle <i>callback</i> chaque fois que des donn<6E>es HTTP sont disponibles; si pr<70>sent, rien d'autre ne sera fait avec les donn<6E>es HTTP. Cette fonction attend deux arguments suppl<70>mentaire: la socket pour les donn<6E>es HTTP et le <i>token </i>renvoy<EFBFBD> par <b>::http::geturl</b>. Le jeton est le nom d'un tableau global qui est d<>crit dans la section TABLEAU D'ETAT. La fonction est cens<6E>e renvoyer le nombre d'octets lus de la socket. Voici un mod<6F>le pour le callback:
|
|||
|
<br>proc httpHandlerCallback {socket token } {
|
|||
|
<br> upvar #0 $token state
|
|||
|
<br> # Acc<63>de la socket, et au tableau d'<27>tat Tcl
|
|||
|
<br> ...
|
|||
|
(exemple: set data [read $socket 1000];set nbytes [string length $data])<br> .. return nbytes
|
|||
|
<br>}
|
|||
|
</DD>
|
|||
|
<DT><br><b>-headers</b> <i>keyvaluelist</i>
|
|||
|
</DT><DD>Cette option est utilis<69>e pour ajouter des en-t<>tes <20> la requ<71>te HTTP. L'argument <i>keyvaluelist</i> doit <20>tre une liste avec le m<>me nombre d'<27>l<EFBFBD>ments alternant entre cl<63>s et valeurs. Les cl<63>s deviennent les en-t<>te des champ noms. Les sauts de lignes sont enlev<65>s des valeurs pour que l'en-t<>te ne puisse <20>tre corrompu. Par exemple, si <i>keyvaluelist</i> est <b>Pragma no-cache</b> alors l'en-t<>te suivant est inclus dans la requ<71>te HTTP: <br>
|
|||
|
Pragma: no-cache
|
|||
|
</DD>
|
|||
|
<DT><br><b>-progress</b> <i>callback</i>
|
|||
|
</DT><DD>Le <i>callback</i> est appel<65> apr<70>s chaque transfert de donn<6E>es de l'URL. Le callback attend trois arguments additionels: le <i>token </i>de <b>::http::geturl</b>, la taille totale attendue des meta-donn<6E>es contenues dans <b>Content-Length</b>, et le nombre courant d'octets transf<73>r<EFBFBD>s effectivement. La taille totale attendue peut <20>tre inconnue, auquel cas z<>ro est transmis au callback. Voici un mod<6F>le pour le callback progress:<br>
|
|||
|
proc httpProgress {token total current} {<br>
|
|||
|
upvar #0 $token state<br>
|
|||
|
}
|
|||
|
</DD>
|
|||
|
<DT><br><b>-query </b><i>query</i>
|
|||
|
</DT><DD>Ce flag fait effectuer <20> <b>::http::geturl</b> une requ<71>te POST qui transmet la <i>query</i> au serveur. La <i>query</i> doit <20>tre une demande format<61>e x-url-encoding La fonction<b>::http::formatQuery</b> peut <20>tre utilis<69>e pour le formatage.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-queryblocksize</b> <i>size</i>
|
|||
|
</DT><DD>La taille de bloc utilis<69>e en postant des donn<6E>es query <20> l'URL. Au plus <i>size</i> octets sont <20>crits <20> la fois. Apr<70>s chaque bloc, un appel <20> <b>-queryprogress</b> callback est fait (si cette option est sp<73>cifi<66>e).
|
|||
|
</DD>
|
|||
|
<DT><br><b>-querychannel</b> <i>channelID</i>
|
|||
|
</DT><DD>Ce flag fait effectuer <20> <b>::http::geturl</b> une requ<71>te POST qui passe les donn<6E>es contenues dans <i>channelID</i> au serveur. Les donn<6E>es contenue dans <i>channelID</i> doivent <20>tre une demande format<61>e x-url-encoding <20> moins que l'option <b>-type</b> soit utilis<69>e. Si un en-t<>te Content-Length n'est pas sp<73>cifi<66> via l'option<b> -headers</b>, <b>::http::geturl</b> tente de d<>terminer la taille des donn<6E>es post dans l'ordre de cr<63>ation de l'en-t<>te. Si elle est incapable de determiner la taille, elle retourne une erreur.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-queryprogress</b> <i>callback</i>
|
|||
|
</DT><DD>Le <i>callback</i> est faite apr<70>s chaque transfert de donn<6E>es <20> URL (ex. POST) et agit exactement comme l'option <b>-progress</b> (le format de callback est le m<>me).
|
|||
|
</DD>
|
|||
|
<DT><br><b>-timeout</b> <i>millisecondes</i>
|
|||
|
</DT><DD>Si <i>millisecondes</i> est diff<66>rent de z<>ro, alors <b>::http::geturl</b> programme un timeout apr<70>s le nombre sp<73>cifi<66> de millisecondes. Un timeout provoque un appel de <b>::http::reset</b> et un callback<b> -command</b>, si sp<73>cifi<66>. La valeur de retour de <b>::http::status</b> est <b>timeout</b> apr<70>s un timeout.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-type</b> <i>mime-type</i></DT><DD>Utilisez <i>mime-type</i> comme la valeur<b> Content-Type</b>, au lieu de de la valeur par d<>faut (<b>application/x-www-form-urlencoded</b>) pendant une op<6F>ration POST.
|
|||
|
</DD>
|
|||
|
<DT><br><b>-validate</b> <i>boolean</i>
|
|||
|
</DT><DD>Si <i>boolean</i> est diff<66>rent de z<>ro, alors <b>::http::geturl</b> does un HTTP HEAD requ<71>te. Cette requ<71>te retourne la meta information concernant l'URL, mais le contenu n'est pas renvoy<6F>. La meta information est disponible dans la variable <b>state(meta)</b> apr<70>s la transaction. Voir la section TABLEAU D'ETAT pour les d<>tails.
|
|||
|
</DD>
|
|||
|
</DL>
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::formatQuery</b> <i>key value</i> ?<i>key value</i> ...?
|
|||
|
</DT><DD>Cette fonction op<6F>re un x-url-encodage des donn<6E>es consult<6C>es. Elle attend un m<>me nombre d'arguments qui sont les cl<63>s et valeurs de la requ<71>te. Elle encode les cl<63>s et valeurs, et g<>n<EFBFBD>re une cha<68>ne avec les s<>parateurs corrects (& et =). Le r<>sultat est convenable pour la valeur <b>-query </b>transmise <20> <b>::http::geturl</b>.
|
|||
|
</DD>
|
|||
|
<DT><b>::http::reset</b> <i>token</i>?<i>why</i>?<br>
|
|||
|
</DT><DD>Cette commande r<>initialise la transaction HTTP identifi<66>e par <i>token</i>, si elle existe. Ceci fixe la valeur <b>state(status)</b> <20> <i>why</i>, qui est par d<>faut de <b>reset</b>, et alors appelle le callback declar<61> par <b>-command</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::wait</b> <i>token</i>
|
|||
|
</DT><DD>Ceci est une fonction utilitaire qui bloque et attend que la transaction soit compl<70>t<EFBFBD>e. Elle fonctionne seulement avec du code de confiance parcequ'elle utilise <A HREF="180.htm"><b>vwait</b></A>. D'autre part, elle n'est pas utile pour les cas o<> <b>::http::geturl</b> est appel<65>e <i>sans</i> l'option <b>-command</b> parce que dans ce cas l'appel <20><b>::http::geturl</b> ne retourne pas jusqu'a ce que la transaction HTTP soit compl<70>te, et donc qu'il n'y a rien <20> attendre.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::data</b> <i>token</i>
|
|||
|
</DT><DD>Ceci est une fonction utilitaire qui retourne l'<27>l<EFBFBD>ment <b>body</b> (ex., l'URL donn<6E>e) du tableau d'<27>tat.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::error</b> <i>token</i></DT><DD>Ceci est une fonction utilitaire qui retourne l'<27>l<EFBFBD>ment<A HREF="103.htm"><b> error</b></A> du tableau d'<27>tat.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::status</b> <i>token</i>
|
|||
|
</DT><DD>Ceci est une fonction utilitaire qui retourne l'<27>l<EFBFBD>ment<b> status</b> du tableau d'<27>tat.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::code</b> <i>token</i>
|
|||
|
</DT><DD>Ceci est une fonction utilitaire qui retourne l'<27>l<EFBFBD>ment<b> http</b> du tableau d'<27>tat.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::ncode</b> <i>token</i></DT><DD>Ceci est une fonction utilitaire qui retourne juste le code num<75>rique de retour (200, 404, etc.) de l'<27>l<EFBFBD>ment <b>http</b> du tableau d'<27>tat.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::size</b> <i>token</i>
|
|||
|
</DT><DD>Ceci est une fonction utilitaire qui retourne l'<27>l<EFBFBD>ment <b>currentsize</b> du tableau d'<27>tat, qui repr<70>sente le nombre d'octets re<72>us de l' URL dans l'appel <20> <b>::http::geturl</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::cleanup</b> <i>token</i>
|
|||
|
</DT><DD>Cette fonction nettoye l'<27>tat associ<63> <20> la connection identifi<66>e par <i>token</i> Apr<70>s cet appel, les fonctions comme <b>::http::data</b> ne peuvent pas <20>tre utilis<69>es pour obtenir l'information concernant l'op<6F>ration Il est <i>fortement</i> recommand<6E> que vous appeliez cette fonction apr<70>s avoir fini avec une requ<71>te HTTP Ne pas le faire proquera la non-lib<69>ration de la m<>moire, et si votre appli appelle <b>::http::geturl</b> plusieurs fois, la fuite m<>moire pourrait provoquer un pic de performance...ou bien pire.
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::register</b> <i>proto port command</i>
|
|||
|
</DT><DD>Cette fonction permet de fournir des types de transport HTTP tel que HTTPS, en enregistrant un pr<70>fixe, le port par d<>faut, et la commande <20> ex<65>cuter pour cr<63>er le <b>channel</b> Tcl. Ex.: <br>
|
|||
|
<br>package require http
|
|||
|
<br>package require tls
|
|||
|
<br>http::register https 443 ::tls::socket
|
|||
|
<br>set token [http::geturl https://my.secure.site/]
|
|||
|
</DD>
|
|||
|
<DT><br><b>::http::unregister</b> <i>proto</i>
|
|||
|
</DT><DD>Cette fonction lib<69>re un gestionnaire de protocole pr<70>cedemment declar<61> via <b>http::register</b>
|
|||
|
</DD>
|
|||
|
</DL>
|
|||
|
</div><br>
|
|||
|
<div><b>ERREURS</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">La fonction <b>http::geturl</b> l<>vera des erreurs dans les cas suivants: options de ligne de commande invalides, URL invalide, une URL sur une machine inexistante, ou une URL <20> un mauvais port sur une machine existante. Ces erreurs signifient que la transaction r<>seau n'a m<>me pas d<>marr<72>. Elle l<>ve aussi une erreur si elle recoit une erreur I/O pendant l'<27>criture de l'en-t<>te de la requ<71>te HTTP. Pour les appels<b>::http::geturl</b> synchrones (o<> <b>-command</b> n'est pas sp<73>cifi<66>e), elle l<>vera une erreur si elle recoit une erreur I /O en lisant l'en-t<>tes ou les donn<6E>es de la r<>ponse HTTP parce que <b>::http::geturl</b> ne retourne pas de jeton dans ces cas, elle fait tout le nettoyage requis et il n'y a pas de n<>cessit<69> pour votre appli d'appeler <b>::http::cleanup</b>. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Pour les appels asynchrones de <b>::http::geturl</b>, toutes les situations d'erreur pr<70>c<EFBFBD>dentes s'appliquent, except<70> que si s'il y a une erreur pendant la lecture de l'en-t<>tes ou les donn<6E>es de la r<>ponse HTTP, aucune exception n'est l<>v<EFBFBD>e Ceci parcequ'apr<70>s l'<27>criture des en-t<>tes HTTP, <b>::http::geturl</b> retourne, et le reste de la transaction HTTP se produit en arri<72>re-plan La commande callback peut verifier si l'erreur s'est produite pendant la lecture en appelant <b>::http::status</b> pour v<>rifier le statut et si c'est <i>error</i>, appeller <b>::http::error</b> pour obtenir le message d'erreur. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Alternativement, si le flux du programme principal atteint un point ou il a besoin de connaitre le r<>sultat de la requ<71>te HTTP asynchrone, il peut appeller <b>::http::wait</b> et alors verifier les statut et erreur, comme le callback le fait. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Dans tous les cas, vous devez toujours appeller <b>http::cleanup</b> pour effacer le tableau d'<27>tat quand vous avez fini. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Les autres r<>sultats possibles de la transaction HTTP d<>termin<69>s par l'examen du statut <20> partir de <b>http::status</b> sont d<>crit ci-dessous.
|
|||
|
|
|||
|
<DL>
|
|||
|
<DT><br>ok
|
|||
|
</DT><DD>Si la transaction HTTP se termine enti<74>rement, alors le statut sera <b>ok</b>. N<>anmoins, vous pouvez toujours v<>rifier la valeur <b>http::code</b> pour obtenir le statut HTTP La fonction <b>http::ncode</b> fournit just l'erreur num<75>rique (ex., 200, 404 ou 500) alors que la fonction <b>http::code</b> retourne une valeur comme "HTTP 404 File not found".
|
|||
|
</DD>
|
|||
|
<DT><br>eof
|
|||
|
</DT><DD>Si le serveur ferme la socket sans r<>ponse, alors aucune erreur n'est lev<65>e, mais le statut de la transaction sera <A HREF="102.htm"><b>eof</b></A>.
|
|||
|
</DD>
|
|||
|
<DT><br>error
|
|||
|
</DT><DD>Le message d'erreur sera aussi stock<63> dans l'<27>l<EFBFBD>ment<A HREF="103.htm"><b> error</b></A> du tableau d'<27>tat, accessible via <b>::http::error</b>.
|
|||
|
</DD>
|
|||
|
</DL>
|
|||
|
</div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Une autre possibilit<69> d'erreur est que <b>http::geturl</b> soit incapable d'<27>crire toutes les donn<6E>es post sur le serveur avant que le serveur r<>ponde et ferme la socket. Le message d'erreur est sauvegard<72> dans l'<27>l<EFBFBD>ment <b>posterror</b> du tableau d'<27>tat et alors <b>http::geturl</b> tente de finaliser la transaction. Si elle peut lire la r<>ponse du serveur elle finira avec un statut<b> ok</b>, autrement elle aura un statut<A HREF="102.htm"><b> eof</b></A> <br>
|
|||
|
</div><br>
|
|||
|
<div><b>TABLEAU D'ETAT</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">La fonction<b>::http::geturl</b> retourne un <i>token </i>qui peut <20>tre utilis<69> pour obtenir l'<27>tat de la transaction HTTP sous la forme d'un tableau Tcl. Utilisez cette construction pour cr<63>er une variable tableau facile <20> utiliser: </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;">upvar #0 $token state</div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Une fois que les donn<6E>es associ<63>es <20> l'url ne sont plus n<>cessaires, le tableau d'<27>tat sera d<>truit pour lib<69>rer la m<>moire. La fonction <b>http::cleanup</b> est fournie <20> cet usage. Les <20>l<EFBFBD>ments suivants du tableau sont support<72>s:
|
|||
|
<DL>
|
|||
|
<DT><br><b>body</b>
|
|||
|
</DT><DD>Le contenu de l'URL. Sera vide si l'option <b>-channel</b> a <20>t<EFBFBD> sp<73>cifi<66>e Cette valeur est renvoy<6F>ee par la commande<b>::http::data</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>currentsize</b>
|
|||
|
</DT><DD>Le nombre courant d'octets r<>cup<75>r<EFBFBD> de l'URL. Cette valeur est renvoy<6F>e par la commande<b>::http::size</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>error</b>
|
|||
|
</DT><DD>Si d<>fini, c'est la cha<68>ne d'erreur vue quand la transaction HTTP est avort<72>e.
|
|||
|
</DD>
|
|||
|
<DT><br><b>http</b>
|
|||
|
</DT><DD>Le statut de la r<>ponse HTTP du serveur Cette valeur est renvoy<6F>e par la commande<b>::http::code</b> Le format de cette valeur est:
|
|||
|
<br><i>HTTP/1.0 code string</i>
|
|||
|
Le <i>code</i> est un nombre de trois-digit d<>fini dans le standard HTTP. Un code de 200 est OK Les codes commen<65>ant avec 4 ou 5 indiquent des erreurs. Les codes commen<65>ant avec 3 sont des erreurs de redirection Dans ce cas la meta-donn<6E>e <b>Location</b> sp<73>cifie une nouvelle URL qui contient l'information requise.
|
|||
|
</DD>
|
|||
|
<DT><br><b>meta</b>
|
|||
|
</DT><DD>Le protocole HTTP retourne les meta-donn<6E>es qui d<>crivent les contenus de l'URL. L'<27>l<EFBFBD>ment <b>meta</b> du tableau d'<27>tat est une liste de cl<63>s et valeurs des meta-donn<6E>es Ceci dans un format utile pour l'initialisation d'un tableau qui contient les meta-donn<6E>es:
|
|||
|
array set meta $state(meta)
|
|||
|
Certaines des cl<63>s meta-donn<6E>es sont list<73>es ci-dessous, mais le standard HTTP en d<>finit plus, et les serveurs sont libres d'ajouter les leurs.
|
|||
|
<DL>
|
|||
|
<DT><br><b>Content-Type</b>
|
|||
|
</DT><DD>Le type de contenus de l'URL Les exemples inclutnt <b>text/html</b>, <b>image/gif,</b> <b>application/postscript</b> et <b>application/x-tcl</b>. </DD>
|
|||
|
<DT><br><b>Content-Length</b>
|
|||
|
</DT><DD>La taille d<>clar<61>e des contenus La taille obtenue par <b>::http::geturl</b> est disponibles comme <b>state(size)</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>Location</b>
|
|||
|
</DT><DD>Une URL alternative qui contient les donn<6E>es requises.</DD>
|
|||
|
</DL>
|
|||
|
</DD>
|
|||
|
<DT><br><b>posterror</b>
|
|||
|
</DT><DD>L'erreur, si elle existe, qui s'est produite pendant l'<27>criture du post des donn<6E>es sur le serveur.
|
|||
|
</DD>
|
|||
|
<DT><br><b>status</b>
|
|||
|
</DT><DD>Soit <b>ok</b>, en cas de succ<63>s, <b>reset</b> si r<>initialis<69> par l'utilisateur, <b>timeout</b> si un timeout s'est produit avant que la transaction soit compl<70>te, ou <A HREF="103.htm"><b>error</b></A> pour une condition d'erreur Durant la transaction cette valeur est une cha<68>ne vide.
|
|||
|
</DD>
|
|||
|
<DT><br><b>totalsize</b>
|
|||
|
</DT><DD>Un copie de la valeur<b> </b>des<b> </b>meta-donn<6E>es<b> Content-Length</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>type</b>
|
|||
|
</DT><DD>Une copie de la valeur<b> </b>des<b> </b>meta-donn<6E>es<b> Content-Type</b>.
|
|||
|
</DD>
|
|||
|
<DT><br><b>url</b>
|
|||
|
</DT><DD>L'URL requise.
|
|||
|
</DD>
|
|||
|
</DL>
|
|||
|
</div><br>
|
|||
|
<div><b>EXEMPLE</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"># Copie une URL dans un fichier et affiche les meta-donn<6E>es<br>
|
|||
|
proc ::http::copy { url file {chunk 4096} } {<br>
|
|||
|
set out [open $file w]<br>
|
|||
|
set token [geturl $url -canal $out -progress ::http::Progress \<br>
|
|||
|
-blocksize $chunk]<br>
|
|||
|
close $out<br>
|
|||
|
# Ceci finit la ligne lanc<6E> par http::Progress<br>
|
|||
|
puts stderr ""<br>
|
|||
|
upvar #0 $token state<br>
|
|||
|
set max 0<br>
|
|||
|
foreach {name value} $state (meta) {<br>
|
|||
|
if {[string longueur $name] > $max} {<br>
|
|||
|
set max [string longueur $name]<br>
|
|||
|
}<br>
|
|||
|
if {[regexp -nocase ^location$ $name]} {<br>
|
|||
|
# G<>re la redirection d'URL <br>
|
|||
|
puts stderr "Location:$value "<br>
|
|||
|
return [copy [string trim $value] $file $chunk]<br>
|
|||
|
}<br>
|
|||
|
}<br>
|
|||
|
incr max<br>
|
|||
|
foreach {name value } $ state (meta) {<br>
|
|||
|
puts [format "%-*s %s" $max $name: $value]<br>
|
|||
|
}<br>
|
|||
|
<br>
|
|||
|
return $token<br>
|
|||
|
}<br>
|
|||
|
proc ::http::Progress {args} {<br>
|
|||
|
puts -nunwline stderr . ; flush stderr<br>
|
|||
|
}<br>
|
|||
|
|
|||
|
</div><br>
|
|||
|
<div><b>VOIR EGALEMENT</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">safe(n), <A HREF="162.htm">socket</A>(n), safesock(n) </div><br>
|
|||
|
<div>Derni<EFBFBD>re r<>vision: 8.3</div>
|
|||
|
<br>
|
|||
|
<br><div ALIGN="CENTER"><A HREF="index.htm"><b>Index</b></A> <A HREF="121.htm"><b>Pr<EFBFBD>c<EFBFBD>dent</b></A> <A HREF="123.htm"><b>Suivant</b></A></div>
|
|||
|
</BODY></HTML>
|