SourceRootInfo::SourceRootInfo(Transport* transport) : m_sandboxCond(RuntimeOption::SandboxMode ? SandboxCondition::On : SandboxCondition::Off) { s_path.destroy(); s_phproot.destroy(); auto documentRoot = transport->getDocumentRoot(); if (!documentRoot.empty()) { m_user = s___builtin; m_sandbox = s_default; // The transport take precedence over the config file m_path = documentRoot; *s_path.getCheck() = documentRoot; return; } if (!sandboxOn()) return; auto host = transport->getHeader("Host"); Variant matches; Variant r = preg_match(String(RuntimeOption::SandboxPattern.c_str(), RuntimeOption::SandboxPattern.size(), CopyString), host, &matches); if (!same(r, 1)) { m_sandboxCond = SandboxCondition::Off; return; } if (RuntimeOption::SandboxFromCommonRoot) { auto sandboxName = tvCastToString(matches.toArray().rvalAt(1).tv()); createFromCommonRoot(sandboxName); } else { Array pair = StringUtil::Explode( tvCastToString(matches.toArray().rvalAt(1).tv()), "-", 2 ).toArray(); m_user = tvCastToString(pair.rvalAt(0).tv()); bool defaultSb = pair.size() == 1; if (defaultSb) { m_sandbox = s_default; } else { m_sandbox = tvCastToString(pair.rvalAt(1).tv()); } createFromUserConfig(); } *s_path.getCheck() = m_path.c_str(); }
bool VirtualHost::rewriteURL(CStrRef host, String &url, bool &qsa, int &redirect) const { String normalized = url; if (normalized.empty() || normalized.charAt(0) != '/') { normalized = String("/") + normalized; } for (unsigned int i = 0; i < m_rewriteRules.size(); i++) { const RewriteRule &rule = m_rewriteRules[i]; bool passed = true; for (vector<RewriteCond>::const_iterator it = rule.rewriteConds.begin(); it != rule.rewriteConds.end(); ++it) { String subject; if (it->type == RewriteCond::Request) { subject = normalized; } else { subject = host; } Variant ret = preg_match(String(it->pattern.c_str(), it->pattern.size(), AttachLiteral), subject); if (!ret.same(it->negate ? 0 : 1)) { passed = false; break; } } if (!passed) continue; Variant ret; int count = preg_replace(ret, rule.pattern.c_str(), rule.to.c_str(), normalized, 1); if (!same(ret, false) && count > 0) { url = ret.toString(); qsa = rule.qsa; redirect = rule.redirect; return true; } } return false; }
std::string VirtualHost::filterUrl(const std::string &url) const { ASSERT(!m_queryStringFilters.empty()); for (unsigned int i = 0; i < m_queryStringFilters.size(); i++) { const QueryStringFilter &filter = m_queryStringFilters[i]; bool match = true; if (!filter.urlPattern.empty()) { Variant ret = preg_match(String(filter.urlPattern.c_str(), filter.urlPattern.size(), AttachLiteral), String(url.c_str(), url.size(), AttachLiteral)); match = (ret.toInt64() > 0); } if (match) { if (filter.namePattern.empty()) { return ""; } Variant ret; int count = preg_replace(ret, filter.namePattern.c_str(), String(filter.replaceWith.c_str(), filter.replaceWith.size(), AttachLiteral), String(url.c_str(), url.size(), AttachLiteral)); if (!same(ret, false) && count > 0) { return ret.toString().data(); } return url; } } return url; }
static json_object *get_video_flash(int fmt_type, char *key) { if(fmt_type > 4) return json_tokener_parse("[]"); int ret = -1, i, fc; char *fmt_arr[4] = {"sd", "shd", "hd", "fhd"}; char *url = "http://vv.video.qq.com/getinfo?defaultfmt="; url = join_str(url, fmt_arr[fmt_type]); url = join_str(url, "&otype=json&platform=11&vids="); url = join_str(url, key); ret = request(url); if(ret < 1) return json_tokener_parse("[]"); char **strArr; set_refer("http://v.qq.com"); char *result = response(); strArr = preg_match("QZOutputJson\\s*=\\s*(.*);", result); json_object *json, *vi, *ui, *cl, *ci, *temp, *arr; char *vt, *vurl, *fn, *keyid; json = json_tokener_parse(strArr[1]); json = json_object_object_get(json, "vl"); vi = json_object_object_get(json, "vi"); ui = json_object_array_get_idx(vi, 0); ui = json_object_object_get(ui, "ul"); ui = json_object_object_get(ui, "ui"); temp = json_object_array_get_idx(ui, 1); vt = get_json_string_val(temp, "vt"); temp = json_object_array_get_idx(ui, 0); vurl = get_json_string_val(temp, "url"); temp = json_object_array_get_idx(vi, 0); fn = get_json_string_val(temp, "fn"); char **fn_arr = split_str(fn, "."); cl = json_object_object_get(temp, "cl"); arr = json_object_new_array(); if(json_object_object_exist(cl, "ci") > 0){ ci = json_object_object_get(cl, "ci"); ci = json_object_array_get_idx(ci, 0); keyid = get_json_string_val(ci, "keyid"); char **keyid_arr = split_str(keyid, "."); fc = json_object_get_int(json_object_object_get(cl, "fc")); char *key_base_url = "http://vv.video.qq.com/getkey?platform=11&otype=json&vid="; key_base_url = join_str(key_base_url, key); key_base_url = join_str(key_base_url, "&vt="); key_base_url = join_str(key_base_url, vt); char *vname_pre = fn_arr[0]; vname_pre = join_str(vname_pre, "."); vname_pre = join_str(vname_pre, fn_arr[1]); vname_pre = join_str(vname_pre, "."); char *vanme_next = "."; vanme_next = join_str(vanme_next, fn_arr[2]); char *vname, *key_url; for(i = 0; i < fc; i++){ char str[10]; itoa((i+1),str,10); vname = join_str(vname_pre, str); vname = join_str(vname, vanme_next); key_url = join_str(key_base_url, "&format="); key_url = join_str(key_url, keyid_arr[1]); key_url = join_str(key_url, "&filename="); key_url = join_str(key_url, vname); ret = request(key_url); if(ret < 1) return json_tokener_parse("[]"); set_refer("http://v.qq.com"); result = response(); strArr = preg_match("QZOutputJson\\s*=\\s*(.*);", result); json = json_tokener_parse(strArr[1]); if(json_object_object_exist(json, "key") == 0) return json_tokener_parse("[]"); char *k_key = get_json_string_val(json, "key"); char *video_url = join_str(vurl, vname); video_url = join_str(video_url, "?platform=0&fmt="); video_url = join_str(video_url, fmt_arr[fmt_type]); video_url = join_str(video_url, "&level=0&vkey="); video_url = join_str(video_url, k_key); json = json_object_new_object(); json_object_object_add(json, "url", json_object_new_string(video_url)); json_object_array_add(arr, json); } } return arr; }
bool VirtualHost::rewriteURL(CStrRef host, String &url, bool &qsa, int &redirect) const { String normalized = url; if (normalized.empty() || normalized.charAt(0) != '/') { normalized = String("/") + normalized; } for (unsigned int i = 0; i < m_rewriteRules.size(); i++) { const RewriteRule &rule = m_rewriteRules[i]; bool passed = true; for (vector<RewriteCond>::const_iterator it = rule.rewriteConds.begin(); it != rule.rewriteConds.end(); ++it) { String subject; if (it->type == RewriteCond::Type::Request) { subject = normalized; } else { subject = host; } Variant ret = preg_match(String(it->pattern.c_str(), it->pattern.size(), AttachLiteral), subject); if (!same(ret, it->negate ? 0 : 1)) { passed = false; break; } } if (!passed) continue; Variant matches; int count = preg_match(rule.pattern.c_str(), normalized, matches).toInt64(); if (count > 0) { const char *s = rule.to.c_str(); StringBuffer ret; while (*s) { int backref = -1; if (*s == '\\') { if ('0' <= s[1] && s[1] <= '9') { s++; backref = get_backref(&s); } else if (s[1] == '\\') { s++; } } else if (*s == '$') { if (s[1] == '{') { const char *t = s+2; if ('0' <= *t && *t <= '9') { backref = get_backref(&t); if (*t != '}') { backref = -1; } else { s = t+1; } } } else if ('0' <= s[1] && s[1] <= '9') { s++; backref = get_backref(&s); } } if (backref >= 0) { String br = matches[backref].toString(); if (rule.encode_backrefs) { br = StringUtil::UrlEncode(br); } ret.append(br); } else { ret.append(s, 1); s++; } } url = ret.detach(); qsa = rule.qsa; redirect = rule.redirect; return true; } } return false; }
void RuntimeOption::Load(Hdf &config) { PidFile = config["PidFile"].getString("www.pid"); // Tier overwrites { Hdf tiers = config["Tiers"]; string hostname = Process::GetHostName(); for (Hdf hdf = tiers.firstChild(); hdf.exists(); hdf = hdf.next()) { string pattern = hdf["machine"].getString(); if (!pattern.empty()) { Variant ret = preg_match(String(pattern.c_str(), pattern.size(), AttachLiteral), String(hostname.c_str(), hostname.size(), AttachLiteral)); if (ret.toInt64() > 0) { Tier = hdf.getName(); config.copy(hdf["overwrite"]); // no break here, so we can continue to match more overwrites } } } } { Hdf logger = config["Log"]; if (logger["Level"] == "None") { Logger::LogLevel = Logger::LogNone; } else if (logger["Level"] == "Error") { Logger::LogLevel = Logger::LogError; } else if (logger["Level"] == "Warning") { Logger::LogLevel = Logger::LogWarning; } else if (logger["Level"] == "Info") { Logger::LogLevel = Logger::LogInfo; } else if (logger["Level"] == "Verbose") { Logger::LogLevel = Logger::LogVerbose; } Logger::LogHeader = logger["Header"].getBool(); Logger::MaxMessagesPerRequest = logger["MaxMessagesPerRequest"].getInt32(-1); Logger::UseLogFile = logger["UseLogFile"].getBool(true); if (Logger::UseLogFile) { LogFile = logger["File"].getString(); } Hdf aggregator = logger["Aggregator"]; Logger::UseLogAggregator = aggregator.getBool(); LogAggregatorFile = aggregator["File"].getString(); LogAggregatorDatabase = aggregator["Database"].getString(); LogAggregatorSleepSeconds = aggregator["SleepSeconds"].getInt16(10); AlwaysLogUnhandledExceptions = logger["AlwaysLogUnhandledExceptions"].getBool(true); NoSilencer = logger["NoSilencer"].getBool(); EnableApplicationLog = logger["ApplicationLog"].getBool(true); AccessLogDefaultFormat = logger["AccessLogDefaultFormat"]. getString("%h %l %u %t \"%r\" %>s %b"); { Hdf access = logger["Access"]; for (Hdf hdf = access.firstChild(); hdf.exists(); hdf = hdf.next()) { string fname = hdf["File"].getString(); if (fname.empty()) { continue; } AccessLogs. push_back(pair<string, string>(fname, hdf["Format"]. getString(AccessLogDefaultFormat))); } } AdminLogFormat = logger["AdminLogFormat"].getString("%h %t %s %U"); AdminLogFile = logger["AdminLogFile"].getString(); } { Hdf error = config["ErrorHandling"]; NoInfiniteLoopDetection = error["NoInfiniteLoopDetection"].getBool(); NoInfiniteRecursionDetection = error["NoInfiniteRecursionDetection"].getBool(); ThrowBadTypeExceptions = error["ThrowBadTypeExceptions"].getBool(); ThrowNotices = error["ThrowNotices"].getBool(); AssertActive = error["AssertActive"].getBool(); AssertWarning = error["AssertWarning"].getBool(); } { Hdf rlimit = config["ResourceLimit"]; setResourceLimit(RLIMIT_CORE, rlimit, "CoreFileSize"); setResourceLimit(RLIMIT_NOFILE, rlimit, "MaxSocket"); setResourceLimit(RLIMIT_DATA, rlimit, "RSS"); MaxRSS = rlimit["RSS"].getInt64(0); } { Hdf server = config["Server"]; Host = server["Host"].getString(); DefaultServerNameSuffix = server["DefaultServerNameSuffix"].getString(); ServerIP = server["IP"].getString("0.0.0.0"); ServerPrimaryIP = Util::GetPrimaryIP(); ServerPort = server["Port"].getInt16(80); ServerThreadCount = server["ThreadCount"].getInt32(50); PageletServerThreadCount = server["PageletServerThreadCount"].getInt32(0); RequestTimeoutSeconds = server["RequestTimeoutSeconds"].getInt32(-1); RequestMemoryMaxBytes = server["RequestMemoryMaxBytes"].getInt64(-1); ResponseQueueCount = server["ResponseQueueCount"].getInt32(0); if (ResponseQueueCount <= 0) { ResponseQueueCount = ServerThreadCount / 10; if (ResponseQueueCount <= 0) ResponseQueueCount = 1; } ServerGracefulShutdownWait = server["GracefulShutdownWait"].getInt16(0); ServerHarshShutdown = server["HarshShutdown"].getBool(true); ServerEvilShutdown = server["EvilShutdown"].getBool(true); ServerDanglingWait = server["DanglingWait"].getInt16(0); if (ServerGracefulShutdownWait < ServerDanglingWait) { ServerGracefulShutdownWait = ServerDanglingWait; } GzipCompressionLevel = server["GzipCompressionLevel"].getInt16(3); EnableKeepAlive = server["EnableKeepAlive"].getBool(true); EnableEarlyFlush = server["EnableEarlyFlush"].getBool(true); ForceChunkedEncoding = server["ForceChunkedEncoding"].getBool(); MaxPostSize = (server["MaxPostSize"].getInt32(8)) * (1 << 20); UploadMaxFileSize = (server["MaxPostSize"].getInt32(10)) * (1 << 20); EnableFileUploads = server["EnableFileUploads"].getBool(true); LibEventSyncSend = server["LibEventSyncSend"].getBool(true); TakeoverFilename = server["TakeoverFilename"].getString(); ExpiresActive = server["ExpiresActive"].getBool(true); ExpiresDefault = server["ExpiresDefault"].getInt32(2592000); if (ExpiresDefault < 0) ExpiresDefault = 2592000; DefaultCharsetName = server["DefaultCharsetName"].getString("UTF-8"); SourceRoot = server["SourceRoot"].getString(); if (!SourceRoot.empty() && SourceRoot[SourceRoot.length() - 1] != '/') { SourceRoot += '/'; } if (!SourceRoot.empty()) { // Guaranteed empty on empty load so avoid setting FileCache::SourceRoot // since it may not be initialized FileCache::SourceRoot = SourceRoot; } server["IncludeSearchPaths"].get(IncludeSearchPaths); for (unsigned int i = 0; i < IncludeSearchPaths.size(); i++) { string &path = IncludeSearchPaths[i]; if (!path.empty() && path[path.length() - 1] != '/') { path += '/'; } } IncludeSearchPaths.insert(IncludeSearchPaths.begin(), "./"); FileCache = server["FileCache"].getString(); DefaultDocument = server["DefaultDocument"].getString(); ErrorDocument404 = server["ErrorDocument404"].getString(); normalizePath(ErrorDocument404); FatalErrorMessage = server["FatalErrorMessage"].getString(); FontPath = server["FontPath"].getString(); if (!FontPath.empty() && FontPath[FontPath.length() - 1] != '/') { FontPath += "/"; } EnableStaticContentCache = server["EnableStaticContentCache"].getBool(true); EnableStaticContentFromDisk = server["EnableStaticContentFromDisk"].getBool(true); RTTIDirectory = server["RTTIDirectory"].getString("/tmp/"); if (!RTTIDirectory.empty() && RTTIDirectory[RTTIDirectory.length() - 1] != '/') { RTTIDirectory += "/"; } EnableCliRTTI = server["EnableCliRTTI"].getBool(); StartupDocument = server["StartupDocument"].getString(); normalizePath(StartupDocument); WarmupDocument = server["WarmupDocument"].getString(); RequestInitFunction = server["RequestInitFunction"].getString(); server["ThreadDocuments"].get(ThreadDocuments); for (unsigned int i = 0; i < ThreadDocuments.size(); i++) { normalizePath(ThreadDocuments[i]); } SafeFileAccess = server["SafeFileAccess"].getBool(); server["AllowedDirectories"].get(AllowedDirectories); for (unsigned int i = 0; i < AllowedDirectories.size(); i++) { string &directory = AllowedDirectories[i]; char resolved_path[PATH_MAX]; if (realpath(directory.c_str(), resolved_path) && directory != resolved_path) { RuntimeOption::AllowedDirectories.push_back(resolved_path); } } server["AllowedFiles"].get(AllowedFiles); EnableMemoryManager = server["EnableMemoryManager"].getBool(); CheckMemory = server["CheckMemory"].getBool(); UseZendArray = server["UseZendArray"].getBool(true); Hdf apc = server["APC"]; EnableApc = apc["EnableApc"].getBool(true); ApcUseSharedMemory = apc["UseSharedMemory"].getBool(); ApcSharedMemorySize = apc["SharedMemorySize"].getInt32(1024 /* 1GB */); ApcPrimeLibrary = apc["PrimeLibrary"].getString(); ApcLoadThread = apc["LoadThread"].getInt16(2); apc["CompletionKeys"].get(ApcCompletionKeys); string apcTableType = apc["TableType"].getString("hash"); if (strcasecmp(apcTableType.c_str(), "hash") == 0) { ApcTableType = ApcHashTable; } else if (strcasecmp(apcTableType.c_str(), "lfu") == 0) { ApcTableType = ApcLfuTable; } else if (strcasecmp(apcTableType.c_str(), "concurrent") == 0) { ApcTableType = ApcConcurrentTable; } else { throw InvalidArgumentException("apc table type", "Invalid table type"); } string apcLockType = apc["LockType"].getString("readwritelock"); if (strcasecmp(apcLockType.c_str(), "readwritelock") == 0) { ApcTableLockType = ApcReadWriteLock; } else if (strcasecmp(apcLockType.c_str(), "mutex") == 0) { ApcTableLockType = ApcMutex; } else { throw InvalidArgumentException("apc lock type", "Invalid lock type"); } ApcUseLockedRefs = apc["UseLockedRefs"].getBool(); ApcExpireOnSets = apc["ExpireOnSets"].getBool(); ApcPurgeFrequency = apc["PurgeFrequency"].getInt32(4096); ApcKeyMaturityThreshold = apc["KeyMaturityThreshold"].getInt32(20); ApcMaximumCapacity = apc["MaximumCapacity"].getInt64(0); ApcKeyFrequencyUpdatePeriod = apc["KeyFrequencyUpdatePeriod"]. getInt32(1000); Hdf dns = server["DnsCache"]; EnableDnsCache = dns["Enable"].getBool(); DnsCacheTTL = dns["TTL"].getInt32(600); // 10 minutes DnsCacheKeyMaturityThreshold = dns["KeyMaturityThreshold"].getInt32(20); DnsCacheMaximumCapacity = dns["MaximumCapacity"].getInt64(0); DnsCacheKeyFrequencyUpdatePeriod = dns["KeyFrequencyUpdatePeriod"]. getInt32(1000); SharedStores::Create(); LightProcessFilePrefix = server["LightProcessFilePrefix"].getString("./lightprocess"); LightProcessCount = server["LightProcessCount"].getInt32(0); InjectedStacktrace = server["InjectedStacktrace"].getBool(); ForceServerNameToHeader = server["ForceServerNameToHeader"].getBool(); } { Hdf hosts = config["VirtualHost"]; if (hosts.exists()) { for (Hdf hdf = hosts.firstChild(); hdf.exists(); hdf = hdf.next()) { if (hdf.getName() == "default") { VirtualHost::GetDefault().init(hdf); } else { VirtualHostPtr host(new VirtualHost(hdf)); VirtualHosts.push_back(host); } } for (unsigned int i = 0; i < VirtualHosts.size(); i++) { if (!VirtualHosts[i]->valid()) { throw InvalidArgumentException("virtual host", "missing prefix or pattern"); } } } } { Hdf ipblocks = config["IpBlockMap"]; IpBlocks = IpBlockMapPtr(new IpBlockMap(ipblocks)); } { Hdf satellites = config["Satellites"]; if (satellites.exists()) { for (Hdf hdf = satellites.firstChild(); hdf.exists(); hdf = hdf.next()) { SatelliteServerInfoPtr satellite(new SatelliteServerInfo(hdf)); SatelliteServerInfos.push_back(satellite); if (satellite->getType() == SatelliteServer::KindOfRPCServer) { XboxPassword = satellite->getPassword(); } } } } { Hdf xbox = config["Xbox"]; XboxServerThreadCount = xbox["ServerThreadCount"].getInt32(0); XboxServerPort = xbox["ServerPort"].getInt32(0); XboxDefaultLocalTimeoutMilliSeconds = xbox["DefaultLocalTimeoutMilliSeconds"].getInt32(500); XboxDefaultRemoteTimeoutSeconds = xbox["DefaultRemoteTimeoutSeconds"].getInt32(5); XboxServerInfoMaxRequest = xbox["ServerInfoMaxRequest"].getInt32(500); XboxServerInfoDuration = xbox["ServerInfoDuration"].getInt32(120); XboxServerInfoWarmupDoc = xbox["ServerInfoWarmupDoc"].get(""); XboxServerInfoReqInitFunc = xbox["ServerInfoReqInitFunc"].get(""); XboxProcessMessageFunc = xbox["ProcessMessageFunc"].get("xbox_process_message"); } { Hdf content = config["StaticFile"]; content["Extensions"].get(StaticFileExtensions); content["Generators"].get(StaticFileGenerators); } { Hdf admin = config["AdminServer"]; AdminServerPort = admin["Port"].getInt16(8088); AdminThreadCount = admin["ThreadCount"].getInt32(1); AdminPassword = admin["Password"].getString(); } { Hdf proxy = config["Proxy"]; ProxyOrigin = proxy["Origin"].getString(); ProxyRetry = proxy["Retry"].getInt16(3); UseServeURLs = proxy["ServeURLs"].getBool(); proxy["ServeURLs"].get(ServeURLs); UseProxyURLs = proxy["ProxyURLs"].getBool(); ProxyPercentage = proxy["Percentage"].getByte(0); proxy["ProxyURLs"].get(ProxyURLs); } { Hdf mysql = config["MySQL"]; MySQLReadOnly = mysql["ReadOnly"].getBool(); MySQLLocalize = mysql["Localize"].getBool(); MySQLConnectTimeout = mysql["ConnectTimeout"].getInt32(1000); MySQLReadTimeout = mysql["ReadTimeout"].getInt32(1000); MySQLSlowQueryThreshold = mysql["SlowQueryThreshold"].getInt32(1000); MySQLKillOnTimeout = mysql["KillOnTimeout"].getBool(); } { Hdf http = config["Http"]; HttpDefaultTimeout = http["DefaultTimeout"].getInt32(30); HttpSlowQueryThreshold = http["SlowQueryThreshold"].getInt32(5000); } { Hdf sandbox = config["Sandbox"]; SocketDefaultTimeout = sandbox["SocketDefaultTimeout"].getInt16(5); LocalMemcache = sandbox["LocalMemcache"].getBool(); MemcacheReadOnly = sandbox["MemcacheReadOnly"].getBool(); } { Hdf debug = config["Debug"]; FullBacktrace = debug["FullBacktrace"].getBool(); ServerStackTrace = debug["ServerStackTrace"].getBool(); ServerErrorMessage = debug["ServerErrorMessage"].getBool(); TranslateSource = debug["TranslateSource"].getBool(); RecordInput = debug["RecordInput"].getBool(); ClearInputOnSuccess = debug["ClearInputOnSuccess"].getBool(true); ProfilerOutputDir = debug["ProfilerOutputDir"].getString("/tmp"); CoreDumpEmail = debug["CoreDumpEmail"].getString(); if (!CoreDumpEmail.empty()) { StackTrace::ReportEmail = CoreDumpEmail; } CoreDumpReport = debug["CoreDumpReport"].getBool(true); if (CoreDumpReport) { StackTrace::InstallReportOnErrors(); } } { Hdf stats = config["Stats"]; EnableStats = stats.getBool(); // main switch EnableWebStats = stats["Web"].getBool(); EnableMemoryStats = stats["Memory"].getBool(); EnableMallocStats = stats["Malloc"].getBool(); EnableAPCStats = stats["APC"].getBool(); EnableAPCKeyStats = stats["APCKey"].getBool(); EnableMemcacheStats = stats["Memcache"].getBool(); EnableSQLStats = stats["SQL"].getBool(); if (EnableStats && EnableMallocStats) { LeakDetectable::EnableMallocStats(true); } StatsXSL = stats["XSL"].getString(); StatsXSLProxy = stats["XSLProxy"].getString(); StatsSlotDuration = stats["SlotDuration"].getInt32(10 * 60); // 10 minutes StatsMaxSlot = stats["MaxSlot"].getInt32(12 * 6); // 12 hours } { config["ServerVariables"].get(ServerVariables); config["EnvVariables"].get(EnvVariables); } { Hdf eval = config["Eval"]; EnableXHP = eval["EnableXHP"].getBool(true); EnableStrict = eval["EnableStrict"].getBool(0); StrictLevel = eval["StrictLevel"].getInt32(1); // StrictBasic StrictFatal = eval["StrictFatal"].getBool(); EvalBytecodeInterpreter = eval["BytecodeInterpreter"].getBool(false); DumpBytecode = eval["DumpBytecode"].getBool(false); } { Hdf sandbox = config["Sandbox"]; SandboxMode = sandbox["SandboxMode"].getBool(); SandboxPattern = format_pattern(sandbox["Pattern"].getString()); SandboxHome = sandbox["Home"].getString(); SandboxConfFile = sandbox["ConfFile"].getString(); sandbox["ServerVariables"].get(SandboxServerVariables); } { Hdf mail = config["Mail"]; SendmailPath = mail["SendmailPath"].getString("sendmail -t -i"); MailForceExtraParameters = mail["ForceExtraParameters"].getString(); } }