summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CGIScript.cpp30
-rw-r--r--src/CGIScript.h4
2 files changed, 20 insertions, 14 deletions
diff --git a/src/CGIScript.cpp b/src/CGIScript.cpp
index 2394d31..6bc62ce 100644
--- a/src/CGIScript.cpp
+++ b/src/CGIScript.cpp
@@ -6,13 +6,14 @@
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);
+ set_environment("CONTENT_LENGTH", "0");
+ set_environment("REQUEST_URI", request.uri().c_str());
+ set_environment("PATH_INFO", request.uri().c_str());
+ set_environment("SCRIPT_NAME", path.c_str());
+ set_environment("SCRIPT_FILENAME", path.c_str());
+ set_environment("REQUEST_METHOD", "GET");
+ set_environment("SERVER_PROTOCOL", "HTTP/1.1");
+ set_environment("SERVER_SOFTWARE", "cfws/1.0-dev");
m_pipe = popen(path.c_str(), "r");
if (!m_pipe) {
@@ -27,13 +28,14 @@ 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");
+ for (auto key : m_environment_variables)
+ unsetenv(key);
+}
+
+void CGIScript::set_environment(const char* key, const char* value)
+{
+ m_environment_variables.push_back(key);
+ setenv(key, value, true);
}
std::string CGIScript::read_output()
diff --git a/src/CGIScript.h b/src/CGIScript.h
index 6e8e031..a64c55a 100644
--- a/src/CGIScript.h
+++ b/src/CGIScript.h
@@ -2,6 +2,7 @@
#include <cstdio>
#include <string>
+#include <vector>
#include "HttpRequest.h"
@@ -10,10 +11,13 @@ public:
CGIScript(const std::string& path, const HttpRequest&);
~CGIScript();
+ void set_environment(const char* key, const char* value);
bool is_open() const { return m_is_open; }
std::string read_output();
private:
FILE* m_pipe;
bool m_is_open{false};
+
+ std::vector<const char*> m_environment_variables;
};