diff options
author | cflip <cflip@cflip.net> | 2022-09-17 11:47:23 -0600 |
---|---|---|
committer | cflip <cflip@cflip.net> | 2022-09-17 11:47:23 -0600 |
commit | e3aa12a8cfa137f65c5ca06489e1f58f0608db54 (patch) | |
tree | 7fbc3dafa53808747b7a6b0da90227bff43dc834 /src/CGIScript.cpp | |
parent | a4140573844a83eda92367ae1e7d557b0033fb4d (diff) |
Make a nice wrapper class for running CGI scripts
Diffstat (limited to 'src/CGIScript.cpp')
-rw-r--r-- | src/CGIScript.cpp | 48 |
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(); +} |