📄 httpsvc.cxx
字号:
}PCREATE_SERVICE_MACRO(LocalHost,request,P_EMPTY){ if (request.localAddr != 0) return PIPSocket::GetHostName(request.localAddr); else return PIPSocket::GetHostName();}PCREATE_SERVICE_MACRO(LocalIP,request,P_EMPTY){ if (request.localAddr != 0) return request.localAddr; else return "127.0.0.1";}PCREATE_SERVICE_MACRO(LocalPort,request,P_EMPTY){ if (request.localPort != 0) return psprintf("%u", request.localPort); else return "80";}PCREATE_SERVICE_MACRO(PeerHost,request,P_EMPTY){ if (request.origin != 0) return PIPSocket::GetHostName(request.origin); else return "N/A";}PCREATE_SERVICE_MACRO(PeerIP,request,P_EMPTY){ if (request.origin != 0) return request.origin; else return "N/A";}PCREATE_SERVICE_MACRO(MonitorInfo,request,P_EMPTY){ const PTime & compilationDate = PHTTPServiceProcess::Current().GetCompilationDate(); PString peerAddr = "N/A"; if (request.origin != 0) peerAddr = request.origin.AsString(); PString localAddr = "127.0.0.1"; if (request.localAddr != 0) localAddr = request.localAddr.AsString(); WORD localPort = 80; if (request.localPort != 0) localPort = request.localPort; PString timeFormat = "yyyyMMdd hhmmss z"; PTime now; PTimeInterval upTime = now - PProcess::Current().GetStartTime(); PStringStream monitorText; monitorText << "Program: " << PHTTPServiceProcess::Current().GetProductName() << "\n" << "Version: " << PHTTPServiceProcess::Current().GetVersion(TRUE) << "\n" << "Manufacturer: " << PHTTPServiceProcess::Current().GetManufacturer() << "\n" << "OS: " << PHTTPServiceProcess::Current().GetOSClass() << " " << PHTTPServiceProcess::Current().GetOSName() << "\n" << "OS Version: " << PHTTPServiceProcess::Current().GetOSVersion() << "\n" << "Hardware: " << PHTTPServiceProcess::Current().GetOSHardware() << "\n" << "Compilation date: " << compilationDate.AsString(timeFormat, PTime::GMT) << "\n" << "Start Date: " << PProcess::Current().GetStartTime().AsString(timeFormat, PTime::GMT) << "\n" << "Current Date: " << now.AsString(timeFormat, PTime::GMT) << "\n" << "Up time: " << upTime << "\n" << "Peer Addr: " << peerAddr << "\n" << "Local Host: " << PIPSocket::GetHostName() << "\n" << "Local Addr: " << localAddr << "\n" << "Local Port: " << localPort << "\n" ; return monitorText;}PCREATE_SERVICE_MACRO(RegInfo,P_EMPTY,P_EMPTY){ PString subs; DigestSecuredKeys(PHTTPServiceProcess::Current(), subs, NULL); return subs;}static PString GetRegInfo(const char * info){ PHTTPServiceProcess & process = PHTTPServiceProcess::Current(); PSecureConfig sconf(process.GetProductKey(), process.GetSecuredKeys()); PString pending = sconf.GetPendingPrefix(); return sconf.GetString(info, sconf.GetString(pending+info));}PCREATE_SERVICE_MACRO(RegUser,P_EMPTY,P_EMPTY){ return GetRegInfo("Name");}PCREATE_SERVICE_MACRO(RegCompany,P_EMPTY,P_EMPTY){ return GetRegInfo("Company");}PCREATE_SERVICE_MACRO(RegEmail,P_EMPTY,P_EMPTY){ return GetRegInfo("EMail");}PCREATE_SERVICE_MACRO(Registration,P_EMPTY,args){ PHTTPServiceProcess & process = PHTTPServiceProcess::Current(); PSecureConfig sconf(process.GetProductKey(), process.GetSecuredKeys()); PString pending = sconf.GetPendingPrefix(); PString regNow = "Register Now!"; PString viewReg = "View Registration"; PString demoCopy = "Unregistered Demonstration Copy"; PINDEX open; PINDEX close = 0; if (FindBrackets(args, open, close)) { regNow = args(open+1, close-1); if (FindBrackets(args, open, close)) { viewReg = args(open+1, close-1); if (FindBrackets(args, open, close)) demoCopy = args(open+1, close-1); } } PHTML out(PHTML::InBody); out << "<font size=5>" << sconf.GetString("Name", sconf.GetString(pending+"Name", "*** "+demoCopy+" ***")) << PHTML::BreakLine() << "<font size=4>" << sconf.GetString("Company", sconf.GetString(pending+"Company")) << PHTML::BreakLine() << PHTML::BreakLine() << "<font size=3>"; if (sconf.GetString("Name").IsEmpty()) process.AddUnregisteredText(out); else process.AddRegisteredText(out); out << PHTML::HotLink("/register.html") << (sconf.GetString("Name").IsEmpty() ? regNow : viewReg) << PHTML::HotLink(); return out;}PCREATE_SERVICE_MACRO(InputsFromQuery,request,P_EMPTY){ PStringToString vars = request.url.GetQueryVars(); PStringStream subs; for (PINDEX i = 0; i < vars.GetSize(); i++) subs << "<INPUT TYPE=hidden NAME=\"" << vars.GetKeyAt(i) << "\" VALUE=\"" << vars.GetDataAt(i) << "\">\r\n"; return subs;}PCREATE_SERVICE_MACRO(Query,request,args){ if (args.IsEmpty()) return request.url.GetQuery(); PString variable, value; if (ExtractVariables(args, variable, value)) { value = request.url.GetQueryVars()(variable, value); if (!value) return value; } return PString::Empty();}PCREATE_SERVICE_MACRO(Get,request,args){ PString variable, value; if (ExtractVariables(args, variable, value)) { PString section = request.url.GetQueryVars()("section"); PINDEX slash = variable.FindLast('\\'); if (slash != P_MAX_INDEX) { section += variable.Left(slash); variable = variable.Mid(slash+1); } if (!section && !variable) { PConfig config(section); return config.GetString(variable, value); } } return PString::Empty();}PCREATE_SERVICE_MACRO(URL,request,P_EMPTY){ return request.url.AsString();}PCREATE_SERVICE_MACRO(Include,P_EMPTY,args){ PString text; if (!args) { PFile file; if (file.Open(args, PFile::ReadOnly)) text = file.ReadString(file.GetLength()); } return text;}PCREATE_SERVICE_MACRO(SignedInclude,P_EMPTY,args){ PString text; if (!args) { PFile file; if (file.Open(args, PFile::ReadOnly)) { text = file.ReadString(file.GetLength()); if (!PServiceHTML::CheckSignature(text)) { PHTTPServiceProcess & process = PHTTPServiceProcess::Current(); PHTML html("Invalid OEM Signature"); html << "The HTML file \"" << args << "\" contains an invalid signature for \"" << process.GetName() << "\" by \"" << process.GetManufacturer() << '"' << PHTML::Body(); text = html; } } } return text;}PCREATE_SERVICE_MACRO_BLOCK(IfQuery,request,args,block){ PStringToString vars = request.url.GetQueryVars(); PINDEX space = args.FindOneOf(" \t\r\n"); PString var = args.Left(space); PString value = args.Mid(space).LeftTrim(); BOOL ok; if (value.IsEmpty()) ok = vars.Contains(var); else { PString operation; space = value.FindOneOf(" \t\r\n"); if (space != P_MAX_INDEX) { operation = value.Left(space); value = value.Mid(space).LeftTrim(); } PString query = vars(var); if (operation == "!=") ok = query != value; else if (operation == "<") ok = query < value; else if (operation == ">") ok = query > value; else if (operation == "<=") ok = query <= value; else if (operation == ">=") ok = query >= value; else if (operation == "*=") ok = (query *= value); else ok = query == value; } return ok ? block : PString::Empty();}PCREATE_SERVICE_MACRO_BLOCK(IfInURL,request,args,block){ if (request.url.AsString().Find(args) != P_MAX_INDEX) return block; return PString::Empty();}PCREATE_SERVICE_MACRO_BLOCK(IfNotInURL,request,args,block){ if (request.url.AsString().Find(args) == P_MAX_INDEX) return block; return PString::Empty();}static void SplitCmdAndArgs(const PString & text, PINDEX pos, PCaselessString & cmd, PString & args){ static const char whitespace[] = " \t\r\n"; PString macro = text(text.FindOneOf(whitespace, pos)+1, text.Find("--", pos+3)-1).Trim(); PINDEX endCmd = macro.FindOneOf(whitespace); if (endCmd == P_MAX_INDEX) { cmd = macro; args.MakeEmpty(); } else { cmd = macro.Left(endCmd); args = macro.Mid(endCmd+1).LeftTrim(); }}BOOL PServiceHTML::ProcessMacros(PHTTPRequest & request, PString & text, const PString & defaultFile, unsigned options){ PINDEX alreadyLoadedPrefixLength = 0; PString filename = defaultFile; if ((options&LoadFromFile) != 0) { if ((options&NoURLOverride) == 0) { filename = request.url.GetParameters(); if (filename.IsEmpty()) filename = defaultFile; } if (!filename) { PString alreadyLoaded = "<!--#loadedfrom " + filename + "-->\r\n"; alreadyLoadedPrefixLength = alreadyLoaded.GetLength(); if (text.Find(alreadyLoaded) != 0) { PFile file; if (file.Open(filename, PFile::ReadOnly)) { text = alreadyLoaded + file.ReadString(file.GetLength()); if ((options&NoSignatureForFile) == 0) options |= NeedSignature; } } } } if ((options&NeedSignature) != 0) { if (!CheckSignature(text.Mid(alreadyLoadedPrefixLength))) { PHTTPServiceProcess & process = PHTTPServiceProcess::Current(); PHTML html("Invalid OEM Signature"); html << "The HTML file \"" << filename << "\" contains an invalid signature for \"" << process.GetName() << "\" by \"" << process.GetManufacturer() << '"' << PHTML::Body(); text = html; return FALSE; } } static PServiceMacros_list ServiceMacros; PHTTPServiceProcess & process = PHTTPServiceProcess::Current(); PRegularExpression StartBlockRegEx("<?!--#(equival|" + process.GetMacroKeyword() + ")" "start[ \t\r\n]+(-?[^-])+-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); PRegularExpression MacroRegEx("<?!--#(equival|" + process.GetMacroKeyword() + ")[ \t\r\n]+(-?[^-])+-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); BOOL substitedMacro; do { substitedMacro = FALSE; PINDEX pos = 0; PINDEX len; while (text.FindRegEx(StartBlockRegEx, pos, len, pos)) { PString substitution; PCaselessString cmd; PString args; SplitCmdAndArgs(text, pos, cmd, args); PINDEX idx = ServiceMacros.GetValuesIndex(PServiceMacro(cmd, TRUE)); if (idx != P_MAX_INDEX) { PRegularExpression EndBlockRegEx("<?!--#(equival|" + process.GetMacroKeyword() + ")" "end[ \t\r\n]+" + cmd + "(-?[^-])*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); PINDEX endpos, endlen; if (text.FindRegEx(EndBlockRegEx, endpos, endlen, pos+len)) { PINDEX startpos = pos+len; len = endpos-pos + endlen; substitution = ServiceMacros[idx].Translate(request, args, text(startpos, endpos-1)); substitedMacro = TRUE; } } text.Splice(substitution, pos, len); } pos = 0; while (text.FindRegEx(MacroRegEx, pos, len, pos)) { PCaselessString cmd; PString args; SplitCmdAndArgs(text, pos, cmd, args); PString substitution; if (!process.SubstituteEquivalSequence(request, cmd & args, substitution)) { PINDEX idx = ServiceMacros.GetValuesIndex(PServiceMacro(cmd, FALSE)); if (idx != P_MAX_INDEX) { substitution = ServiceMacros[idx].Translate(request, args, PString::Empty()); substitedMacro = TRUE; } } text.Splice(substitution, pos, len); } } while (substitedMacro); return TRUE;}///////////////////////////////////////////////////////////////////static void ServiceOnLoadedText(PString & text){ PHTTPServiceProcess & process = PHTTPServiceProcess::Current(); PString manuf = "<!--Standard_" + process.GetManufacturer() + "_Header-->"; if (text.Find(manuf) != P_MAX_INDEX) text.Replace(manuf, process.GetPageGraphic(), TRUE); static const char equiv[] = "<!--Standard_Equivalence_Header-->"; if (text.Find(equiv) != P_MAX_INDEX) text.Replace(equiv, process.GetPageGraphic(), TRUE); static const char copy[] = "<!--Standard_Copyright_Header-->"; if (text.Find(copy) != P_MAX_INDEX) text.Replace(copy, process.GetCopyrightText(), TRUE);}PString PServiceHTTPString::LoadText(PHTTPRequest & request){ PString text = PHTTPString::LoadText(request); ServiceOnLoadedText(text); PServiceHTML::ProcessMacros(request, text, "", PServiceHTML::LoadFromFile); return text;}BOOL PServiceHTTPString::GetExpirationDate(PTime & when){ // Well and truly before now.... when = ImmediateExpiryTime; return TRUE;}void PServiceHTTPFile::OnLoadedText(PHTTPRequest & request, PString & text){ ServiceOnLoadedText(text); PServiceHTML::ProcessMacros(request, text, GetURL().AsString(PURL::PathOnly), needSignature ? PServiceHTML::NeedSignature : PServiceHTML::NoOptions);}BOOL PServiceHTTPFile::GetExpirationDate(PTime & when){ // Well and truly before now.... when = ImmediateExpiryTime; return TRUE;}void PServiceHTTPDirectory::OnLoadedText(PHTTPRequest & request, PString & text){ ServiceOnLoadedText(text); PServiceHTML::ProcessMacros(request, text, GetURL().AsString(PURL::PathOnly), needSignature ? PServiceHTML::NeedSignature : PServiceHTML::NoOptions);}BOOL PServiceHTTPDirectory::GetExpirationDate(PTime & when){ // Well and truly before now.... when = ImmediateExpiryTime; return TRUE;}///////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -