Lines
100 %
Functions
#pragma once
#include <string>
#include "envoy/buffer/buffer.h"
#include "envoy/network/connection.h"
#include "source/common/buffer/buffer_impl.h"
#include "source/common/common/logger.h"
#include "source/common/http/header_map_impl.h"
#include "source/common/http/headers.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
namespace Envoy {
namespace Extensions {
namespace Bootstrap {
namespace ReverseConnection {
class ReverseConnectionUtility : public Logger::Loggable<Logger::Id::connection> {
public:
static constexpr absl::string_view PING_MESSAGE = "RPING";
static constexpr absl::string_view PROXY_MESSAGE = "PROXY";
static constexpr absl::string_view DEFAULT_REVERSE_TUNNEL_REQUEST_PATH =
"/reverse_connections/request";
static constexpr absl::string_view TENANT_SCOPE_DELIMITER = ":";
struct TenantScopedIdentifierView {
absl::string_view tenant;
absl::string_view identifier;
bool hasTenant() const { return !tenant.empty(); }
};
static bool isPingMessage(absl::string_view data);
static Buffer::InstancePtr createPingResponse();
static bool sendPingResponse(Network::Connection& connection);
static Api::IoCallUint64Result sendPingResponse(Network::IoHandle& io_handle);
static bool handlePingMessage(absl::string_view data, Network::Connection& connection);
static bool extractPingFromHttpData(absl::string_view http_data);
static TenantScopedIdentifierView splitTenantScopedIdentifier(absl::string_view value);
static std::string buildTenantScopedIdentifier(absl::string_view tenant,
absl::string_view identifier);
private:
ReverseConnectionUtility() = delete;
// Header names used by reverse tunnel handshake over HTTP.
inline const Http::LowerCaseString& reverseTunnelNodeIdHeader() {
static const Http::LowerCaseString kHeader{
absl::StrCat(Http::Headers::get().prefix(), "-reverse-tunnel-node-id")};
return kHeader;
}
inline const Http::LowerCaseString& reverseTunnelClusterIdHeader() {
absl::StrCat(Http::Headers::get().prefix(), "-reverse-tunnel-cluster-id")};
inline const Http::LowerCaseString& reverseTunnelTenantIdHeader() {
absl::StrCat(Http::Headers::get().prefix(), "-reverse-tunnel-tenant-id")};
inline const Http::LowerCaseString& reverseTunnelUpstreamClusterNameHeader() {
absl::StrCat(Http::Headers::get().prefix(), "-reverse-tunnel-upstream-cluster-name")};
class ReverseConnectionMessageHandlerFactory {
static std::shared_ptr<class PingMessageHandler> createPingHandler();
class PingMessageHandler : public std::enable_shared_from_this<PingMessageHandler>,
public Logger::Loggable<Logger::Id::connection> {
PingMessageHandler() = default;
~PingMessageHandler() = default;
bool processPingMessage(absl::string_view data, Network::Connection& connection);
uint64_t getPingCount() const { return ping_count_; }
uint64_t ping_count_{0};
} // namespace ReverseConnection
} // namespace Bootstrap
} // namespace Extensions
} // namespace Envoy