diff --git a/include/libtorrent/escape_string.hpp b/include/libtorrent/escape_string.hpp index 841f9c7ce..4745560eb 100755 --- a/include/libtorrent/escape_string.hpp +++ b/include/libtorrent/escape_string.hpp @@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_ESCAPE_STRING_HPP_INCLUDED #include +#include #include "libtorrent/config.hpp" namespace libtorrent @@ -43,10 +44,12 @@ namespace libtorrent std::string TORRENT_EXPORT escape_path(const char* str, int len); // encodes a string using the base64 scheme - TORRENT_EXPORT std::string base64encode(const std::string& s); + TORRENT_EXPORT std::string base64encode(std::string const& s); // encodes a string using the base32 scheme - TORRENT_EXPORT std::string base32encode(const std::string& s); + TORRENT_EXPORT std::string base32encode(std::string const& s); + TORRENT_EXPORT boost::optional url_has_argument( + std::string const& url, std::string argument); } #endif // TORRENT_ESCAPE_STRING_HPP_INCLUDED diff --git a/src/escape_string.cpp b/src/escape_string.cpp index 6a6658715..7477a81d5 100755 --- a/src/escape_string.cpp +++ b/src/escape_string.cpp @@ -38,7 +38,8 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include + +#include #include "libtorrent/assert.hpp" @@ -85,7 +86,6 @@ namespace libtorrent return ret; } - std::string escape_string(const char* str, int len) { TORRENT_ASSERT(str != 0); @@ -220,7 +220,6 @@ namespace libtorrent unsigned char inbuf[5]; unsigned char outbuf[8]; - std::cerr << "base32(" << s << ") = "; std::string ret; for (std::string::const_iterator i = s.begin(); i != s.end();) { @@ -261,8 +260,29 @@ namespace libtorrent ret += '='; } } - std::cerr << ret << std::endl; return ret; } + + boost::optional url_has_argument( + std::string const& url, std::string argument) + { + size_t i = url.find('?'); + if (i == std::string::npos) return boost::optional(); + ++i; + + argument += '='; + + if (url.compare(i, argument.size(), argument) == 0) + { + size_t pos = i + argument.size(); + return url.substr(pos, url.find('&', pos) - pos); + } + argument.insert(0, "&"); + i = url.find(argument, i); + if (i == std::string::npos) return boost::optional(); + size_t pos = i + argument.size(); + return url.substr(pos, url.find('&', pos) - pos); + } + } diff --git a/src/http_tracker_connection.cpp b/src/http_tracker_connection.cpp index 86d21e494..91c305d17 100755 --- a/src/http_tracker_connection.cpp +++ b/src/http_tracker_connection.cpp @@ -89,19 +89,6 @@ namespace namespace { - bool url_has_argument(std::string const& url, std::string argument) - { - size_t i = url.find('?'); - if (i == std::string::npos) return false; - - argument += '='; - - if (url.compare(i + 1, argument.size(), argument) == 0) return true; - argument.insert(0, "&"); - return url.find(argument, i) - != std::string::npos; - } - char to_lower(char c) { return std::tolower(c); } } diff --git a/test/test_primitives.cpp b/test/test_primitives.cpp index 73462aaed..761998e71 100644 --- a/test/test_primitives.cpp +++ b/test/test_primitives.cpp @@ -91,6 +91,8 @@ int test_main() TEST_CHECK(base64encode("fooba") == "Zm9vYmE="); TEST_CHECK(base64encode("foobar") == "Zm9vYmFy"); + // base32 test vectors from http://www.faqs.org/rfcs/rfc4648.html + TEST_CHECK(base32encode("") == ""); TEST_CHECK(base32encode("f") == "MY======"); TEST_CHECK(base32encode("fo") == "MZXQ===="); @@ -99,6 +101,17 @@ int test_main() TEST_CHECK(base32encode("fooba") == "MZXW6YTB"); TEST_CHECK(base32encode("foobar") == "MZXW6YTBOI======"); + // url_has_argument + + TEST_CHECK(!url_has_argument("http://127.0.0.1/test", "test")); + TEST_CHECK(!url_has_argument("http://127.0.0.1/test?foo=24", "bar")); + TEST_CHECK(*url_has_argument("http://127.0.0.1/test?foo=24", "foo") == "24"); + TEST_CHECK(*url_has_argument("http://127.0.0.1/test?foo=24&bar=23", "foo") == "24"); + TEST_CHECK(*url_has_argument("http://127.0.0.1/test?foo=24&bar=23", "bar") == "23"); + TEST_CHECK(*url_has_argument("http://127.0.0.1/test?foo=24&bar=23&a=e", "bar") == "23"); + TEST_CHECK(*url_has_argument("http://127.0.0.1/test?foo=24&bar=23&a=e", "a") == "e"); + TEST_CHECK(!url_has_argument("http://127.0.0.1/test?foo=24&bar=23&a=e", "b")); + // HTTP request parser http_parser parser;