⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpsvc.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 4 页
字号:
}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 + -