http_rewrite: fix start anchor (^) match
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 2 Jul 2013 11:24:34 +0000 (13:24 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 2 Jul 2013 11:24:34 +0000 (13:24 +0200)
src/filter_http_rewrite.cpp
src/test_filter_rewrite.cpp

index d417f46..145d7fe 100644 (file)
@@ -40,6 +40,7 @@ namespace metaproxy_1 {
     namespace filter {
         class HttpRewrite::Replace {
         public:
+            bool start_anchor;
             boost::regex re;
             boost::smatch what;
             std::string recipe;
@@ -389,6 +390,7 @@ const std::string yf::HttpRewrite::Rule::test_patterns(
         std::map<std::string, std::string> & vars,
         const std::string & txt)
 {
+    bool first = true;
     std::string out;
     std::string::const_iterator start, end;
     start = txt.begin();
@@ -401,6 +403,8 @@ const std::string yf::HttpRewrite::Rule::test_patterns(
             std::list<Replace>::iterator it = replace_list.begin();
             for (; it != replace_list.end(); it++)
             {
+                if (it->start_anchor && !first)
+                    continue;
                 if (regex_search(start, end, it->what, it->re))
                 {
                     if (it->what[0].first < best_pos)
@@ -413,7 +417,7 @@ const std::string yf::HttpRewrite::Rule::test_patterns(
             if (bit == replace_list.end())
                 break;
         }
-
+        first = false;
         size_t i;
         for (i = 1; i < bit->what.size(); ++i)
         {
@@ -445,6 +449,7 @@ void yf::HttpRewrite::Replace::parse_groups(std::string pattern)
     bool esc = false;
     const std::string &str = pattern;
     std::string res;
+    start_anchor = str[0] == '^';
     yaz_log(YLOG_LOG, "Parsing groups from '%s'", str.c_str());
     for (size_t i = 0; i < str.size(); ++i)
     {
index c38c022..3749509 100644 (file)
@@ -85,6 +85,7 @@ BOOST_AUTO_TEST_CASE( test_filter_rewrite_1 )
             "   <rule name=\"null\"/>\n"
             "   <rule name=\"url\">\n"
             "     <rewrite from='foo' to='bar'/>\n"
+            "     <rewrite from='^cx' to='cy'/>\n"
             "     <rewrite from='"
     "(?&lt;proto>https?://)(?&lt;host>[^/?# &quot;&apos;>]+)/(?&lt;path>[^  &quot;&apos;>]+)'\n"
             "            to='${proto}${pxhost}/${pxpath}/${host}/${path}' />\n"
@@ -145,11 +146,13 @@ BOOST_AUTO_TEST_CASE( test_filter_rewrite_1 )
             "<a target=_blank href=\"http://targetsite/page3.html\">"
             "  Another abs link</a>"
             "<a href=\"/docs/page4.html\" />"
+            "<a href=\"cxcx\" />"
+            "<a href=\"cx \" />"
             "</body></html>";
 
         const char *resp_expected =
             "HTTP/1.1 200 OK\r\n"
-            "Content-Length: 533\r\n"
+            "Content-Length: 564\r\n"
             "Content-Type: text/html\r\n"
             "Link: <http://proxyhost/proxypath/targetsite/file.xml>; rel=absolute\r\n"
             "Link: </dir/file.xml>; rel=relative\r\n"
@@ -172,6 +175,8 @@ BOOST_AUTO_TEST_CASE( test_filter_rewrite_1 )
             "<a target=_blank href=\"http://proxyhost/proxypath/targetsite/page3.html\">"
             "  Another abs link</a>"
             "<a href=\"/docs/page4.html\"/>"
+            "<a href=\"cycx\"/>"
+            "<a href=\"cy \"/>"
             "</body></html>";
 
         int r;