CGI程序读取cookie时,只取回第一行
When reading cookie in CGI program, only the first line is retrieved
我有这个问题。
我写了一个 CGI 代码,它处理多行 TEXTAREA 元素。什么时候
我读了 POST 请求变量,所有的行都被检索了。但是当我将多行值写入 cookie 然后再读回时,我只得到第一行。我该怎么办?
void
write_ to_cookie(char *name,
char *value,
char *expires,
char *path,
char *domain,
int secure) {
printf("Set-Cookie: %s=%s;", name, value);
if (expires) {
printf(" EXPIRES=%s;", expires);
}
if (path) {
printf(" PATH=%s;", path);
}
if (domain) {
printf(" DOMAIN=%s;", domain);
}
if (secure) {
printf(" SECURE");
}
printf("\n");
}
要读取 cookie 和请求,我使用基于 strtok
的相同函数。它在处理 POST 请求时效果很好,但是对于 Cookie 它只能看到第一行
static LIST *lparse(char *str, char *sep){
//str is 'req1=val1;req2=val2', sep is ';'
if (!str || !sep) {
return NULL;
}
LIST *cp = NULL;
char *bfr = sdupl(str);
char *tok = strtok(bfr, sep);
while (tok) {
cp = ladd(cp, sextrkey(tok), sextrval(tok));
tok = strtok(NULL, sep);
}
return cp;
}
Cookie 值必须经过 URL 编码。这意味着您必须将 ;
和 \n
等字符替换为它们的十六进制等效字符(对于我给出的示例,它们是 %3B
和 %0A
)。
这是一个简单的 C 函数,用于打印 URL 编码的字符串:
#include <string.h>
void print_url_encoded(char *s) {
int c;
while ((c=*s) != '[=10=]') {
if (c<33 || c>126 || strchr("!\"*%'();:@&=+$,/?#[]",*s)) {
printf("%%%02X",c & 0xff);
}
else {
putchar(c);
}
s++;
}
}
然后,而不是
printf("Set-Cookie: %s=%s;", name, value);
使用此代码:
printf("Set-Cookie: %s=", name);
print_url_encoded(value);
putchar(';');
您还需要一个 URL 解码例程来处理从客户端发回的 cookie 值。
我有这个问题。 我写了一个 CGI 代码,它处理多行 TEXTAREA 元素。什么时候 我读了 POST 请求变量,所有的行都被检索了。但是当我将多行值写入 cookie 然后再读回时,我只得到第一行。我该怎么办?
void
write_ to_cookie(char *name,
char *value,
char *expires,
char *path,
char *domain,
int secure) {
printf("Set-Cookie: %s=%s;", name, value);
if (expires) {
printf(" EXPIRES=%s;", expires);
}
if (path) {
printf(" PATH=%s;", path);
}
if (domain) {
printf(" DOMAIN=%s;", domain);
}
if (secure) {
printf(" SECURE");
}
printf("\n");
}
要读取 cookie 和请求,我使用基于 strtok
的相同函数。它在处理 POST 请求时效果很好,但是对于 Cookie 它只能看到第一行
static LIST *lparse(char *str, char *sep){
//str is 'req1=val1;req2=val2', sep is ';'
if (!str || !sep) {
return NULL;
}
LIST *cp = NULL;
char *bfr = sdupl(str);
char *tok = strtok(bfr, sep);
while (tok) {
cp = ladd(cp, sextrkey(tok), sextrval(tok));
tok = strtok(NULL, sep);
}
return cp;
}
Cookie 值必须经过 URL 编码。这意味着您必须将 ;
和 \n
等字符替换为它们的十六进制等效字符(对于我给出的示例,它们是 %3B
和 %0A
)。
这是一个简单的 C 函数,用于打印 URL 编码的字符串:
#include <string.h>
void print_url_encoded(char *s) {
int c;
while ((c=*s) != '[=10=]') {
if (c<33 || c>126 || strchr("!\"*%'();:@&=+$,/?#[]",*s)) {
printf("%%%02X",c & 0xff);
}
else {
putchar(c);
}
s++;
}
}
然后,而不是
printf("Set-Cookie: %s=%s;", name, value);
使用此代码:
printf("Set-Cookie: %s=", name);
print_url_encoded(value);
putchar(';');
您还需要一个 URL 解码例程来处理从客户端发回的 cookie 值。