You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
3.8 KiB
214 lines
3.8 KiB
//
|
|
// cgi.cc
|
|
//
|
|
// cgi: Parse cgi arguments and put them in a dictionary.
|
|
//
|
|
// Part of the ht://Dig package <http://www.htdig.org/>
|
|
// Copyright (c) 1995-2004 The ht://Dig Group
|
|
// For copyright details, see the file COPYING in your distribution
|
|
// or the GNU Library General Public License (LGPL) version 2 or later
|
|
// <http://www.gnu.org/copyleft/lgpl.html>
|
|
//
|
|
// $Id: cgi.cc,v 1.9 2004/05/28 13:15:12 lha Exp $
|
|
//
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "htconfig.h"
|
|
#endif /* HAVE_CONFIG_H */
|
|
|
|
#ifdef _MSC_VER /* _WIN32 */
|
|
#include <io.h>
|
|
#endif
|
|
|
|
#include "cgi.h"
|
|
#include "htString.h"
|
|
#include "Dictionary.h"
|
|
#include "good_strtok.h"
|
|
#include "StringList.h"
|
|
#include "URL.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#ifndef _MSC_VER /* _WIN32 */
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#ifdef HAVE_STD
|
|
#include <fstream>
|
|
#ifdef HAVE_NAMESPACES
|
|
using namespace std;
|
|
#endif
|
|
#else
|
|
#include <fstream.h>
|
|
#endif /* HAVE_STD */
|
|
|
|
//*****************************************************************************
|
|
// cgi::cgi()
|
|
//
|
|
cgi::cgi()
|
|
{
|
|
init("");
|
|
}
|
|
|
|
|
|
//*****************************************************************************
|
|
// cgi::cgi(char *s)
|
|
//
|
|
cgi::cgi(char *s)
|
|
{
|
|
init(s);
|
|
}
|
|
|
|
|
|
//*****************************************************************************
|
|
// void cgi::init(char *s)
|
|
//
|
|
void
|
|
cgi::init(char *s)
|
|
{
|
|
pairs = new Dictionary;
|
|
|
|
int i;
|
|
String method(getenv("REQUEST_METHOD"));
|
|
|
|
if ((!s || !*s) && method.length() == 0)
|
|
{
|
|
//
|
|
// Interactive mode
|
|
//
|
|
query = 1;
|
|
return;
|
|
}
|
|
query = 0;
|
|
String results;
|
|
|
|
if (s && *s && method.length() == 0)
|
|
{
|
|
results = s;
|
|
}
|
|
else if (strcmp((char*)method, "GET") == 0)
|
|
{
|
|
results = getenv("QUERY_STRING");
|
|
}
|
|
else
|
|
{
|
|
int n;
|
|
char *buf;
|
|
|
|
buf = getenv("CONTENT_LENGTH");
|
|
if (!buf || !*buf || (n = atoi(buf)) <= 0)
|
|
return; // null query
|
|
buf = new char[n + 1];
|
|
int r, i = 0;
|
|
while (i < n && (r = read(0, buf+i, n-i)) > 0)
|
|
i += r;
|
|
buf[i] = '\0';
|
|
results = buf;
|
|
delete [] buf;
|
|
}
|
|
|
|
//
|
|
// Now we need to split the line up into name/value pairs
|
|
//
|
|
StringList list(results, "&;");
|
|
|
|
//
|
|
// Each name/value pair now needs to be added to the dictionary
|
|
//
|
|
for (i = 0; i < list.Count(); i++)
|
|
{
|
|
char *name = good_strtok(list[i], '=');
|
|
String value(good_strtok(NULL, '\n'));
|
|
value.replace('+', ' ');
|
|
decodeURL(value);
|
|
String *str = (String *) pairs->Find(name);
|
|
if (str)
|
|
{
|
|
//
|
|
// Entry was already there. Append it to the string.
|
|
//
|
|
str->append('\001');
|
|
str->append(value);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// New entry. Add a new string
|
|
//
|
|
pairs->Add(name, new String(value));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//*****************************************************************************
|
|
// cgi::~cgi()
|
|
//
|
|
cgi::~cgi()
|
|
{
|
|
delete pairs;
|
|
}
|
|
|
|
|
|
//*****************************************************************************
|
|
// char *cgi::operator [] (char *name)
|
|
//
|
|
char *cgi::operator [] (char *name)
|
|
{
|
|
return get(name);
|
|
}
|
|
|
|
|
|
//*****************************************************************************
|
|
// char *cgi::get(char *name)
|
|
//
|
|
char *cgi::get(char *name)
|
|
{
|
|
String *str = (String *) (*pairs)[name];
|
|
if (str)
|
|
return str->get();
|
|
else
|
|
{
|
|
if (query)
|
|
{
|
|
char buffer[1000];
|
|
cerr << "Enter value for " << name << ": ";
|
|
cin.getline(buffer, sizeof(buffer));
|
|
pairs->Add(name, new String(buffer));
|
|
str = (String *) (*pairs)[name];
|
|
return str->get();
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
//*****************************************************************************
|
|
// int cgi::exists(char *name)
|
|
//
|
|
int
|
|
cgi::exists(char *name)
|
|
{
|
|
return pairs->Exists(name);
|
|
}
|
|
|
|
//*****************************************************************************
|
|
// char *cgi::path()
|
|
//
|
|
char *cgi::path()
|
|
{
|
|
static char buffer[1000] = "";
|
|
|
|
if (query)
|
|
{
|
|
if (*buffer)
|
|
return buffer;
|
|
cerr << "Enter PATH_INFO: ";
|
|
cin.getline(buffer, sizeof(buffer));
|
|
return buffer;
|
|
}
|
|
return getenv("PATH_INFO");
|
|
}
|
|
|
|
|