📄 httpsvc.cxx
字号:
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 + -