BBS水木清华站∶精华区

发信人: xcec (money), 信区: Linux 
标  题: guestbook-->cgi.h, cgi.cpp 
发信站: BBS 水木清华站 (Mon Jan 17 13:04:30 2000) WWW-POST 
 
//cgi.h 
#ifndef CGI_H 
#define CGI_H 
 
struct NameValue { 
char *name; 
char *value; 
public: 
void decode(); 
}; 
 
struct CGI { 
int argnum; 
NameValue *namevalue; 
char *buffer; 
public: 
CGI(); 
}; 
 
#endif 
 
//cgi.cpp 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "cgi.h" 
#include "myutili.h" 
 
CGI::CGI() 

    //buffer 
    char *method = getenv("REQUEST_METHOD"); 
    if (!method) { 
        argnum = 0; 
        namevalue = NULL; 
        buffer = "\0"; 
        return; 
    } 
 
    if (0 == strcmp(method, "GET")) { //GET method 
        buffer = new char[strlen(getenv("QUERY_STRING"))+1]; 
        strcpy(buffer, getenv("QUERY_STRING")); 
    } 
    else if (0 == strcmp(method, "POST")) { //Post method 
        int length = atoi(getenv("CONTENT_LENGTH")); 
        buffer=new char[length + 1]; 
        fgets(buffer, length + 1, stdin); 
        buffer[length]='\0'; 
    } 
    else { 
        argnum = 0; 
        namevalue = NULL; 
        buffer = "\0"; 
        return; 
    } 
 
    if (0 == strlen(buffer)) { // 
        argnum=0; 
        namevalue=new NameValue[0]; 
    } 
    else { // 
        // 
        argnum=1; 
        char *p=buffer; 
        while (*p) { 
            if (*p=='&') argnum++; 
            p++; 
        } 
 
        namevalue=new NameValue[argnum]; 
        int i=0; 
        p=buffer; 
        //Name-Value pair 
        namevalue[0].name=p; 
        while (*p) { 
            if (*p=='=') { 
                *p='\0'; 
                namevalue[i].value=++p; 
            } 
            else if (*p=='&') { 
                *p='\0'; 
                namevalue[++i].name=++p; 
            } 
            else p++; 
        } 
 
        for (i = 0; i < argnum; i++) 
            namevalue[i].decode(); 
    } 

 
void NameValue::decode() 

    int i, j; 
    i=j=0; 
    while (value[i]) { 
        if (value[i] == '+') { 
            value[j++] = ' '; 
            i++; 
        } 
        else if (value[i] == '%') { 
            value[j++] = char2num(value[i+1])*16 + char2num(value[i+2]); 
            i+=3; 
        } 
        else 
            value[j++] = value[i++]; 
    } 
    value[j] = value[i]; 

 
-- 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.33.162]  

BBS水木清华站∶精华区