/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #ifndef CPPCMS_IMPL_REWRITE_H #define CPPCMS_IMPL_REWRITE_H #include #include #include #include #include "string_map.h" namespace cppcms { namespace impl { class url_rewriter { struct rule { rule(std::string const &r,std::string const &pat,bool fin=true) : expression(r), final(fin) { size_t pos = 0; bool append = false; for(;;){ size_t start = pos; pos = pat.find('$',pos); std::string subpat = pat.substr(start,pos-start); if(append) pattern.back().append(subpat); else pattern.push_back(subpat); if(pos==std::string::npos) break; pos++; char c; if(pos >= pat.size() || ((c=pat[pos++])!='$' && c < '0' && '9' < c)) throw cppcms_error("Invalid rewrite pattern :" + pat); if(c=='$') { pattern.back()+='$'; append=true; } else { index.push_back(c-'0'); append=false; } } pattern_size = 0; for(size_t i=0;i pattern; std::vector index; size_t pattern_size; bool final; char *rewrite_once(booster::cmatch const &m,string_pool &pool) const { size_t total_size = pattern_size; for(size_t i=0;i("regex"); std::string p = ar[i].get("pattern"); bool final = ar[i].get("final",true); rules_.push_back(rule(r,p,final)); } } char *rewrite(char *url,string_pool &pool) const { booster::cmatch m; for(size_t i=0;i rules_; }; } // impl } // cppcms #endif