metaproxy  1.21.0
Public Member Functions | Public Attributes | List of all members
metaproxy_1::filter::HttpRewrite::Replace Class Reference
Collaboration diagram for metaproxy_1::filter::HttpRewrite::Replace:
Collaboration graph

Public Member Functions

std::string sub_vars (const std::map< std::string, std::string > &vars) const
 
void parse_groups (std::string pattern)
 

Public Attributes

bool start_anchor
 
boost::regex re
 
std::string recipe
 
std::map< int, std::string > group_index
 

Detailed Description

Definition at line 41 of file filter_http_rewrite.cpp.

Member Function Documentation

◆ parse_groups()

void mp::filter::HttpRewrite::Replace::parse_groups ( std::string  pattern)

Definition at line 645 of file filter_http_rewrite.cpp.

646 {
647  int gnum = 0;
648  bool esc = false;
649  const std::string &str = pattern;
650  std::string res;
651  start_anchor = str[0] == '^';
652  yaz_log(YLOG_LOG, "Parsing groups from '%s'", str.c_str());
653  for (size_t i = 0; i < str.size(); ++i)
654  {
655  res += str[i];
656  if (!esc && str[i] == '\\')
657  {
658  esc = true;
659  continue;
660  }
661  if (!esc && str[i] == '(') //group starts
662  {
663  gnum++;
664  if (i+1 < str.size() && str[i+1] == '?') //group with attrs
665  {
666  i++;
667  if (i+1 < str.size() && str[i+1] == ':') //non-capturing
668  {
669  if (gnum > 0) gnum--;
670  res += str[i];
671  i++;
672  res += str[i];
673  continue;
674  }
675  if (i+1 < str.size() && str[i+1] == 'P') //optional, python
676  i++;
677  if (i+1 < str.size() && str[i+1] == '<') //named
678  {
679  i++;
680  std::string gname;
681  bool term = false;
682  while (++i < str.size())
683  {
684  if (str[i] == '>') { term = true; break; }
685  if (!isalnum(str[i]))
686  throw mp::filter::FilterException
687  ("Only alphanumeric chars allowed, found "
688  " in '"
689  + str
690  + "' at "
691  + boost::lexical_cast<std::string>(i));
692  gname += str[i];
693  }
694  if (!term)
695  throw mp::filter::FilterException
696  ("Unterminated group name '" + gname
697  + " in '" + str +"'");
698  group_index[gnum] = gname;
699  yaz_log(YLOG_LOG, "Found named group '%s' at $%d",
700  gname.c_str(), gnum);
701  }
702  }
703  }
704  esc = false;
705  }
706  re = res;
707 }

Referenced by metaproxy_1::filter::HttpRewrite::configure_phase().

◆ sub_vars()

std::string mp::filter::HttpRewrite::Replace::sub_vars ( const std::map< std::string, std::string > &  vars) const

Definition at line 709 of file filter_http_rewrite.cpp.

711 {
712  std::string out;
713  bool esc = false;
714  const std::string & in = recipe;
715  for (size_t i = 0; i < in.size(); ++i)
716  {
717  if (!esc && in[i] == '\\')
718  {
719  esc = true;
720  continue;
721  }
722  if (!esc && in[i] == '$') //var
723  {
724  if (i+1 < in.size() && in[i+1] == '{') //ref prefix
725  {
726  ++i;
727  std::string name;
728  bool term = false;
729  while (++i < in.size())
730  {
731  if (in[i] == '}') { term = true; break; }
732  name += in[i];
733  }
734  if (!term) throw mp::filter::FilterException
735  ("Unterminated var ref in '"+in+"' at "
736  + boost::lexical_cast<std::string>(i));
737  std::map<std::string, std::string>::const_iterator it
738  = vars.find(name);
739  if (it != vars.end())
740  {
741  out += it->second;
742  }
743  }
744  else
745  {
746  throw mp::filter::FilterException
747  ("Malformed or trimmed var ref in '"
748  +in+"' at "+boost::lexical_cast<std::string>(i));
749  }
750  continue;
751  }
752  //passthru
753  out += in[i];
754  esc = false;
755  }
756  return out;
757 }

Member Data Documentation

◆ group_index

std::map<int, std::string> metaproxy_1::filter::HttpRewrite::Replace::group_index

Definition at line 46 of file filter_http_rewrite.cpp.

◆ re

boost::regex metaproxy_1::filter::HttpRewrite::Replace::re

Definition at line 44 of file filter_http_rewrite.cpp.

◆ recipe

std::string metaproxy_1::filter::HttpRewrite::Replace::recipe

◆ start_anchor

bool metaproxy_1::filter::HttpRewrite::Replace::start_anchor

Definition at line 43 of file filter_http_rewrite.cpp.


The documentation for this class was generated from the following file: