Documentation‎ > ‎Articles‎ > ‎

Gestion des Cookie sous Cheyenne

publié le 8 juil. 2011 à 04:03 par REBOL FRANCE   [ mis à jour : 28 déc. 2011 à 06:40 ]

Il existe dans la documentation de Cheyenne (RSP API) une fonction set-cookie mais qui n'est malheureusement pas encore implémentée (pour le moment ;)).

Pour ce faire, voici comment gérer les cookies dans Cheyenne simplement : il suffit de créer un librairie externalisé du type %cookie.rsp et de l'inclure dans la page RSP où vous en aurez besoin :

<%
  set-cookie: func [
        name [string!]
        value [string! unset!]
        /expires expires-value [string! unset!]
        /max-age max-age-value [string! unset!]
        /domain domain-value [string! unset!]
        /path path-value [string! unset!]
        /secure
        /http-only
        /local cookie-value
    ] [
        cookie-value: rejoin [name "=" value]                     
        if expires [cookie-value: rejoin [cookie-value ";Expires=" expires-value " "]]
        if max-age [cookie-value: rejoin [cookie-value ";Max-Age=" max-age-value " "]]
        if domain [cookie-value: rejoin [cookie-value ";Domain=" domain-value " "]]
        if path [cookie-value: rejoin [cookie-value ";Path=" path-value " "]]
        if secure [cookie-value: rejoin [cookie-value ";Secure "]]
        if http-only [cookie-value: rejoin [cookie-value ";HttpOnly "]]
        response/set-header/add 'Set-Cookie cookie-value
    ]
 
    get-cookie: func [
        name [string!]
        /local pos cookie-value
    ] [
        if pos: select request/headers 'Cookie [
            parse/all pos [
                any [
                    thru name [any #" "] "=" copy cookie-value [to #";" | to end]       
                ]
            ]
        ]
        cookie-value
    ]

    remove-cookie: func [name [string!] /local cookie] [
        if cookie: get-cookie name [
            set-cookie/expires name "" "Mon, 1-Jan-1999 00:01:00 GMT"
        ]
    ]

%>

Vous aurez désormais à votre disposition 3 fonctions pour gérer les cookies :
  • set-cookie : qui vous permettra de stocker un cookie (attention cette fonction attend la chaîne de caractère complète de création du cookie et n'offre pas un micro DSL pour assister cette création)
  • get-cookie : qui renvoi la valeur du cookie stocké
  • remove-cookie : qui supprime le cookie spécifié par sa clé

Voici une page de test vous permettant de réaliser les 3 opérations avec en plus un exemple vous offrant la possibilité de lire un cookie à partir du JavaScript (à condition que ce dernier ne soit pas déclaré en HttpOnly, dans ce cas le cookie n'est pas accessible depuis JS).

<%
  include %cookie.rsp
%>
<html>
<head>
    <title>[SANDBOX] Cheyenne's Cookie</title>
    <style>
    body {font-family:verdana, arial, Helvetica, sans-serif;  font-size:11px; margin:25px; background:#fff repeat-x}
    </style>
    <script language="Javascript">
    function readCookie(name) {
      var nameEQ = name + "=";
      var ca = document.cookie.split(';');
      for(var i=0;i < ca.length;i++) {
          var c = ca[i];
          while (c.charAt(0)==' ') c = c.substring(1,c.length);
          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
      }
      return null;
  }
  function readCookie2(name) {
      return document.cookie;
  }
    </script>
</head>
<body>
<b  style="font-family:verdana, arial, Helvetica, sans-serif; font-size:12px;">Unit Test Page for Cookie</b>
<br/>
<br/>
request/headers content :
<ul>
<%
    foreach [name value] request/headers [
        print [<LI><B> name ":"</B> mold value </LI>]
    ]   
%>
</ul>
<br/>
request/content content :
<ul>
<%
    foreach [name value] request/content [
        print [<LI><B> name ":"</B> mold value </LI>]
    ]   
%>
</ul>
<br/>
Result of Cheyenne :
<br/>
<%
  cookName: select request/content 'cookieName
  cookValue: select request/content 'cookieValue
  cookExpires: select request/content 'cookieExpires
  cookMaxAge: select request/content 'cookieMaxAge
  cookDomain: select request/content 'cookieDomain
  cookPath: select request/content 'cookiePath
  act: select request/content 'actionCookie
  switch act [
    "setCookie" [emit join "Setting cookie " cookName set-cookie/expires/max-age/domain/path cookName cookValue cookExpires cookMaxAge cookDomain cookPath]
    "getCookie" [coo: get-cookie cookName emit rejoin ["Getting cookie " cookName " = " coo]]
    "removeCookie" [emit join "Removing cookie " cookName remove-cookie cookName]
  ]
%>
<br/>
<br/>
Exemple of cookie: "TEST1=testCookie1; Expires=Wed, 13-Jan-2021 22:23:01 GMT"
<br/>
<br/>
<table border="0" style="font-family:verdana, arial, Helvetica, sans-serif; font-size:11px;">
<form method="POST" action="test-cookie.rsp">
<tr><td align="center">Cookie</td></tr>
<tr><td>Name</td><td><input type="TEXT" name="cookieName"></td></tr>
<tr><td>Value</td><td><input type="TEXT" name="cookieValue"></td></tr>
<tr><td>Expires</td><td><input type="TEXT" name="cookieExpires"></td></tr>
<tr><td>Max-Age</td><td><input type="TEXT" name="cookieMaxAge"></td></tr>
<tr><td>Domain</td><td><input type="TEXT" name="cookieDomain"></td></tr>
<tr><td>Path</td><td><input type="TEXT" name="cookiePath"></td></tr>
<tr><td>Action</td><td>
<select name="actionCookie">
    <option value="none"></option>
    <option value="setCookie">Set Cookie</option>
    <option value="getCookie">Get Cookie</option>
    <option value="removeCookie">Remove Cookie</option>
</select>   
<tr><td>&nbsp;</td><td><input type="SUBMIT" value="Validate"></td></tr>
</form>
</table>
<br/>
Cookie in JavaScript :
<br/>
<br/>
<table border="0" style="font-family:verdana, arial, Helvetica, sans-serif; font-size:11px;">
<tr><td>Cookie's name</td><td><input type="TEXT" name="cookieNameJS"></td></tr>
<tr><td>&nbsp;</td><td><button name="readCookie" onclick="javascript:alert(readCookie(document.getElementsByName('cookieNameJS')[0].value));">Read coookie in JS</button></td></tr>
</table>
</body>
</html>


En espérant ce petit palliatif vous sera utile pour vos développement avec Cheyenne.

Nicolas



ċ
cookie.rsp
(1k)
REBOL FRANCE,
28 déc. 2011 à 06:41
ċ
test-cookie.rsp
(3k)
REBOL FRANCE,
28 déc. 2011 à 06:41
Comments