From ffff9412e7c0d1fa3b8107ea1b4783f3d80520f5 Mon Sep 17 00:00:00 2001 From: Jianjun Zhu Date: Tue, 3 Jan 2017 09:05:43 +0800 Subject: [PATCH] URL encode query string. Percent encode query string so it can handle non-ascii characters and reserved characters. --- src/internal/.DS_Store | Bin 0 -> 6148 bytes src/internal/sio_client_impl.cpp | 18 +++++++++++++++++- src/internal/sio_client_impl.h | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/internal/.DS_Store diff --git a/src/internal/.DS_Store b/src/internal/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..67805212cc42671983e02e32f95b8dd02f6868e2 GIT binary patch literal 6148 zcmeHK!AiqG5PefCv?x;X;xR{01^*zFDD-MRpxRncj3#Kk=QI2$Kfu4yH@ibBzc z*$pv9h8#0$bAIJwUX*jL>R;oM`t})w7I1s8>Gp4^nH7z<> z&epOVf1Bm5mEoPW*E1Y787kbc<^zApYI}9LYQ-Mzh;7xBk5(L~F3x~6;0*k62H3Mz z1_u#+bOxLOXP{v~-wz2@F*U3shF1rNa0MXt=?+3$KNvM8F-#5Xh+Lsa3?;@;u`7ne zaQYM5mm1a)V>rYvA7YioZYUC}Gk+4cL(+&oIs?wYCIfqMI@11svHSkN8RRo(z!~^g z3`jrAvk4!`dTZz5wAUuoYpROwt0OicG(s!pUTwvv)FAXHY7kSyIwCz3{}2c?_}~ou GC<9+w(OU@s literal 0 HcmV?d00001 diff --git a/src/internal/sio_client_impl.cpp b/src/internal/sio_client_impl.cpp index 618dd1f4..7e310455 100644 --- a/src/internal/sio_client_impl.cpp +++ b/src/internal/sio_client_impl.cpp @@ -95,7 +95,8 @@ namespace sio query_str.append("&"); query_str.append(it->first); query_str.append("="); - query_str.append(it->second); + string query_str_value=encode_query_string(it->second); + query_str.append(query_str_value); } m_query_string=move(query_str); @@ -585,4 +586,19 @@ namespace sio return ctx; } #endif + + std::string client_impl::encode_query_string(const std::string &query){ + ostringstream ss; + ss << std::hex; + // Percent-encode (RFC3986) non-alphanumeric characters. + for(const char c : query){ + if((c >= 'a' && c <= 'z') || (c>= 'A' && c<= 'Z') || (c >= '0' && c<= '9')){ + ss << c; + } else { + ss << '%' << std::uppercase << std::setw(2) << int((unsigned char) c) << std::nouppercase; + } + } + ss << std::dec; + return ss.str(); + } } diff --git a/src/internal/sio_client_impl.h b/src/internal/sio_client_impl.h index 87ac1d03..311a267e 100644 --- a/src/internal/sio_client_impl.h +++ b/src/internal/sio_client_impl.h @@ -176,6 +176,9 @@ namespace sio context_ptr on_tls_init(connection_hdl con); #endif + // Percent encode query string + std::string encode_query_string(const std::string &query); + // Connection pointer for client functions. connection_hdl m_con; client_type m_client;