summaryrefslogtreecommitdiff
path: root/src/CGIScript.cpp
diff options
context:
space:
mode:
authorcflip <cflip@cflip.net>2022-09-17 11:47:23 -0600
committercflip <cflip@cflip.net>2022-09-17 11:47:23 -0600
commite3aa12a8cfa137f65c5ca06489e1f58f0608db54 (patch)
tree7fbc3dafa53808747b7a6b0da90227bff43dc834 /src/CGIScript.cpp
parenta4140573844a83eda92367ae1e7d557b0033fb4d (diff)
Make a nice wrapper class for running CGI scripts
Diffstat (limited to 'src/CGIScript.cpp')
-rw-r--r--src/CGIScript.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/CGIScript.cpp b/src/CGIScript.cpp
new file mode 100644
index 0000000..2394d31
--- /dev/null
+++ b/src/CGIScript.cpp
@@ -0,0 +1,48 @@
+#include "CGIScript.h"
+
+#include <cstdlib>
+#include <string>
+#include <sstream>
+
+CGIScript::CGIScript(const std::string& path, const HttpRequest& request)
+{
+ setenv("CONTENT_LENGTH", "0", true);
+ setenv("REQUEST_URI", request.uri().c_str(), true);
+ setenv("SCRIPT_NAME", path.c_str(), true);
+ setenv("SCRIPT_FILENAME", path.c_str(), true);
+ setenv("REQUEST_METHOD", "GET", true);
+ setenv("SERVER_PROTOCOL", "HTTP/1.1", true);
+ setenv("SERVER_SOFTWARE", "cfws/1.0-dev", true);
+
+ m_pipe = popen(path.c_str(), "r");
+ if (!m_pipe) {
+ perror("cfws: popen");
+ return;
+ }
+
+ m_is_open = true;
+}
+
+CGIScript::~CGIScript()
+{
+ pclose(m_pipe);
+
+ unsetenv("CONTENT_LENGTH");
+ unsetenv("REQUEST_URI");
+ unsetenv("SCRIPT_NAME");
+ unsetenv("SCRIPT_FILENAME");
+ unsetenv("REQUEST_METHOD");
+ unsetenv("SERVER_PROTOCOL");
+ unsetenv("SERVER_SOFTWARE");
+}
+
+std::string CGIScript::read_output()
+{
+ std::stringstream sstream;
+
+ char ch;
+ while ((ch = fgetc(m_pipe)) != EOF)
+ sstream << ch;
+
+ return sstream.str();
+}