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

📄 httpsvc.cxx

📁 基于VXWORKS H323通信技术源代码
💻 CXX
📖 第 1 页 / 共 3 页
字号:
  PString signature = ExtractSignature(html, out);

  // calculate the signature on the data
  PString checkSignature = CalculateSignature(out);

  // return TRUE or FALSE
  return checkSignature == signature;
}


static BOOL FindBrackets(const PString & args, PINDEX & open, PINDEX & close)
{
  open = args.FindOneOf("[{(", close);
  if (open == P_MAX_INDEX)
    return FALSE;

  switch (args[open]) {
    case '[' :
      close = args.Find(']', open+1);
      break;
    case '{' :
      close = args.Find('}', open+1);
      break;
    case '(' :
      close = args.Find(')', open+1);
      break;
  }
  return close != P_MAX_INDEX;
}


static BOOL ExtractVariables(const PString & args,
                             PString & variable,
                             PString & value)
{
  PINDEX open;
  PINDEX close = 0;
  if (FindBrackets(args, open, close))
    variable = args(open+1, close-1);
  else {
    variable = args.Trim();
    close = P_MAX_INDEX-1;
  }
  if (variable.IsEmpty())
    return FALSE;

  if (FindBrackets(args, open, close))
    value = args(open+1, close-1);

  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////

#undef new

class PServiceMacro : public PCaselessString
{
  public:
    PServiceMacro(const char * name);
    virtual PString Translate(PHTTPRequest & request, const PString & args) const = 0;
};


PSORTED_LIST(PServiceMacros_base, PServiceMacro);


class PServiceMacros_list : public PServiceMacros_base
{
  public:
    PServiceMacros_list() { DisallowDeleteObjects(); }
};


static PServiceMacros_list ServiceMacros;


PServiceMacro::PServiceMacro(const char * name)
  : PCaselessString(name)
{
  ServiceMacros.Append(this);
}


#define EMPTY

#define CREATE_MACRO(name, request, args) \
  class PServiceMacro_##name : public PServiceMacro { \
    public: \
      PServiceMacro_##name() : PServiceMacro(#name) { } \
      PString Translate(PHTTPRequest & request, const PString & args) const; \
  }; \
  static const PServiceMacro_##name serviceMacro_##name; \
  PString PServiceMacro_##name::Translate(PHTTPRequest & request, const PString & args) const


CREATE_MACRO(Header,request,EMPTY)
{
  PString hdr = PHTTPServiceProcess::Current().GetPageGraphic();
  PServiceHTML::ProcessMacros(request, hdr, "header.html",
                PServiceHTML::LoadFromFile|PServiceHTML::NoURLOverride);
  return hdr;
}


CREATE_MACRO(Copyright,EMPTY,EMPTY)
{
  return PHTTPServiceProcess::Current().GetCopyrightText();
}


CREATE_MACRO(ProductName,EMPTY,EMPTY)
{
  return PHTTPServiceProcess::Current().GetProductName();
}


CREATE_MACRO(Manufacturer,EMPTY,EMPTY)
{
  return PHTTPServiceProcess::Current().GetManufacturer();
}


CREATE_MACRO(Version,EMPTY,EMPTY)
{
  return PHTTPServiceProcess::Current().GetVersion(TRUE);
}


CREATE_MACRO(BuildDate,EMPTY,args)
{
  const PTime & date = PHTTPServiceProcess::Current().GetCompilationDate();
  if (args.IsEmpty())
    return date.AsString("d MMMM yyyy");

  return date.AsString(args);
}


CREATE_MACRO(OS,EMPTY,EMPTY)
{
  return PHTTPServiceProcess::Current().GetOSClass() &
         PHTTPServiceProcess::Current().GetOSName();
}


CREATE_MACRO(LongDateTime,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::LongDateTime);
}


CREATE_MACRO(LongDate,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::LongDate);
}


