2015-04-02 59 views
0

我有這個問題。 我寫了一個CGI代碼,它處理多行TEXTAREA元素。當 我讀取POST請求變量時,將檢索所有行。但是,當我將多行值寫入cookie並將其讀回時,我只得到第一行。我應該怎麼做呢?當在CGI程序中讀取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

告訴我們一些代碼 – clearlight 2015-04-02 13:55:01

+0

我的代碼有點雜亂無章,所以很難顯示它。 – 2015-04-02 14:08:57

+0

代碼讀取哪裏? – clearlight 2015-04-02 14:09:47

回答

0

Cookie值必須由URL編碼。這意味着你必須用;\n等字符替換它們的十六進制等價物(對於我給出的例子,它們是%3B%0A)。

下面是打印URL編碼字符串的簡單的C函數:

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