tstring FilterSubstitution(tstring aString) { tstring result = aString; tstring::size_type start = 0, end = tstring::npos; TCHAR *envData; while (true) { start = result.find(tstring::value_type('$'), start); if (start == tstring::npos) { break; } end = result.find(tstring::value_type('$'), start + 1); if (end == tstring::npos) { break; } // Try to substitute $APPDIR$ tstring variable = result.substr(start + 1, end - start - 1); if (variable == _T("APPDIR")) { tstring appdir = GetAppResoucesDirectory(); DebugMessage("AppDir: %s", appdir.c_str()); result.replace(start, end-start+1, appdir); start += appdir.length(); continue; } // Try to substitute $XXX$ with environment variable %DISTHELPER_XXX% tstring envName(_T("DISTHELPER_")); envName.append(variable); envData = _tgetenv(envName.c_str()); if (envData && *envData) { tstring envValue(envData); DebugMessage("Environment %s: %s", envName.c_str(), envValue.c_str()); result.replace(start, end-start+1, envValue.c_str()); start += envValue.length(); continue; } // Try to substitute $XXX$ with environment variable %XXX% envData = _tgetenv(variable.c_str()); if (envData && *envData) { tstring envValue(envData); DebugMessage("Environment %s: %s", envName.c_str(), envValue.c_str()); result.replace(start, end-start+1, envValue.c_str()); start += envValue.length(); continue; } start = end + 1; } return result; }
std::string HTTPRequest::envValue(const std::string& name) const { if (name == "CONTENT_TYPE") { return headerValue("Content-Type"); } else if (name == "CONTENT_LENGTH") { return headerValue("Content-Length"); } else if (name == "SERVER_SIGNATURE") { return "<address>Wt httpd Server (" + envValue("SERVER_SOFTWARE") + ")</address>"; } else if (name == "SERVER_SOFTWARE") { return "Wthttpd/" + boost::lexical_cast<std::string>(WT_SERIES) + '.' + boost::lexical_cast<std::string>(WT_MAJOR) + '.' + boost::lexical_cast<std::string>(WT_MINOR); } else if (name == "SERVER_ADMIN") { return "webmaster@localhost"; // FIXME } else if (name == "REMOTE_ADDR") { return remoteAddr(); } else if (name == "DOCUMENT_ROOT") { return reply_->configuration().docRoot(); } else return std::string(); }