CREATE_MACRO(LongTime,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::LongTime);
}


CREATE_MACRO(MediumDateTime,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::MediumDateTime);
}


CREATE_MACRO(MediumDate,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::MediumDate);
}


CREATE_MACRO(ShortDateTime,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::ShortDateTime);
}


CREATE_MACRO(ShortDate,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::ShortDate);
}


CREATE_MACRO(ShortTime,EMPTY,EMPTY)
{
  return PTime().AsString(PTime::ShortTime);
}


CREATE_MACRO(Time,EMPTY,args)
{
  PTime now;
  if (args.IsEmpty())
    return now.AsString();

  return now.AsString(args);
}


CREATE_MACRO(LocalHost,request,EMPTY)
{
  if (request.localAddr != 0)
    return PIPSocket::GetHostName(request.localAddr);
  else
    return PIPSocket::GetHostName();
}


CREATE_MACRO(LocalIP,request,EMPTY)
{
  if (request.localAddr != 0)
    return request.localAddr;
  else
    return "127.0.0.1";
}


CREATE_MACRO(LocalPort,request,EMPTY)
{
  if (request.localPort != 0)
    return psprintf("%u", request.localPort);
  else
    return "80";
}


CREATE_MACRO(PeerHost,request,EMPTY)
{
  if (request.origin != 0)
    return PIPSocket::GetHostName(request.origin);
  else
    return "N/A";
}


CREATE_MACRO(PeerIP,request,EMPTY)
{
  if (request.origin != 0)
    return request.origin;
  else
    return "N/A";
}


CREATE_MACRO(RegInfo,EMPTY,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));
}

CREATE_MACRO(RegUser,EMPTY,EMPTY)
{
  return GetRegInfo("Name");
}


CREATE_MACRO(RegCompany,EMPTY,EMPTY)
{
  return GetRegInfo("Company");
}


CREATE_MACRO(RegEmail,EMPTY,EMPTY)
{
  return GetRegInfo("EMail");
}


CREATE_MACRO(Registration,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;
}


CREATE_MACRO(InputsFromQuery,request,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;
}


CREATE_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();
}


CREATE_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();
}


CREATE_MACRO(URL,request,EMPTY)
{
  return request.url.AsString();
}


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;
    }
  }

  PINDEX pos = 0;
  for (;;) {
    pos = text.Find("!--#equival", pos);
    if (pos == P_MAX_INDEX)
      break;
    PINDEX end = text.Find("--", pos+3);
    if (end == P_MAX_INDEX)
      break;

    PString include = text(pos+12, end-1).Trim();

    if (text[pos-1] == '<')
      pos--;
    end += 2;
    if (text[end] == '>')
      end++;

    PString subs;
    if (!PHTTPServiceProcess::Current().SubstituteEquivalSequence(request, include, subs)) {
      PCaselessString cmd = include.Left(include.Find(' '));
      PINDEX idx = ServiceMacros.GetValuesIndex(cmd);
      if (idx != P_MAX_INDEX)
        subs = ServiceMacros[idx].Translate(request, include.Mid(cmd.GetLength()).LeftTrim());
    }

    text.Splice(subs, pos, end-pos);
  }

  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;
}

void PServiceHTTPFile::OnLoadedText(PHTTPRequest & request, PString & text)
{
  ServiceOnLoadedText(text);
  PServiceHTML::ProcessMacros(request, text, baseURL.AsString(PURL::PathOnly),
          needSignature ? PServiceHTML::NeedSignature : PServiceHTML::NoOptions);
}

void PServiceHTTPDirectory::OnLoadedText(PHTTPRequest & request, PString & text)
{
  ServiceOnLoadedText(text);
  PServiceHTML::ProcessMacros(request, text, baseURL.AsString(PURL::PathOnly),
          needSignature ? PServiceHTML::NeedSignature : PServiceHTML::NoOptions);
}


///////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -