From bb544a21b4f9b391c8e11d39119af31b97add76d Mon Sep 17 00:00:00 2001 From: digital dreamer Date: Sat, 31 May 2014 10:59:09 +0200 Subject: [PATCH] parse query as parameter map --- Makefile.am | 2 +- configure.ac | 2 + m4/ax_boost_regex.m4 | 111 +++++++++++++++++++++++++++++++++++++++++++ src/twister_rss.cpp | 46 +++++++++--------- src/twister_rss.h | 2 + 5 files changed, 140 insertions(+), 23 deletions(-) create mode 100644 m4/ax_boost_regex.m4 diff --git a/Makefile.am b/Makefile.am index 02c30aaf..cd07798d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -173,7 +173,7 @@ twisterd_DEPENDENCIES = $(LEVELDB_LIB) twisterd_LDADD = $(LEVELDB_LIB) $(UPNP_LIB) \ @BOOST_SYSTEM_LIB@ @BOOST_FILESYSTEM_LIB@ @BOOST_PROGRAM_OPTIONS_LIB@ @BOOST_THREAD_LIB@ @BOOST_CHRONO_LIB@ @BOOST_LOCALE_LIB@ \ - @DB_CXX_LIBS@ @OPENSSL_LIBS@ + @BOOST_REGEX_LIB@ @DB_CXX_LIBS@ @OPENSSL_LIBS@ AM_CPPFLAGS = -ftemplate-depth-100 -DBOOST_SPIRIT_THREADSAFE -D_FILE_OFFSET_BITS=64 \ -I$(top_srcdir)/libtorrent/include \ diff --git a/configure.ac b/configure.ac index 446228f8..bc8f41d0 100644 --- a/configure.ac +++ b/configure.ac @@ -92,6 +92,7 @@ AX_BOOST_PROGRAM_OPTIONS() AX_BOOST_THREAD() AX_BOOST_CHRONO() AX_BOOST_LOCALE() +AX_BOOST_REGEX() ############################################################################### # Checking for Berkeley DB C++ @@ -773,6 +774,7 @@ Boost libraries: boost.program_opts: ${BOOST_PROGRAM_OPTIONS_LIB} boost.thread: ${BOOST_THREAD_LIB} boost.locale: ${BOOST_LOCALE_LIB} + boost.regex: ${BOOST_REGEX_LIB} Berkeley DB C++ library: header: ${DB_CXX_HEADER} diff --git a/m4/ax_boost_regex.m4 b/m4/ax_boost_regex.m4 new file mode 100644 index 00000000..918f16a4 --- /dev/null +++ b/m4/ax_boost_regex.m4 @@ -0,0 +1,111 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_boost_regex.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_REGEX +# +# DESCRIPTION +# +# Test for Regex library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_REGEX_LIB) +# +# And sets: +# +# HAVE_BOOST_REGEX +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# Copyright (c) 2008 Michael Tindal +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 22 + +AC_DEFUN([AX_BOOST_REGEX], +[ + AC_ARG_WITH([boost-regex], + AS_HELP_STRING([--with-boost-regex@<:@=special-lib@:>@], + [use the Regex library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-regex=boost_regex-gcc-mt-d-1_33_1 ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_regex_lib="" + else + want_boost="yes" + ax_boost_user_regex_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Regex library is available, + ax_cv_boost_regex, + [AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include + ]], + [[boost::regex r(); return 0;]])], + ax_cv_boost_regex=yes, ax_cv_boost_regex=no) + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_regex" = "xyes"; then + AC_DEFINE(HAVE_BOOST_REGEX,,[define if the Boost::Regex library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + if test "x$ax_boost_user_regex_lib" = "x"; then + for libextension in `ls $BOOSTLIBDIR/libboost_regex*.so* $BOOSTLIBDIR/libboost_regex*.dylib* $BOOSTLIBDIR/libboost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_regex.*\)\.so.*$;\1;' -e 's;^lib\(boost_regex.*\)\.dylib.*;\1;' -e 's;^lib\(boost_regex.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break], + [link_regex="no"]) + done + if test "x$link_regex" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_regex*.dll* $BOOSTLIBDIR/boost_regex*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_regex.*\)\.dll.*$;\1;' -e 's;^\(boost_regex.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break], + [link_regex="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_regex_lib boost_regex-$ax_boost_user_regex_lib; do + AC_CHECK_LIB($ax_lib, main, + [BOOST_REGEX_LIB="-l$ax_lib"; AC_SUBST(BOOST_REGEX_LIB) link_regex="yes"; break], + [link_regex="no"]) + done + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::Regex library!) + fi + if test "x$link_regex" != "xyes"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/src/twister_rss.cpp b/src/twister_rss.cpp index 91aacacb..25508463 100644 --- a/src/twister_rss.cpp +++ b/src/twister_rss.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include using namespace std; @@ -14,37 +15,21 @@ using namespace json_spirit; int generateRSS(string uri, string *output) { - string account = ""; - int max = 20; - - // get URI parameters if available - size_t startPosition, endPosition; - if(uri.find("max=")!=string::npos) + map parameterMap = parseQuery(uri); + int max = 20; //default value + string account = parameterMap["account"]; + string strMax = parameterMap["max"]; + if(strMax!="") { - startPosition = uri.find("max=")+4; - if(uri.find("&",startPosition)!=string::npos) - endPosition=uri.find("&",startPosition); - else - endPosition=uri.length(); try { - max = boost::lexical_cast(uri.substr(startPosition,endPosition-startPosition)); + max = boost::lexical_cast(strMax); } catch(boost::bad_lexical_cast e) { return RSS_ERROR_NOT_A_NUMBER; } } - if(uri.find("account=")!=string::npos) - { - startPosition = uri.find("account=")+8; - if(uri.find("&",startPosition)!=string::npos) - endPosition=uri.find("&",startPosition); - else - endPosition=uri.length(); - - account = uri.substr(startPosition,endPosition-startPosition); - } const Array emptyArray; Array accountsArray = listwalletusers(emptyArray,false).get_array(); @@ -201,6 +186,23 @@ int generateRSS(string uri, string *output) return RSS_OK; } +map parseQuery(const string& query) +{ + map data; + boost::regex pattern("([\\w+%]+)=([^&]*)"); + boost::sregex_iterator words_begin = boost::sregex_iterator(query.begin(), query.end(), pattern); + boost::sregex_iterator words_end = boost::sregex_iterator(); + + for (boost::sregex_iterator i = words_begin; i != words_end; i++) + { + string key = (*i)[1].str(); + string value = (*i)[2].str(); + data[key] = value; + } + + return data; +} + bool sortByTime (Object i,Object j) { return (find_value(i,"time").get_int64()>find_value(j,"time").get_int64()); diff --git a/src/twister_rss.h b/src/twister_rss.h index e618497e..f57a42d6 100644 --- a/src/twister_rss.h +++ b/src/twister_rss.h @@ -3,6 +3,7 @@ #include "json/json_spirit.h" #include +#include enum RSSResultCode { @@ -13,6 +14,7 @@ enum RSSResultCode }; extern bool sortByTime (json_spirit::Object i,json_spirit::Object j); +extern std::map parseQuery(const std::string& query); extern int generateRSS(std::string uri, std::string *output); #endif // TWISTER_RSS_H