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 值。