| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 21826 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.http.cookies">
- <title>Zend_Http_Cookie and Zend_Http_CookieJar</title>
- <sect2 id="zend.http.cookies.introduction">
- <title>Introduction</title>
- <para>
- <classname>Zend_Http_Cookie</classname>, comme son nom l'indique, est une classe
- qui représente un cookie <acronym>HTTP</acronym>. Elle propose des méthodes d'analyse de la chaîne de
- réponse <acronym>HTTP</acronym>, de collection des cookies, et d'accès à leurs propriétés. Il est aussi
- possible avec cette classe de vérifier si les paramètres d'un cookie correspondent à un
- scénario précis, par exemple une <acronym>URL</acronym> spécifique, un certain temps d'expiration, la
- présence ou non de <acronym>HTTPS</acronym>, etc...
- </para>
- <para>
- <classname>Zend_Http_CookieJar</classname> est un objet utilisé en général avec
- <classname>Zend_Http_Client</classname> pour fournir une collection d'objets
- <classname>Zend_Http_Cookie</classname>. L'idée principale est d'attacher un objet
- <classname>Zend_Http_CookieJar</classname> à un objet
- <classname>Zend_Http_Client</classname>, de manière à ce que toutes les requêtes de
- celui-ci utilisent les cookies présents dans l'objet <code>CookieJar</code>. Ainsi,
- lorsque le client enverra une autre requête, il demandera à l'objet
- <code>CookieJar</code> tous les cookies concernant cette requête. Ceci est très pratique
- dans des cas comme envoyer un cookie de session entre plusieurs requêtes <acronym>HTTP</acronym>
- successives. De plus, l'objet <classname>Zend_Http_CookieJar</classname> peut être
- sérialisé et mis en session.
- </para>
- </sect2>
- <sect2 id="zend.http.cookies.cookie.instantiating">
- <title>Instancier des objets Zend_Http_Cookie</title>
- <para>
- L'instanciation se fait de deux manières différentes : <itemizedlist>
- <listitem>
- <para>
- Via son constructeur, de cette façon : <code>new
- Zend_Http_Cookie(string $name, string $value, string $domain, [int $expires,
- [string $path, [boolean $secure]]]);</code>
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <varname>$name</varname>: Nom du cookie (par ex. "PHPSESSID")
- (requis)
- </para>
- </listitem>
- <listitem>
- <para><varname>$value</varname>: La valeur du cookie (requis)</para>
- </listitem>
- <listitem>
- <para>
- <varname>$domain</varname>: Le domaine de validité du cookie (par
- ex. ".example.com") (requis)
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$expires</varname>: Temps d'expiration du cookie, un
- timestamp UNIX (optionnel, défaut à <constant>NULL</constant>). Si non
- fourni, le cookie sera considéré comme "cookie de session", avec pas
- de temps d'expiration.
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$path</varname>: Chemin de validité du cookie, par ex.
- "/foo/bar/" (optionnel, défaut : "/")
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$secure</varname>: Booléen, Si le cookie doit être transmis
- via connexion sécurisée (HTTPS) uniquement (optionnel, défaut à
- <constant>FALSE</constant>)
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- En appelant la méthode statique <methodname>fromString($cookieStr, [$refUri, [$encodeValue]])</methodname>, avec une
- chaîne de caractères représentant un cookie tel que défini dans les en-têtes
- <acronym>HTTP</acronym> "Set-Cookie" (réponse) ou "Cookie" (requête). Dans ce cas la valeur du
- cookie doit être encodée. Lorsque la chaîne de caractères représentant un
- cookie ne comporte pas de partie "domain", vous devez fournir alors un <acronym>URI</acronym>
- selon lequel le cookie cherchera son domaine et son chemin.
- </para>
- <para>
- La méthode <code>fromString</code> accepte les paramètres suivants :
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <varname>$cookieStr</varname>: a cookie string as represented in the
- 'Set-Cookie' <acronym>HTTP</acronym> response header or 'Cookie'
- <acronym>HTTP</acronym> request header (required)
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$refUri</varname>: a reference <acronym>URI</acronym> according to which the cookie's domain and path
- will be set. (optional, defaults to parsing the value from the $cookieStr)
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$encodeValue</varname>: If the value should be passed through urldecode. Also effects the cookie's
- behavior when being converted back to a cookie string. (optional, defaults to true)
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist> <example id="zend.http.cookies.cookie.instantiating.example-1">
- <title>Créer un objet Zend_Http_Cookie</title>
- <programlisting language="php"><![CDATA[
- // D'abord, en utilisant son constructeur.
- // ce cookie expirera dans 2 heures
- $cookie = new Zend_Http_Cookie('foo',
- 'bar',
- '.example.com',
- time() + 7200,
- '/path');
- // En prenant l'en-tête de réponse HTTP 'Set-Cookie'
- // Ce cookie n'expirera pas et ne sera envoyé que
- // sur des connexions sécurisées
- $cookie = Zend_Http_Cookie::fromString(
- 'foo=bar; domain=.example.com; path=/path; secure');
- // Si le domaine n'est pas présent, spécifiez le manuellement :
- $cookie = Zend_Http_Cookie::fromString(
- 'foo=bar; secure;', 'http://www.example.com/path');
- ]]></programlisting>
- </example> <note>
- <para>
- Lorsque vous utilisez la méthode statique
- <methodname>Zend_Http_Cookie::fromString()</methodname>, veillez à fournir un
- cookie <acronym>URL</acronym> encodé (tel que c'est le cas dans les en-têtes <acronym>HTTP</acronym>). Avec le
- constructeur en revanche, il est nécessaire d'utiliser une valeur non
- encodée.
- </para>
- </note>
- </para>
- <para>
- La manipulation inverse est possible. Grâce à la méthode
- <methodname>__toString()</methodname>, vous pouvez récupérer une chaîne représentant le cookie, à
- partir de l'objet <classname>Zend_Http_Cookie</classname>. La chaîne alors retournée est
- la même que celle utilisée dans l'en-tête HTTP "Cookie", à savoir une chaîne encodée,
- terminée par un point-virgule (;) : <example
- id="zend.http.cookies.cookie.instantiating.example-2">
- <title>Passer de l'objet Zend_Http_Cookie à la chaîne</title>
- <programlisting language="php"><![CDATA[
- // Création d'un nouveau cookie
- $cookie = new Zend_Http_Cookie('foo',
- 'two words',
- '.example.com',
- time() + 7200,
- '/path');
- // Va afficher 'foo=two+words;' :
- echo $cookie->__toString();
- // Ceci est la même chose
- echo (string) $cookie;
- // En PHP 5.2 et plus, ceci fonctionne aussi :
- echo $cookie;
- ]]></programlisting>
- </example>
- </para>
- </sect2>
- <sect2 id="zend.http.cookies.cookie.accessors">
- <title>Zend_Http_Cookie méthodes getter</title>
- <para>
- Une fois l'objet <classname>Zend_Http_Cookie</classname> crée, il existe des
- méthodes 'getter' pour accéder aux différentes propriétés du cookie : <itemizedlist>
- <listitem>
- <para><code>string getName()</code>: Retourne le nom du cookie</para>
- </listitem>
- <listitem>
- <para>
- <code>string getValue()</code>: Retourne la valeur réelle (décodée),
- du cookie
- </para>
- </listitem>
- <listitem>
- <para><code>string getDomain()</code>: Retourne le domaine du cookie</para>
- </listitem>
- <listitem>
- <para>
- <code>string getPath()</code>: Retourne le chemin du cookie, par
- défaut '/'
- </para>
- </listitem>
- <listitem>
- <para>
- <code>int getExpiryTime()</code>: Retourne la date d'expiration, comme
- timestamp UNIX. Si pas de date, <constant>NULL</constant> sera retourné.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Voici encore quelques méthodes de vérifications booléennes : <itemizedlist>
- <listitem>
- <para>
- <code>boolean isSecure()</code>: Regarde si le cookie est un cookie
- sécurisé. Si c'est le cas, les navigateurs ont pour instruction de ne les
- envoyer que sur des connexions sécurisées (HTTPS).
- </para>
- </listitem>
- <listitem>
- <para>
- <code>boolean isExpired(int $time = null)</code>: Vérifie si le cookie
- est expirés. Si il n'y a pas de date d'expiration, cette méthode retournera
- toujours <constant>TRUE</constant>. Si <varname>$time</varname> est fourni, alors la date
- du cookie sera comparée à ce <varname>$time</varname>, et non plus au temps
- actuel.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>boolean isSessionCookie()</code>: Vérifie si le cookie est un
- cookie dit 'de session'. C'est un cookie sans date d'expiration, sensé être
- détruit à la fin de la session de travail actuelle (à la fermeture du
- navigateur).
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- <example id="zend.http.cookies.cookie.accessors.example-1">
- <title>Utilisation des méthodes getter de Zend_Http_Cookie</title>
- <programlisting language="php"><![CDATA[
- // Création d'un cookie
- $cookie =
- Zend_Http_Cookie::fromString('foo=two+words;'
- . ' domain=.example.com;'
- . ' path=/somedir;'
- . 'secure;'
- . 'expires=Wednesday, 28-Feb-05 20:41:22 UTC');
- echo $cookie->getName(); // Affiche 'foo'
- echo $cookie->getValue(); // Affiche 'two words'
- echo $cookie->getDomain(); // Affiche '.example.com'
- echo $cookie->getPath(); // Affiche '/'
- echo date('Y-m-d', $cookie->getExpiryTime());
- // Affiche '2005-02-28'
- echo ($cookie->isExpired() ? 'Yes' : 'No');
- // Affiche 'Yes'
- echo ($cookie->isExpired(strtotime('2005-01-01') ? 'Yes' : 'No');
- // Affiche 'No'
- echo ($cookie->isSessionCookie() ? 'Yes' : 'No');
- // Affiche 'No'
- ]]></programlisting>
- </example>
- </para>
- </sect2>
- <sect2 id="zend.http.cookies.cookie.matching">
- <title>Zend_Http_Cookie: Correspondance de scénario</title>
- <para>
- La vraie valeur ajoutée d'un objet <classname>Zend_Http_Cookie</classname> est sa
- méthode match(). Celle-ci teste le cookie en rapport avec un scénario <acronym>HTTP</acronym>, pour savoir
- ci celui-ci doit être attaché à la requête ou pas. La syntaxe est la suivante :
- <code>boolean Zend_Http_Cookie->match(mixed $uri, [boolean $matchSessionCookies, [int
- $now]]);</code> <itemizedlist>
- <listitem>
- <para>
- <code>mixed $uri</code> : un objet Zend_Uri_Http avec un domaine et un
- chemin à vérifier. Une chaîne représentant une <acronym>URL</acronym> peut aussi être utilisée.
- Le cookie sera déclaré bon si le schéma de l'URL (HTTP ou <acronym>HTTPS</acronym>) correspond,
- ainsi que le chemin (path).
- </para>
- </listitem>
- <listitem>
- <para>
- <code>boolean $matchSessionCookies</code> : établit ou non une
- correspondance pour les cookies dits de session. Par défaut :
- <constant>TRUE</constant>. Si mis à <constant>FALSE</constant>, alors les cookies sans date
- d'expiration seront ignorés du processus.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>int $now</code> : timestamp UNIX passé pour vérifier
- l'expiration du cookie. Si non spécifié, alors le temps actuel sera pris en
- considération.
- </para>
- </listitem>
- </itemizedlist> <example id="zend.http.cookies.cookie.matching.example-1">
- <title>Correspondance de cookies</title>
- <programlisting language="php"><![CDATA[
- // Création de l'objet cookie - d'abord un cookie sécurisé
- $cookie = Zend_Http_Cookie::fromString(
- 'foo=two+words; domain=.example.com; path=/somedir; secure;');
- $cookie->match('https://www.example.com/somedir/foo.php');
- // Retournera true
- $cookie->match('http://www.example.com/somedir/foo.php');
- // Retournera false, car la connexion n'est pas sécurisée
- $cookie->match('https://otherexample.com/somedir/foo.php');
- // Retournera false, le domaine est incorrect
- $cookie->match('https://example.com/foo.php');
- // Retournera false, le chemin est incorrect
- $cookie->match('https://www.example.com/somedir/foo.php', false);
- // Retournera false, car les cookies de session ne sont pas pris en compte
- $cookie->match('https://sub.domain.example.com/somedir/otherdir/foo.php');
- // Retournera true
- // Création d'un autre objet cookie - cette fois non sécurisé,
- // expire dans 2 heures
- $cookie = Zend_Http_Cookie::fromString(
- 'foo=two+words; domain=www.example.com; expires='
- . date(DATE_COOKIE, time() + 7200));
- $cookie->match('http://www.example.com/');
- // Retournera true
- $cookie->match('https://www.example.com/');
- // Will return true - non secure cookies can go
- // over secure connexions as well!
- $cookie->match('http://subdomain.example.com/');
- // Retournera false, domaine incorrect
- $cookie->match('http://www.example.com/', true, time() + (3 * 3600));
- // Retournera false, car nous avons rajouter 3 heures au temps actuel
- ]]></programlisting>
- </example>
- </para>
- </sect2>
- <sect2 id="zend.http.cookies.cookiejar">
- <title>Classe Zend_Http_CookieJar : Instanciation</title>
- <para>
- Dans la plupart des cas, il ne sera pas nécessaire d'instancier soi-même un objet
- <classname>Zend_Http_CookieJar</classname>. Si vous voulez un conteneur de cookie
- (CookieJar) attaché à votre objet <classname>Zend_Http_Client</classname>, appelez
- simplement <classname>Zend_Http_Client->setCookieJar()</classname>, et un nouveau
- conteneur, vide, y sera attaché. Plus tard, vous pourrez utiliser la méthode
- <classname>Zend_Http_Client->getCookieJar()</classname>, pour récupérer ce
- conteneur.
- </para>
- <para>
- Si vous voulez tout de même instancier manuellement un objet
- <code>CookieJar</code>, appelez son constructeur avec "<code>new
- Zend_Http_CookieJar()</code>", sans paramètres. Sinon il est possible aussi de passer
- par la méthode statique <methodname>Zend_Http_CookieJar::fromResponse()</methodname> qui
- prend, elle, deux paramètres : un objet <classname>Zend_Http_Response</classname> et un
- <acronym>URI</acronym> de référence (un objet <classname>Zend_Uri_Http</classname> ou une chaîne). Cette
- méthode retourne alors un objet <classname>Zend_Http_CookieJar</classname> qui
- contiendra les cookies de la réponse <acronym>HTTP</acronym> passée. L'URI de référence servira à remplir
- les paramètres "domain" et "path" des cookies, si jamais ils n'ont pas été définis dans
- les en-têtes "Set-Cookie".
- </para>
- </sect2>
- <sect2 id="zend.http.cookies.cookiejar.adding_cookies">
- <title>Ajouter des cookies à un objet Zend_Http_CookieJar</title>
- <para>
- En temps normal, c'est l'objet <classname>Zend_Http_Client</classname> qui
- ajoutera des cookies dans l'objet <code>CookieJar</code> que vous lui aurez attaché.
- Vous pouvez en ajouter manuellement aussi : <itemizedlist>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar->addCookie($cookie[,
- $ref_uri])</classname>: Ajoute un cookie au conteneur (Jar). $cookie peut
- être soit un objet <classname>Zend_Http_Cookie</classname>, soit une chaîne
- qui sera alors convertie de manière automatique en objet cookie. Si vous
- passez une chaîne, alors vous devriez aussi passer le paramètre $ref_uri qui
- représente l'URI de référence pour déterminer les paramètres "domain" et
- "path" du cookie.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar->addCookiesFromResponse($response,
- $ref_uri)</classname>: Ajoute tous les cookies présents dans une réponse
- <acronym>HTTP</acronym> au conteneur. La réponse <acronym>HTTP</acronym> doit être un objet
- <classname>Zend_Http_Response</classname> contenant au moins un en-tête
- "Set-Cookie". <classname>$ref_uri</classname> est un <acronym>URI</acronym> (un objet
- Zend_Uri_Http ou une chaîne), servant de référence pour remplir les
- paramètres du cookie "domain" et "path", si ceux-ci ne sont pas trouvés dans
- la réponse.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
- <sect2 id="zend.http.cookies.cookiejar.getting_cookies">
- <title>Récupérer les cookies présents dans un objet Zend_Http_CookieJar</title>
- <para>
- Comme pour l'ajout de cookies, en théorie, vous n'aurez pas besoin de récupérer
- des cookies du conteneur, car l'objet <classname>Zend_Http_Client</classname> se
- chargera de les gérer lui-même et de les envoyer dans les bonnes requêtes. Cependant, il
- existe des méthodes pour récupérer des cookies depuis un conteneur (Jar) :
- <methodname>getCookie()</methodname>, <methodname>getAllCookies()</methodname>, et
- <methodname>getMatchingCookies()</methodname>. De plus, itérer sur le CookieJar vous permettra d'en
- extraire tous les objets <classname>Zend_Http_Cookie</classname>.
- </para>
- <para>
- Il est important de noter que chacune de ces trois méthodes, prend un paramètre
- spécial destiné à déterminer le type que chaque méthode retournera. Ce paramètre peut
- avoir 3 valeurs: <itemizedlist>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar::COOKIE_OBJECT</classname>: Retourne un
- objet <classname>Zend_Http_Cookie</classname>. Si plus d'un cookie devait
- être retourné, il s'agira alors d'un tableau d'objets cookie.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar::COOKIE_STRING_ARRAY</classname>:
- Retourne les cookies comme des chaînes de caractères dans un format
- "foo=bar", correspondant au format de l'en-tête de requête <acronym>HTTP</acronym> "Cookie". Si
- plus d'un cookie devait être retourné, il s'agira alors d'un tableau de
- chaînes.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar::COOKIE_STRING_CONCAT</classname>:
- Similaire à COOKIE_STRING_ARRAY, mais si plusieurs cookies devaient être
- retournés, alors il ne s'agira plus d'un tableau, mais d'une chaîne
- concaténant tous les cookies, séparés par des point-virgule (;). Ceci est
- très utile pour passer tous les cookies d'un coup, dans l'en-tête <acronym>HTTP</acronym>
- "Cookie".
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Voici la structure des méthodes de récupération des cookies : <itemizedlist>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar->getCookie($uri, $cookie_name[,
- $ret_as])</classname>: Retourne un cookie depuis le conteneur, selon son <acronym>URI</acronym>
- (domain et path), et son nom. <varname>$uri</varname> est un objet
- <classname>Zend_Uri_Http</classname> ou une chaîne. $cookie_name est une
- chaîne identifiant le cookie en question. $ret_as spécifie le type de
- retour, comme vu plus haut (par défaut COOKIE_OBJECT).
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar->getAllCookies($ret_as)</classname>:
- Retourne tous les cookies du conteneur. $ret_as spécifie le type de retour,
- comme vu plus haut (par défaut COOKIE_OBJECT).
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Http_CookieJar->getMatchingCookies($uri[,
- $matchSessionCookies[, $ret_as[, $now]]])</classname>: Retourne tous les
- cookies ayant une correspondance pour un scénario donné, à savoir un <acronym>URI</acronym> et
- une date d'expiration. <itemizedlist>
- <listitem>
- <para>
- <varname>$uri</varname> est soit un objet Zend_Uri_Http soit une
- chaîne.
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$matchSessionCookies</varname> est un booléen désignant
- si les cookies de session, c'est à dire sans date d'expiration,
- doivent être analysés aussi pour établir une correspondance. Par
- défaut : <constant>TRUE</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$ret_as</varname> spécifie le type de retour, comme vu
- plus haut (par défaut COOKIE_OBJECT).
- </para>
- </listitem>
- <listitem>
- <para>
- <varname>$now</varname> est un entier représentant un timestamp
- UNIX à considérer comme 'maintenant'. Ainsi tous les cookies
- expirant avant ce temps là, ne seront pas pris en compte. Si
- vous ne spécifiez pas ce paramètre, alors c'est le temps actuel
- qui sera pris comme référence.
- </para>
- </listitem>
- </itemizedlist> Vous pouvez en apprendre plus sur la correspondance des
- cookies ici : <xref linkend="zend.http.cookies.cookie.matching" />.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
- </sect1>
|