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
This commit is contained in:
Lorenzo Blasa
2021-10-15 02:29:47 -07:00
committed by Facebook GitHub Bot
parent 5944002c4c
commit b60eaf5fe6
3 changed files with 104 additions and 61 deletions

View File

@@ -9,8 +9,8 @@
#import "FlipperWebSocket.h" #import "FlipperWebSocket.h"
#import <Flipper/ConnectionContextStore.h> #import <Flipper/ConnectionContextStore.h>
#import <Flipper/FlipperBase64.h>
#import <Flipper/FlipperTransportTypes.h> #import <Flipper/FlipperTransportTypes.h>
#import <Flipper/FlipperURLSerializer.h>
#import <Flipper/Log.h> #import <Flipper/Log.h>
#import <folly/String.h> #import <folly/String.h>
#import <folly/futures/Future.h> #import <folly/futures/Future.h>
@@ -28,65 +28,6 @@
namespace facebook { namespace facebook {
namespace flipper { 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( FlipperWebSocket::FlipperWebSocket(
FlipperConnectionEndpoint endpoint, FlipperConnectionEndpoint endpoint,
std::unique_ptr<FlipperSocketBasePayload> payload) std::unique_ptr<FlipperSocketBasePayload> payload)
@@ -122,7 +63,7 @@ bool FlipperWebSocket::connect(FlipperConnectionManager* manager) {
connectionURL += ":"; connectionURL += ":";
connectionURL += std::to_string(endpoint_.port); connectionURL += std::to_string(endpoint_.port);
auto serializer = WebSocketSerializer{}; auto serializer = URLSerializer{};
payload_->serialize(serializer); payload_->serialize(serializer);
auto payload = serializer.serialize(); auto payload = serializer.serialize();

View File

@@ -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 <iomanip>
#include <sstream>
#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

View File

@@ -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 <folly/json.h>
#include <string>
#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