summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htcommon/cgi.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htcommon/cgi.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htcommon/cgi.cc213
1 files changed, 213 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htcommon/cgi.cc b/debian/htdig/htdig-3.2.0b6/htcommon/cgi.cc
new file mode 100644
index 00000000..557d90ee
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htcommon/cgi.cc
@@ -0,0 +1,213 @@
+//
+// 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");
+}
+
+