diff --git a/src/internal/.DS_Store b/src/internal/.DS_Store new file mode 100644 index 00000000..67805212 Binary files /dev/null and b/src/internal/.DS_Store differ diff --git a/src/internal/sio_client_impl.cpp b/src/internal/sio_client_impl.cpp index e67eae77..e8da085e 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); @@ -582,4 +583,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;