# # # patch "cmd_netsync.cc" # from [fe6530a5bb3a02388366873891c07668a6a6c01d] # to [e6ffedeb7e6c08493ac3821ce81eb9da3ab8eb30] # # patch "tests/netsync_mtn_uri_scheme/__driver__.lua" # from [8f598b3fd3a7824c8d90a87cedbd91ad8d7fc000] # to [0d588e5d46ffd406ffea611af29156d9c7903e9f] # # patch "uri.cc" # from [511f1e52d66a9ae4a10b43db25766d9c0a83970f] # to [bcf62ac4ddf4e66afd2ecf9a77ef4a7f46503e07] # # patch "uri.hh" # from [e2090172c24e25c3596cdb492e2666dd5e3e68aa] # to [98d52812140313cc76d8955db977dbdac8ede7f1] # ============================================================ --- cmd_netsync.cc fe6530a5bb3a02388366873891c07668a6a6c01d +++ cmd_netsync.cc e6ffedeb7e6c08493ac3821ce81eb9da3ab8eb30 @@ -145,9 +145,9 @@ build_client_connection_info(options & o } if (is_exclude) - excludes.push_back(arg_type(item)); + excludes.push_back(arg_type(urldecode(item))); else - includes.push_back(arg_type(item)); + includes.push_back(arg_type(urldecode(item))); } info.client.include_pattern = globish(includes); info.client.exclude_pattern = globish(excludes); ============================================================ --- tests/netsync_mtn_uri_scheme/__driver__.lua 8f598b3fd3a7824c8d90a87cedbd91ad8d7fc000 +++ tests/netsync_mtn_uri_scheme/__driver__.lua 0d588e5d46ffd406ffea611af29156d9c7903e9f @@ -15,7 +15,8 @@ srv = netsync.start() srv = netsync.start() -check(mtn2("pull", "mtn://" .. srv.address .. "?branch-te*/-branch-test-*"), 0, false, false) +-- %61 = 'a' +check(mtn2("pull", "mtn://" .. srv.address .. "?br%61nch-te*/-br%61nch-test-*"), 0, false, false) check(mtn2("ls", "branches"), 0, true) check(not qgrep("^branch$", "stdout")) check( qgrep("^branch-test$", "stdout")) ============================================================ --- uri.cc 511f1e52d66a9ae4a10b43db25766d9c0a83970f +++ uri.cc bcf62ac4ddf4e66afd2ecf9a77ef4a7f46503e07 @@ -144,6 +144,75 @@ parse_uri(string const & in, uri & u) } } +string +urldecode(string const & in) +{ + string out; + + for (string::const_iterator i = in.begin(); i != in.end(); ++i) + { + if (*i != '%') + out += *i; + else + { + char d1, d2; + ++i; + E(i != in.end(), F("Bad URLencoded string '%s'") % in); + d1 = *i; + ++i; + E(i != in.end(), F("Bad URLencoded string '%s'") % in); + d2 = *i; + + char c = 0; + switch(d1) + { + case '0': c += 0; break; + case '1': c += 1; break; + case '2': c += 2; break; + case '3': c += 3; break; + case '4': c += 4; break; + case '5': c += 5; break; + case '6': c += 6; break; + case '7': c += 7; break; + case '8': c += 8; break; + case '9': c += 9; break; + case 'a': case 'A': c += 10; break; + case 'b': case 'B': c += 11; break; + case 'c': case 'C': c += 12; break; + case 'd': case 'D': c += 13; break; + case 'e': case 'E': c += 14; break; + case 'f': case 'F': c += 15; break; + default: E(false, F("Bad URLencoded string '%s'") % in); + } + c *= 16; + switch(d2) + { + case '0': c += 0; break; + case '1': c += 1; break; + case '2': c += 2; break; + case '3': c += 3; break; + case '4': c += 4; break; + case '5': c += 5; break; + case '6': c += 6; break; + case '7': c += 7; break; + case '8': c += 8; break; + case '9': c += 9; break; + case 'a': case 'A': c += 10; break; + case 'b': case 'B': c += 11; break; + case 'c': case 'C': c += 12; break; + case 'd': case 'D': c += 13; break; + case 'e': case 'E': c += 14; break; + case 'f': case 'F': c += 15; break; + default: E(false, F("Bad URLencoded string '%s'") % in); + } + out += c; + } + } + + return out; +} + + #ifdef BUILD_UNIT_TESTS #include "unit_tests.hh" @@ -256,6 +325,15 @@ UNIT_TEST(uri, invalid) UNIT_TEST_CHECK_THROW(parse_uri("http://example.com:1a4/foo/bar", u), informative_failure); } +UNIT_TEST(uri, urldecode) +{ + UNIT_TEST_CHECK(urldecode("foo%20bar") == "foo bar"); + UNIT_TEST_CHECK(urldecode("%61") == "a"); + UNIT_TEST_CHECK_THROW(urldecode("%xx"), informative_failure); + UNIT_TEST_CHECK_THROW(urldecode("%"), informative_failure); + UNIT_TEST_CHECK_THROW(urldecode("%5"), informative_failure); +} + #endif // BUILD_UNIT_TESTS // Local Variables: ============================================================ --- uri.hh e2090172c24e25c3596cdb492e2666dd5e3e68aa +++ uri.hh 98d52812140313cc76d8955db977dbdac8ede7f1 @@ -25,6 +25,9 @@ parse_uri(std::string const & in, uri & void parse_uri(std::string const & in, uri & out); +std::string +urldecode(std::string const & in); + // Local Variables: // mode: C++ // fill-column: 76