From b60eaf5fe632d059a73151f6e738f38e5febf2ae Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Fri, 15 Oct 2021 02:29:47 -0700 Subject: [PATCH] Move the serialiser to Flipper Summary: This change moves the existing serialiser from FlipperWebSocket to FlipperURLSerializer. The serialiser can be shared with Android as it no longer has any iOS dependencies. Reviewed By: fabiomassimo Differential Revision: D31571272 fbshipit-source-id: 0769b384d4143d7404fcfcf993d49dc1b00eeffd --- iOS/FlipperKit/FlipperWebSocket.mm | 63 +---------------------- xplat/Flipper/FlipperURLSerializer.cpp | 71 ++++++++++++++++++++++++++ xplat/Flipper/FlipperURLSerializer.h | 31 +++++++++++ 3 files changed, 104 insertions(+), 61 deletions(-) create mode 100644 xplat/Flipper/FlipperURLSerializer.cpp create mode 100644 xplat/Flipper/FlipperURLSerializer.h diff --git a/iOS/FlipperKit/FlipperWebSocket.mm b/iOS/FlipperKit/FlipperWebSocket.mm index e394c156b..7f66cf1ce 100644 --- a/iOS/FlipperKit/FlipperWebSocket.mm +++ b/iOS/FlipperKit/FlipperWebSocket.mm @@ -9,8 +9,8 @@ #import "FlipperWebSocket.h" #import -#import #import +#import #import #import #import @@ -28,65 +28,6 @@ namespace facebook { namespace flipper { -class WebSocketSerializer : public FlipperPayloadSerializer { - public: - void put(std::string key, std::string value) override { - object_[key] = value; - } - void put(std::string key, int value) override { - object_[key] = value; - } - std::string url_encode(const std::string& value) { - std::ostringstream escaped; - escaped.fill('0'); - escaped << std::hex; - - for (std::string::const_iterator i = value.begin(), n = value.end(); i != n; - ++i) { - std::string::value_type c = (*i); - - // Keep alphanumeric and other accepted characters intact - if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') { - escaped << c; - continue; - } - - // Any other characters are percent-encoded - escaped << std::uppercase; - escaped << '%' << std::setw(2) << int((unsigned char)c); - escaped << std::nouppercase; - } - - return escaped.str(); - } - std::string serialize() override { - std::string query = ""; - bool append = false; - - for (auto& pair : object_.items()) { - auto key = pair.first.asString(); - auto value = pair.second.asString(); - if (append) { - query += "&"; - } - query += key; - query += "="; - if (key == "csr") { - query += Base64::encode(value); - } else { - query += url_encode(value); - } - append = true; - } - - return query; - } - ~WebSocketSerializer() {} - - private: - folly::dynamic object_ = folly::dynamic::object(); -}; - FlipperWebSocket::FlipperWebSocket( FlipperConnectionEndpoint endpoint, std::unique_ptr payload) @@ -122,7 +63,7 @@ bool FlipperWebSocket::connect(FlipperConnectionManager* manager) { connectionURL += ":"; connectionURL += std::to_string(endpoint_.port); - auto serializer = WebSocketSerializer{}; + auto serializer = URLSerializer{}; payload_->serialize(serializer); auto payload = serializer.serialize(); diff --git a/xplat/Flipper/FlipperURLSerializer.cpp b/xplat/Flipper/FlipperURLSerializer.cpp new file mode 100644 index 000000000..df10641aa --- /dev/null +++ b/xplat/Flipper/FlipperURLSerializer.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "FlipperURLSerializer.h" +#include +#include +#include "FlipperBase64.h" + +namespace facebook { +namespace flipper { + +void URLSerializer::put(std::string key, std::string value) { + object_[key] = value; +} +void URLSerializer::put(std::string key, int value) { + object_[key] = value; +} + +std::string URLSerializer::serialize() { + std::string query = ""; + bool append = false; + + for (auto& pair : object_.items()) { + auto key = pair.first.asString(); + auto value = pair.second.asString(); + if (append) { + query += "&"; + } + query += key; + query += "="; + if (key == "csr") { + query += Base64::encode(value); + } else { + query += url_encode(value); + } + append = true; + } + + return query; +} + +std::string URLSerializer::url_encode(const std::string& value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (std::string::const_iterator i = value.begin(), n = value.end(); i != n; + ++i) { + std::string::value_type c = (*i); + + // Keep alphanumeric and other accepted characters intact + if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') { + escaped << c; + continue; + } + + // Any other characters are percent-encoded + escaped << std::uppercase; + escaped << '%' << std::setw(2) << int((unsigned char)c); + escaped << std::nouppercase; + } + + return escaped.str(); +} + +} // namespace flipper +} // namespace facebook diff --git a/xplat/Flipper/FlipperURLSerializer.h b/xplat/Flipper/FlipperURLSerializer.h new file mode 100644 index 000000000..ef1c77908 --- /dev/null +++ b/xplat/Flipper/FlipperURLSerializer.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include "FlipperTransportTypes.h" + +namespace facebook { +namespace flipper { + +class URLSerializer : public FlipperPayloadSerializer { + public: + void put(std::string key, std::string value) override; + void put(std::string key, int value) override; + + std::string serialize() override; + ~URLSerializer() {} + + private: + std::string url_encode(const std::string& value); + folly::dynamic object_ = folly::dynamic::object(); +}; + +} // namespace flipper +} // namespace facebook