[Cheyenne] Cookie
trigram5-Jul-2011/11:59:35+2:00
La fonction set-cookie n'est pas encore implémentée.

Alors, en fouillant rapidement dans les sources de Cheyenne, je me suis dit qu'il serait possible d'utiliser le set-header. Exemple :

response/set-header 'Set-Cookie "TEST1=test1; Domain=localhost"
response/set-header 'Set-Cookie "TEST2=test2; Domain=localhost"


Mais je rencontre pas mal de difficulté à le faire fonctionner.
none6-Jul-2011/22:29:14+2:00
Voici ma page de test :

<% 
  response/set-header 'Set-Cookie "TEST1=testCookie1; Expires=Wed, 13-Jan-2021 22:23:01 GMT; HttpOnly"
  response/set-header 'Set-Cookie "TEST2=testCookie2; Expires=Wed, 13-Jan-2021 22:23:01 GMT; HttpOnly"
%>
<html>
<head>
	<title>Cheyenne Cookie test page</title>
	<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;
  }
	</script>
</head>
<body>
Try to set 2 cookies :
<br/>
TEST1 & TEST2
<br/>
<button onclick="javascript:alert(readCookie('TEST1'));">Show Cookie1</button>
<br/>
<button onclick="javascript:alert(readCookie('TEST2'));">Show Cookie2</button>
<br/>
<br/>
Headers content :
<UL><%
	foreach [name value] request/headers [
		print [<LI><B> name ":"</B> mold value </LI>]
	]
%></UL>
</body>
</html>


C'est peut-être moi qui m'y prend mal...
trigram6-Jul-2011/23:00:35+2:00
Vu avec DocKimbel : première erreur, le HttpOnly empêche de lire le cookie depuis le code Javascript. Il suffit donc d'enlever le HttpOnly pour que le bouton fonctionne. Deuxième erreur, via le response/set-header 'Set-Cookie il ne prend qu'un cookie (le dernier).
trigram7-Jul-2011/0:04:57+2:00
Il faut donc implémenter la fonction set-cookie au niveau de response pour pouvoir gérer plusieurs cookie.
trigram7-Jul-2011/15:25:09+2:00
En fait, il suffit de faire :

<%
response/set-header 'Set-Cookie "TEST1=testCookie1; Expires=Wed, 13-Jan-2021 22:23:01 GMT"
response/set-header/add 'Set-Cookie "TEST2=testCookie2; Expires=Wed, 13-Jan-2021 22:23:01 GMT"
%>

On peut mettre 2 cookies !

Cool.

Je suis en train de préparer une contribution pour Cheyenne.
Mais je n'arrive pas à faire fonctionner Cheyenne à partir des sources depuis ma machine sous Windows 7.

Ca m'éééénnnnnneeeerrrrvvvveeeee....
trigram7-Jul-2011/17:47:42+2:00
Nouvelle page de test pour les cookie :

%test-cookie.rsp
<%
  include %cookie.rsp
%>
<html>
<head>
	<title>[TEST] Cheyenne 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;
  }
	</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/>
<%
  cook: select request/content 'cookieTXT
  act: select request/content 'actionCookie
  switch act [
    "setCookie" [emit join "Setting cookie " cook set-cookie cook]
    "getCookie" [coo: get-cookie cook emit rejoin ["Getting cookie " cook " = " coo]]
    "removeCookie" [emit join "Removing cookie " cook remove-cookie cook]
  ]  
%>
<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>Cookie value</td><td><input type="TEXT" name="cookieTXT"></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> </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="cookieName"></td></tr>
<tr><td> </td><td><button name="readCookie" onclick="javascript:alert(readCookie(document.getElementsByName('cookieName')[0].value));">Read coookie in JS</button></td></tr>
</table>
</body>
</html>


et le fichier %cookie.rsp :

<%
  set-cookie: func [value [string!]] [
    response/set-header/add 'Set-Cookie value
  ]
  get-cookie: func [value [string!] /local pos cookie-value end-cookie] [
    cookie-value: none
    if not none? pos: select request/headers 'Cookie [
      end-cookie: [some ";" | end]
      parse/all pos [any [thru value [any #" "] "=" copy cookie-value to end]]
      if none? cookie-value [
        parse/all pos [any [thru value [any #" "] "=" copy cookie-value to ";"]]
      ]
    ]
    cookie-value
  ]  
  remove-cookie: func [value [string!] /local cookie] [
    if not none? cookie: get-cookie value [
      set-cookie rejoin [value "=; Expires=Mon, 1-Jan-1999 00:01:00 GMT"]
    ]
  ]
%>

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2