在CGI程序中读取cookie时,只检索第一行

时间:2015-04-02 13:54:15

标签: c cgi

我有这个问题。 我编写了一个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;
}

1 个答案:

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