我有这个问题。 我编写了一个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;
}
答案 0 :(得分:0)
Cookie值必须是URL编码的。这意味着您必须将;
和\n
等字符替换为其十六进制等值(我给出的示例为%3B
和%0A
)。
这是一个简单的C函数,用于打印URL编码的字符串:
#include <string.h>
void print_url_encoded(char *s) {
int c;
while ((c=*s) != '\0') {
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值。