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水木清华站∶精华区