summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icespider/core/xwwwFormUrlEncoded.cpp29
-rw-r--r--icespider/core/xwwwFormUrlEncoded.h10
-rw-r--r--icespider/fcgi/cgiRequestBase.cpp22
-rw-r--r--icespider/fcgi/cgiRequestBase.h3
4 files changed, 34 insertions, 30 deletions
diff --git a/icespider/core/xwwwFormUrlEncoded.cpp b/icespider/core/xwwwFormUrlEncoded.cpp
index 2a65137..655c839 100644
--- a/icespider/core/xwwwFormUrlEncoded.cpp
+++ b/icespider/core/xwwwFormUrlEncoded.cpp
@@ -4,6 +4,7 @@
#include <Ice/BuiltinSequences.h>
namespace ba = boost::algorithm;
+using namespace std::literals;
extern long hextable[];
@@ -71,15 +72,17 @@ namespace IceSpider {
};
std::string
- XWwwFormUrlEncoded::urlencode(const std::string & s)
+ XWwwFormUrlEncoded::urlencode(const std::string_view & s)
{
return urlencode(s.begin(), s.end());
}
inline char hexchar(char c) { return c < 10 ? '0' + c : 'a' - 10 + c; }
+ template<typename T>
+ inline char hexlookup(const T & i) { return hextable[(int)*i]; }
std::string
- XWwwFormUrlEncoded::urlencode(std::string::const_iterator i, std::string::const_iterator e)
+ XWwwFormUrlEncoded::urlencode(std::string_view::const_iterator i, std::string_view::const_iterator e)
{
std::string t;
t.reserve(std::distance(i, e));
@@ -101,23 +104,29 @@ namespace IceSpider {
}
std::string
- XWwwFormUrlEncoded::urldecode(std::string::const_iterator i, std::string::const_iterator e)
+ XWwwFormUrlEncoded::urldecode(std::string_view::const_iterator i, std::string_view::const_iterator e)
{
std::string t;
t.reserve(std::distance(i, e));
while (i != e) {
- if (*i == '+') t += ' ';
- else if (*i == '%') {
- t += (16 * hextable[(int)*++i]) + hextable[(int)*++i];
+ switch (*i) {
+ case '+':
+ t += ' ';
+ break;
+ case '%':
+ t += (16 * hexlookup(i + 1)) + hexlookup(i + 2);
+ i += 2;
+ break;
+ default:
+ t += *i;
}
- else t += *i;
++i;
}
return t;
}
void
- XWwwFormUrlEncoded::iterateVars(const KVh & h, ba::split_iterator<std::string::const_iterator> pi)
+ XWwwFormUrlEncoded::iterateVars(const KVh & h, ba::split_iterator<std::string_view::const_iterator> pi)
{
for (; pi != decltype(pi)(); ++pi) {
auto eq = std::find(pi->begin(), pi->end(), '=');
@@ -131,7 +140,7 @@ namespace IceSpider {
}
void
- XWwwFormUrlEncoded::iterateVars(const std::string & input, const KVh & h, const std::string & split)
+ XWwwFormUrlEncoded::iterateVars(const std::string_view & input, const KVh & h, const std::string_view & split)
{
if (!input.empty()) {
iterateVars(h, ba::make_split_iterator(input, ba::first_finder(split, ba::is_equal())));
@@ -141,7 +150,7 @@ namespace IceSpider {
void
XWwwFormUrlEncoded::iterateVars(const KVh & h)
{
- iterateVars(input, h, "&");
+ iterateVars(input, h, "&"sv);
}
void
diff --git a/icespider/core/xwwwFormUrlEncoded.h b/icespider/core/xwwwFormUrlEncoded.h
index 4f6cdae..68f6480 100644
--- a/icespider/core/xwwwFormUrlEncoded.h
+++ b/icespider/core/xwwwFormUrlEncoded.h
@@ -13,14 +13,14 @@ namespace IceSpider {
XWwwFormUrlEncoded(std::istream & in);
void Deserialize(Slicer::ModelPartForRootPtr mp) override;
- DLL_PUBLIC static void iterateVars(const std::string & input, const KVh & h, const std::string & split);
+ DLL_PUBLIC static void iterateVars(const std::string_view & input, const KVh & h, const std::string_view & split);
- DLL_PUBLIC static std::string urldecode(std::string::const_iterator s, std::string::const_iterator);
- DLL_PUBLIC static std::string urlencode(std::string::const_iterator s, std::string::const_iterator);
- DLL_PUBLIC static std::string urlencode(const std::string & s);
+ DLL_PUBLIC static std::string urldecode(std::string_view::const_iterator s, std::string_view::const_iterator);
+ DLL_PUBLIC static std::string urlencode(std::string_view::const_iterator s, std::string_view::const_iterator);
+ DLL_PUBLIC static std::string urlencode(const std::string_view & s);
private:
- static inline void iterateVars(const KVh & h, boost::algorithm::split_iterator<std::string::const_iterator> pi);
+ static inline void iterateVars(const KVh & h, boost::algorithm::split_iterator<std::string_view::const_iterator> pi);
void iterateVars(const KVh & h);
diff --git a/icespider/fcgi/cgiRequestBase.cpp b/icespider/fcgi/cgiRequestBase.cpp
index 1daab68..73a6770 100644
--- a/icespider/fcgi/cgiRequestBase.cpp
+++ b/icespider/fcgi/cgiRequestBase.cpp
@@ -9,12 +9,7 @@
#include <formatters.h>
namespace ba = boost::algorithm;
-
-namespace std {
- ostream & operator<<(ostream & s, const IceSpider::CgiRequestBase::Env & e) {
- return s.write(std::get<0>(e), std::get<1>(e) - std::get<0>(e));
- }
-}
+using namespace std::literals;
#define CGI_CONST(NAME) static const std::string_view NAME(#NAME)
@@ -38,14 +33,15 @@ namespace IceSpider {
CgiRequestBase::addenv(const char * const e)
{
if (auto eq = strchr(e, '=')) {
- envmap.insert({ std::string_view(e, eq - e), Env(eq + 1, strchr(eq, '\0')) });
+ envmap.insert({ std::string_view(e, eq - e), eq + 1 });
}
}
+ inline
std::string
- operator*(const CgiRequestBase::Env & t)
+ operator*(const std::string_view & t)
{
- return std::string(std::get<0>(t), std::get<1>(t));
+ return std::string(t);
}
void
@@ -62,15 +58,15 @@ namespace IceSpider {
auto qs = envmap.find(QUERY_STRING);
if (qs != envmap.end()) {
- XWwwFormUrlEncoded::iterateVars(*qs->second, [this](auto k, auto v) {
+ XWwwFormUrlEncoded::iterateVars(qs->second, [this](auto k, auto v) {
qsmap.insert({ k, v });
- }, "&");
+ }, "&"sv);
}
auto cs = envmap.find(HTTP_COOKIE);
if (cs != envmap.end()) {
- XWwwFormUrlEncoded::iterateVars(*cs->second, [this](auto k, auto v) {
+ XWwwFormUrlEncoded::iterateVars(cs->second, [this](auto k, auto v) {
cookiemap.insert({ k, v });
- }, "; ");
+ }, "; "sv);
}
}
diff --git a/icespider/fcgi/cgiRequestBase.h b/icespider/fcgi/cgiRequestBase.h
index 88bdc52..9ccdfe3 100644
--- a/icespider/fcgi/cgiRequestBase.h
+++ b/icespider/fcgi/cgiRequestBase.h
@@ -15,8 +15,7 @@ namespace IceSpider {
void initialize();
public:
- typedef std::tuple<const char * const, const char * const> Env;
- typedef std::map<std::string_view, Env> VarMap;
+ typedef std::map<std::string_view, const std::string_view> VarMap;
const PathElements & getRequestPath() const override;
PathElements & getRequestPath() override;