April 21th 2024 update

This commit is contained in:
Ned Wright
2024-04-21 12:38:24 +00:00
parent 189c9209c9
commit 66ed4a8d81
73 changed files with 994 additions and 1166 deletions

View File

@@ -244,7 +244,7 @@ private:
dbgTrace(D_CONFIG) << "File system path reloaded: " << config_directory_path;
}
void
bool
sendOrchestatorReloadStatusMsg(const LoadNewConfigurationStatus &status)
{
I_Messaging *messaging = Singleton::Consume<I_Messaging>::by<ConfigComponent>();
@@ -262,7 +262,7 @@ private:
MessageMetadata secondary_port_req_md("127.0.0.1", 7778);
secondary_port_req_md.setConnectioFlag(MessageConnectionConfig::ONE_TIME_CONN);
secondary_port_req_md.setConnectioFlag(MessageConnectionConfig::UNSECURE_CONN);
messaging->sendSyncMessageWithoutResponse(
service_config_status = messaging->sendSyncMessageWithoutResponse(
HTTPMethod::POST,
"/set-reconf-status",
status,
@@ -270,6 +270,11 @@ private:
secondary_port_req_md
);
}
if (!service_config_status) {
dbgWarning(D_CONFIG) << "Unsuccessful attempt to send configuration reload status";
return false;
}
return true;
}
unordered_map<TenantProfilePair, map<vector<string>, PerContextValue>> configuration_nodes;
@@ -935,7 +940,15 @@ ConfigComponent::Impl::reloadConfigurationContinuesWrapper(const string &version
mainloop->stop(routine_id);
LoadNewConfigurationStatus finished(id, service_name, !res, true);
if (!res) finished.setError("Failed to reload configuration");
sendOrchestatorReloadStatusMsg(finished);
I_TimeGet *time = Singleton::Consume<I_TimeGet>::by<ConfigComponent>();
auto send_status_time_out = time->getMonotonicTime() + chrono::seconds(180);
while (time->getMonotonicTime() < send_status_time_out) {
if (sendOrchestatorReloadStatusMsg(finished)) break;
mainloop->yield(chrono::seconds(1));
}
if (time->getMonotonicTime() >= send_status_time_out) {
dbgWarning(D_CONFIG) << "Failed to send configuration reload status(finish) to the orchestrator";
}
is_continuous_report = false;
}

View File

@@ -24,6 +24,7 @@ enum AttachmentType
NGINX_ATT_ID,
PRELOAD_ATT_ID,
SQUID_ATT_ID,
ENVOY_ATT_ID,
#ifdef __cplusplus
COUNT
#endif

View File

@@ -17,7 +17,7 @@
#include <string>
#include <stdbool.h>
enum class EnvType { LINUX, K8S, COUNT };
enum class EnvType { LINUX, DOCKER, K8S, NON_CRD_K8S, COUNT };
class I_EnvDetails
{

View File

@@ -21,6 +21,8 @@
#include "intelligence_is_v2/intelligence_response.h"
#include "intelligence_is_v2/intelligence_types_v2.h"
#include "intelligence_is_v2/query_request_v2.h"
#include "messaging/messaging_enums.h"
#include "messaging/messaging_metadata.h"
#include "maybe_res.h"
namespace Intelligence {
@@ -43,18 +45,29 @@ public:
getResponse(
const std::vector<QueryRequest> &query_requests,
bool is_pretty,
bool is_bulk
bool is_bulk,
const MessageMetadata &req_md
) const = 0;
virtual Maybe<Intelligence::Response> getResponse(const QueryRequest &query_request, bool is_pretty) const = 0;
virtual Maybe<Intelligence::Response>
getResponse(const QueryRequest &query_request, bool is_pretty, const MessageMetadata &req_md) const = 0;
template<typename Data>
Maybe<std::vector<AssetReply<Data>>>
queryIntelligence(QueryRequest &query_request, bool ignore_in_progress = false, bool is_pretty = true);
queryIntelligence(
QueryRequest &query_request,
bool ignore_in_progress = false,
bool is_pretty = true,
MessageMetadata req_md = MessageMetadata("", 0)
);
template<typename Data>
Maybe<std::vector<Maybe<std::vector<AssetReply<Data>>>>>
queryIntelligence(std::vector<QueryRequest> &query_requests, bool is_pretty = true);
queryIntelligence(
std::vector<QueryRequest> &query_requests,
bool is_pretty = true,
MessageMetadata req_md = MessageMetadata("", 0)
);
protected:
virtual ~I_Intelligence_IS_V2() {}

View File

@@ -76,7 +76,7 @@ public:
MessageMetadata message_metadata = MessageMetadata()
) = 0;
virtual Maybe<HTTPStatusCode, HTTPResponse> downloadFile(
virtual Maybe<void, HTTPResponse> downloadFile(
const HTTPMethod method,
const std::string &uri,
const std::string &download_file_path,
@@ -84,7 +84,7 @@ public:
MessageMetadata message_metadata = MessageMetadata()
) = 0;
virtual Maybe<HTTPStatusCode, HTTPResponse> uploadFile(
virtual Maybe<void, HTTPResponse> uploadFile(
const std::string & uri,
const std::string & upload_file_path,
const MessageCategory category = MessageCategory::GENERIC,

View File

@@ -20,9 +20,14 @@
template <typename Data>
Maybe<std::vector<AssetReply<Data>>>
I_Intelligence_IS_V2::queryIntelligence(QueryRequest &query_request, bool ignore_in_progress, bool is_pretty)
I_Intelligence_IS_V2::queryIntelligence(
QueryRequest &query_request,
bool ignore_in_progress,
bool is_pretty,
MessageMetadata req_md
)
{
auto response = getResponse(query_request, is_pretty);
auto response = getResponse(query_request, is_pretty, req_md);
if (!response.ok()) return response.passErr();
auto serializable_response = response->getSerializableResponse<Data>();
@@ -39,9 +44,13 @@ I_Intelligence_IS_V2::queryIntelligence(QueryRequest &query_request, bool ignore
template<typename Data>
Maybe<std::vector<Maybe<std::vector<AssetReply<Data>>>>>
I_Intelligence_IS_V2::queryIntelligence(std::vector<QueryRequest> &query_requests, bool is_pretty)
I_Intelligence_IS_V2::queryIntelligence(
std::vector<QueryRequest> &query_requests,
bool is_pretty,
MessageMetadata req_md
)
{
auto res = getResponse(query_requests, is_pretty, true);
auto res = getResponse(query_requests, is_pretty, true, req_md);
if (!res.ok()) return res.passErr();
return res->getBulkData<Data>();

View File

@@ -26,11 +26,19 @@ public:
MOCK_CONST_METHOD1(sendInvalidation, bool(const Invalidation &invalidation));
MOCK_METHOD2(registerInvalidation, Maybe<uint>(const Invalidation &invalidation, const InvalidationCb &callback));
MOCK_METHOD1(unregisterInvalidation, void(uint id));
MOCK_CONST_METHOD4(
getResponse,
Maybe<Response>(
const std::vector<QueryRequest> &query_requests,
bool is_pretty,
bool is_bulk,
const MessageMetadata &req_md
)
);
MOCK_CONST_METHOD3(
getResponse,
Maybe<Response>(const std::vector<QueryRequest> &query_requests, bool is_pretty, bool is_bulk)
Maybe<Response>(const QueryRequest &query_request, bool is_pretty, const MessageMetadata &req_md)
);
MOCK_CONST_METHOD2(getResponse, Maybe<Response>(const QueryRequest &query_request, bool is_pretty));
MOCK_CONST_METHOD0(getIsOfflineOnly, bool(void));
MOCK_CONST_METHOD1(getOfflineInfoString, Maybe<std::string>(const SerializableQueryFilter &query));
};

View File

@@ -32,7 +32,7 @@ public:
MOCK_METHOD5(
downloadFile,
Maybe<HTTPStatusCode, HTTPResponse> (
Maybe<void, HTTPResponse> (
HTTPMethod,
const string &,
const string &,
@@ -43,7 +43,7 @@ public:
MOCK_METHOD4(
uploadFile,
Maybe<HTTPStatusCode, HTTPResponse> (
Maybe<void, HTTPResponse> (
const string &,
const string &,
MessageCategory,
@@ -62,10 +62,4 @@ operator<<(std::ostream &os, const HTTPResponse &)
return os;
}
static std::ostream &
operator<<(std::ostream &os, const HTTPStatusCode &)
{
return os;
}
#endif // __MOCK_MESSAGING_H__

View File

@@ -149,7 +149,7 @@ DEFINE_FLAG(D_COMPONENT, D_ALL)
DEFINE_FLAG(D_UPSTREAM_KEEPALIVE, D_REVERSE_PROXY)
DEFINE_FLAG(D_FORWARD_PROXY, D_REVERSE_PROXY)
DEFINE_FLAG(D_IDA_SAML, D_COMPONENT)
DEFINE_FLAG(D_IDA, D_COMPONENT)
DEFINE_FLAG(D_IOT_NEXT, D_COMPONENT)
DEFINE_FLAG(D_IOT_AUXILIARY, D_IOT_NEXT)

View File

@@ -70,7 +70,7 @@ public:
std::vector<StrAttributes> getAttributes() const { return attributes; }
const Maybe<std::string, void> & getSourceId() const { return source_id; }
const Maybe<ObjectType, void> & getObjectType() const { return object_type; }
InvalidationType getInvalidationType() const { return invalidation_type; }
const Maybe<InvalidationType, void> & getInvalidationType() const { return invalidation_type; }
Maybe<std::string, void> getRegistrationID() const;
bool report(I_Intelligence_IS_V2 *interface) const;
@@ -92,7 +92,7 @@ private:
std::vector<StrAttributes> attributes;
Maybe<std::string, void> source_id;
Maybe<ObjectType, void> object_type;
InvalidationType invalidation_type = InvalidationType::ADD;
Maybe<InvalidationType, void> invalidation_type;
Maybe<uint, void> listening_id;
Maybe<std::string, void> registration_id;
};

View File

@@ -68,6 +68,7 @@ enum class Tags {
API_DISCOVERY,
NGINX_PROXY_MANAGER,
WEB_SERVER_APISIX,
DEPLOYMENT_DOCKER,
COUNT
};

View File

@@ -34,6 +34,10 @@ ValidBulkQueryResponse::serialize(cereal::JSONInputArchive &ar)
void
IntelligenceQueryBulkResponse::serialize(cereal::JSONInputArchive &ar)
{
ar(cereal::make_nvp("errors", errors));
ar(cereal::make_nvp("queriesResponse", valid_responses));
try {
ar(cereal::make_nvp("errors", errors));
} catch (const cereal::Exception &e) {
ar.setNextName(nullptr);
}
}

View File

@@ -14,6 +14,8 @@
#ifndef __INTELLIGENCE_REQUEST_H__
#define __INTELLIGENCE_REQUEST_H__
#include "intelligence_is_v2/query_request_v2.h"
#include "messaging/messaging_enums.h"
#include "messaging/messaging_metadata.h"
#include <vector>
#include "maybe_res.h"
@@ -23,9 +25,14 @@ namespace Intelligence {
class IntelligenceRequest : ClientRest
{
public:
IntelligenceRequest(const std::vector<QueryRequest> &queries, bool is_pretty, bool is_bulk)
IntelligenceRequest(
const std::vector<QueryRequest> &queries,
bool is_pretty,
bool is_bulk,
const MessageMetadata &req_md
)
:
queries(queries), is_pretty(is_pretty), is_bulk(is_bulk)
queries(queries), is_pretty(is_pretty), is_bulk(is_bulk), req_md(req_md)
{}
Maybe<void> checkAssetsLimit() const;
@@ -38,12 +45,14 @@ public:
size_t getSize() const { return queries.size(); }
bool isBulk() const { return is_bulk; }
const MessageMetadata & getReqMD() const { return req_md; }
private:
const std::vector<QueryRequest> &queries;
bool is_pretty = true;
bool is_bulk = false;
Maybe<std::string> response_from_fog = genError("Uninitialized");
const MessageMetadata &req_md;
};
}

View File

@@ -202,11 +202,26 @@ public:
if (objectType.isActive()) {
auto type = object_names.find(objectType.get());
if (type != object_names.end()) invalidation.setObjectType(type->second);
if (type != object_names.end()) {
invalidation.setObjectType(type->second);
}
else {
dbgWarning(D_INTELLIGENCE) << "Received invalid object type: " << objectType.get();
}
}
if (sourceId.isActive()) invalidation.setSourceId(sourceId.get());
if (invalidationType.isActive()) {
auto type = invalidation_type_names.find(invalidationType.get());
if (type != invalidation_type_names.end()) {
invalidation.setInvalidationType(type->second);
}
else {
dbgWarning(D_INTELLIGENCE) << "Received invalid invalidation type: " << invalidationType.get();
}
}
string registration_id = "";
if (invalidationRegistrationId.isActive()) registration_id = invalidationRegistrationId.get();
@@ -227,6 +242,7 @@ private:
C2S_OPTIONAL_PARAM(string, invalidationRegistrationId);
C2S_OPTIONAL_PARAM(vector<StrAttributes>, mainAttributes);
C2S_OPTIONAL_PARAM(vector<StrAttributes>, attributes);
C2S_OPTIONAL_PARAM(string, invalidationType);
};
class IntelligenceComponentV2::Impl
@@ -280,9 +296,14 @@ public:
}
Maybe<Response>
getResponse(const vector<QueryRequest> &query_requests, bool is_pretty, bool is_bulk) const override
getResponse(
const vector<QueryRequest> &query_requests,
bool is_pretty,
bool is_bulk,
const MessageMetadata &req_md
) const override
{
IntelligenceRequest intelligence_req(query_requests, is_pretty, is_bulk);
IntelligenceRequest intelligence_req(query_requests, is_pretty, is_bulk, req_md);
if (!intelligence_req.checkAssetsLimit().ok()) return intelligence_req.checkAssetsLimit().passErr();
if (!intelligence_req.checkMinConfidence().ok()) return intelligence_req.checkMinConfidence().passErr();
if (intelligence_req.isPagingActivated()) {
@@ -297,10 +318,10 @@ public:
}
Maybe<Intelligence::Response>
getResponse(const QueryRequest &query_request, bool is_pretty) const override
getResponse(const QueryRequest &query_request, bool is_pretty, const MessageMetadata &req_md) const override
{
vector<QueryRequest> queries = {query_request};
return getResponse(queries, is_pretty, false);
return getResponse(queries, is_pretty, false, req_md);
}
private:
@@ -312,6 +333,11 @@ private:
if (!is_supported) {
is_supported = getProfileAgentSettingWithDefault<bool>(false, "agent.config.supportInvalidation");
}
if (!is_supported) {
is_supported = getConfigurationWithDefault(false, "intelligence", "support Invalidation");
}
return is_supported;
}
@@ -390,7 +416,8 @@ private:
auto tenant = details->getTenantId();
if (tenant == "") tenant = "Global";
headers["X-Tenant-Id"] = tenant;
auto agent = details->getAgentId();
auto rest = Singleton::Consume<I_RestApi>::by<IntelligenceComponentV2>();
auto agent = details->getAgentId() + ":" + to_string(rest->getListeningPort());
headers["X-Source-Id"] = agent;
return headers;
@@ -474,6 +501,7 @@ IntelligenceComponentV2::preload()
{
registerExpectedConfiguration<uint>("intelligence", "maximum request overall time");
registerExpectedConfiguration<uint>("intelligence", "maximum request lap time");
registerExpectedConfiguration<bool>("intelligence", "support Invalidation");
registerExpectedSetting<string>("intelligence", "local intelligence server ip");
registerExpectedSetting<uint>("intelligence", primary_port_setting);
registerExpectedSetting<uint>("intelligence", secondary_port_setting);

View File

@@ -126,7 +126,7 @@ TEST_F(IntelligenceComponentMockTest, getResponseErrorTest)
QueryRequest request(Condition::EQUALS, "category", "cloud", true);
Maybe<Intelligence::Response> res_error = genError("Test error");
EXPECT_CALL(intelligence_mock, getResponse(_, _)
EXPECT_CALL(intelligence_mock, getResponse(_, _, _)
).WillOnce(Return(res_error));
auto maybe_ans = intell->queryIntelligence<Profile>(request);
@@ -180,7 +180,7 @@ TEST_F(IntelligenceComponentMockTest, getResponseTest)
Intelligence::Response response(response_str, 1, false);
EXPECT_CALL(intelligence_mock, getResponse(_, _)
EXPECT_CALL(intelligence_mock, getResponse(_, _, _)
).WillOnce(Return(response));
auto maybe_ans = intell->queryIntelligence<Profile>(request);
@@ -341,7 +341,7 @@ TEST_F(IntelligenceComponentMockTest, bulkOnlineIntelligenceMockTest)
);
Intelligence::Response response(response_str, 4, true);
EXPECT_CALL(intelligence_mock, getResponse(_, _, _)
EXPECT_CALL(intelligence_mock, getResponse(_, _, _, _)
).WillOnce(Return(response));
auto maybe_ans = intell->queryIntelligence<Profile>(requests);

View File

@@ -24,7 +24,7 @@ USE_DEBUG_FLAG(D_INTELLIGENCE);
TEST(IntelligenceQueryTestV2, genJsonPrettySingleRequest) {
QueryRequest request(Condition::EQUALS, "phase", "testing", true);
vector<QueryRequest> requests = {request};
Intelligence::IntelligenceRequest query(requests, true, false);
Intelligence::IntelligenceRequest query(requests, true, false, MessageMetadata("", 0));
std::string expected = "{\n"
" \"limit\": 20,\n"
@@ -42,7 +42,7 @@ TEST(IntelligenceQueryTestV2, genJsonPrettySingleRequest) {
TEST(IntelligenceQueryTestV2, genJsonUnprettySingleRequest) {
QueryRequest request(Condition::EQUALS, "phase", "testing", true);
vector<QueryRequest> requests = {request};
Intelligence::IntelligenceRequest query(requests, false, false);
Intelligence::IntelligenceRequest query(requests, false, false, MessageMetadata("", 0));
std::string expected = "{"
"\"limit\":20,"
@@ -59,7 +59,7 @@ TEST(IntelligenceQueryTestV2, genJsonUnprettySingleRequest) {
TEST(IntelligenceQueryTestV2, genJsonUnprettySingleRequestSpaces) {
QueryRequest request(Condition::EQUALS, "ph ase", "te sti\" n g\\", true);
vector<QueryRequest> requests = {request};
Intelligence::IntelligenceRequest query(requests, false, false);
Intelligence::IntelligenceRequest query(requests, false, false, MessageMetadata("", 0));
std::string expected = "{"
"\"limit\":20,"
"\"fullResponse\":true,"
@@ -76,7 +76,7 @@ TEST(IntelligenceQueryTestV2, genJsonPrettyBulkRequests) {
QueryRequest request1(Condition::EQUALS, "phase", "testing", true);
QueryRequest request2(Condition::EQUALS, "height", "testing", 25);
std::vector<QueryRequest> requests = {request1, request2};
Intelligence::IntelligenceRequest query(requests, true, true);
Intelligence::IntelligenceRequest query(requests, true, true, MessageMetadata("", 0));
std::string expected = "{\n"
" \"queries\": [\n"
@@ -114,7 +114,7 @@ TEST(IntelligenceQueryTestV2, genJsonUnprettyBulkRequest) {
QueryRequest request1(Condition::EQUALS, "phase", "testing", true);
QueryRequest request2(Condition::EQUALS, "height", "testing", 25);
std::vector<QueryRequest> requests = {request1, request2};
Intelligence::IntelligenceRequest query(requests, false, true);
Intelligence::IntelligenceRequest query(requests, false, true, MessageMetadata("", 0));
std::string expected = "{"
"\"queries\":[{"

View File

@@ -117,12 +117,12 @@ TEST(InvalidationBasic, SettersAndGetters)
EXPECT_EQ(invalidation.getClassifier(ClassifierType::GROUP), "");
EXPECT_EQ(invalidation.getClassifier(ClassifierType::ORDER), "");
EXPECT_EQ(invalidation.getClassifier(ClassifierType::KIND), "");
EXPECT_EQ(invalidation.getInvalidationType(), InvalidationType::ADD);
EXPECT_TRUE(invalidation.getMainAttributes().empty());
EXPECT_TRUE(invalidation.getAttributes().empty());
EXPECT_FALSE(invalidation.getSourceId().ok());
EXPECT_FALSE(invalidation.getObjectType().ok());
EXPECT_FALSE(invalidation.getInvalidationType().ok());
set<string> main_vals = { "2", "3" };
set<string> vals = { "5", "6" };
@@ -152,7 +152,7 @@ TEST(InvalidationBasic, SettersAndGetters)
EXPECT_EQ(invalidation.getAttributes().begin()->getStringSetAttr("attr2").unpack(), vals);
EXPECT_EQ(invalidation.getSourceId().unpack(), "id");
EXPECT_EQ(invalidation.getObjectType().unpack(), Intelligence::ObjectType::ASSET);
EXPECT_EQ(invalidation.getInvalidationType(), InvalidationType::DELETE);
EXPECT_EQ(invalidation.getInvalidationType().unpack(), InvalidationType::DELETE);
}
TEST(InvalidationBasic, Matching)
@@ -348,7 +348,6 @@ TEST_F(IntelligenceInvalidation, sending_public_invalidation)
"\"category\": \"bbb\", "
"\"family\": \"ccc\", "
"\"objectType\": \"asset\", "
"\"invalidationType\": \"add\", "
"\"sourceId\": \"id\", "
"\"mainAttributes\": [ { \"attr2\": \"2\" } ], "
"\"attributes\": [ { \"attr3\": \"3\" } ]"
@@ -389,7 +388,6 @@ TEST_F(IntelligenceInvalidation, multiple_assets_invalidation)
"\"category\": \"bbb\", "
"\"family\": \"ccc\", "
"\"objectType\": \"asset\", "
"\"invalidationType\": \"add\", "
"\"sourceId\": \"id\", "
"\"mainAttributes\": [ { \"attr2\": \"2\" }, { \"attr2\": \"22\", \"attr3\": [ \"33\", \"44\" ] } ], "
"\"attributes\": [ { \"attr3\": \"3\" } ]"
@@ -439,7 +437,6 @@ TEST_F(IntelligenceInvalidation, sending_private_invalidation)
"\"category\": \"bbb\", "
"\"family\": \"ccc\", "
"\"objectType\": \"asset\", "
"\"invalidationType\": \"add\", "
"\"sourceId\": \"id\", "
"\"mainAttributes\": [ { \"attr2\": \"2\" } ], "
"\"attributes\": [ { \"attr3\": \"3\" } ]"

View File

@@ -142,7 +142,14 @@ Sender::sendMessage()
{
if (server_port.ok() && !server_ip.ok()) return genError("Can't send intelligence request. Server ip invalid");
if (server_ip.ok() && !server_port.ok()) return genError("Can't send intelligence request. Server port invalid");
auto req_md = server_ip.ok() ? MessageMetadata(*server_ip, *server_port, conn_flags) : MessageMetadata();
MessageMetadata req_md;
if (server_ip.ok()) {
req_md = MessageMetadata(*server_ip, *server_port, conn_flags);
}
else {
req_md = request.getReqMD().getHostName().empty() ? MessageMetadata() : request.getReqMD();
}
if (server_ip.ok()) {
dbgTrace(D_INTELLIGENCE)

View File

@@ -27,6 +27,7 @@ Invalidation::Invalidation(const string &class_value)
:
source_id(genError<void>()),
object_type(genError<void>()),
invalidation_type(genError<void>()),
listening_id(genError<void>()),
registration_id(genError<void>())
{
@@ -133,7 +134,9 @@ Invalidation::genObject() const
}
if (object_type.ok()) invalidation <<", \"objectType\": \"" << convertObjectType.at(*object_type) << '"';
invalidation << ", \"invalidationType\": \"" << convertInvalidationType.at(invalidation_type) << '"';
if (invalidation_type.ok()) {
invalidation << ", \"invalidationType\": \"" << convertInvalidationType.at(*invalidation_type) << '"';
}
if (source_id.ok()) invalidation <<", \"sourceId\": \"" << *source_id << '"';
if (registration_id.ok()) invalidation <<", \"invalidationRegistrationId\": \"" << *registration_id << '"';
@@ -211,6 +214,10 @@ Invalidation::matches(const Invalidation &other) const
if (!other.object_type.ok() || *object_type != *other.object_type) return false;
}
if (invalidation_type.ok()) {
if (!other.invalidation_type.ok() || *invalidation_type != *other.invalidation_type) return false;
}
if (source_id.ok()) {
if (!other.source_id.ok() || *source_id != *other.source_id) return false;
}

View File

@@ -513,7 +513,6 @@ private:
{
if (!isBioSocketReady()) return 0;
dbgTrace(D_MESSAGING) << "Sending request: " << printOut(request);
size_t offset = request.length() - data_left_to_send;
auto curr_data_to_send = request.c_str() + offset;
int data_sent_len = BIO_write(bio.get(), curr_data_to_send, data_left_to_send);
@@ -544,7 +543,6 @@ private:
int receive_len = BIO_read(bio.get(), buffer, sizeof(buffer) - 1);
if (receive_len > 0) {
dbgTrace(D_CONNECTION) << "Received " << receive_len << " bytes";
return string(buffer, receive_len);
}

View File

@@ -54,7 +54,7 @@ public:
bool force_buffering = true
);
Maybe<HTTPStatusCode, HTTPResponse> downloadFile(
Maybe<void, HTTPResponse> downloadFile(
HTTPMethod method,
const std::string &uri,
const std::string &download_file_path,
@@ -62,7 +62,7 @@ public:
const MessageMetadata &message_metadata = MessageMetadata()
);
Maybe<HTTPStatusCode, HTTPResponse> uploadFile(
Maybe<void, HTTPResponse> uploadFile(
const std::string &uri,
const std::string &upload_file_path,
MessageCategory category,

View File

@@ -62,7 +62,7 @@ public:
return messaging_comp.sendAsyncMessage(method, uri, body, category, message_metadata, force_buffering);
}
Maybe<HTTPStatusCode, HTTPResponse>
Maybe<void, HTTPResponse>
downloadFile(
const HTTPMethod method,
const std::string &uri,
@@ -74,7 +74,7 @@ public:
return messaging_comp.downloadFile(method, uri, download_file_path, category, message_metadata);
}
Maybe<HTTPStatusCode, HTTPResponse>
Maybe<void, HTTPResponse>
uploadFile(
const std::string &uri,
const std::string &upload_file_path,

View File

@@ -61,7 +61,9 @@ HTTPRequest::setConnectionHeaders(const Connection &conn)
}
}
insertHeader("Host", host);
if (headers.find("Host") == headers.end()) {
insertHeader("Host", host);
}
insertHeader("Content-Length", to_string(body.size()));
insertHeader("Content-type", "application/json");
insertHeader("Accept-Encoding", "identity");
@@ -82,10 +84,12 @@ HTTPRequest::prepareRequest(
{
HTTPRequest req(method, uri, headers, body);
if (!req.setConnectionHeaders(conn)) return genError("Failed to identify the HTTP method");
string agent_registration_query = R"("authenticationMethod": "token")";
bool dont_add_access_token = false;
if (headers.find("Host") != headers.end()) {
dont_add_access_token = true;
dbgTrace(D_MESSAGING) << "Request is not for FOG";
}
string agent_registration_query = R"("authenticationMethod": "token")";
if (method == HTTPMethod::CONNECT || body.find(agent_registration_query) != string::npos) {
dont_add_access_token = true;
dbgTrace(D_MESSAGING) << "Request is for agent authentication";
@@ -93,6 +97,8 @@ HTTPRequest::prepareRequest(
auto res = req.addAccessToken(conn, dont_add_access_token);
if (!res.ok()) return res.passErr();
if (!req.setConnectionHeaders(conn)) return genError("Failed to identify the HTTP method");
if (conn.isOverProxy()) {
auto res = req.addProxyAuthorization(conn);
if (!res.ok()) return res.passErr();

View File

@@ -145,7 +145,7 @@ MessagingComp::sendAsyncMessage(
i_messaging_buffer->pushNewBufferedMessage(body, method, uri, category, new_message_metadata, false);
}
Maybe<HTTPStatusCode, HTTPResponse>
Maybe<void, HTTPResponse>
MessagingComp::downloadFile(
HTTPMethod method,
const string &uri,
@@ -166,7 +166,9 @@ MessagingComp::downloadFile(
auto response = sendSyncMessage(method, uri, "", category, message_metadata);
if (!response.ok()) return response.passErr();
if (response.unpack().getHTTPStatusCode() != HTTPStatusCode::HTTP_OK) {
return genError(HTTPResponse(response.unpack().getHTTPStatusCode(), response.unpack().getBody()));
}
ofstream file_stream(download_file_path);
if (!file_stream.is_open()) {
string open_err = "Failed to open the destination file. Path: " + download_file_path;
@@ -177,10 +179,10 @@ MessagingComp::downloadFile(
file_stream.close();
dbgTrace(D_MESSAGING) << "Successfully downloaded and save file to: " << download_file_path;
return HTTPStatusCode::HTTP_OK;
return Maybe<void, HTTPResponse>();
}
Maybe<HTTPStatusCode, HTTPResponse>
Maybe<void, HTTPResponse>
MessagingComp::uploadFile(
const string &uri,
const string &upload_file_path,
@@ -205,9 +207,12 @@ MessagingComp::uploadFile(
sendSyncMessage(HTTPMethod::PUT, uri, buffer.str(), category, message_metadata);
if (!response.ok()) return response.passErr();
if (response.unpack().getHTTPStatusCode() != HTTPStatusCode::HTTP_OK) {
return genError(HTTPResponse(response.unpack().getHTTPStatusCode(), response.unpack().getBody()));
}
dbgTrace(D_MESSAGING) << "Successfully upload file from: " << upload_file_path;
return HTTPStatusCode::HTTP_OK;
return Maybe<void, HTTPResponse>();
}
bool

View File

@@ -183,7 +183,6 @@ TEST_F(TestMessagingComp, testUploadFile)
EXPECT_CALL(mock_messaging_connection, mockSendRequest(_, _, _)).WillOnce(Return(res));
auto upload_res = messaging_comp.uploadFile(uri, path, category, conn_metadata);
ASSERT_TRUE(upload_res.ok());
EXPECT_EQ(upload_res.unpack(), HTTPStatusCode::HTTP_OK);
}
TEST_F(TestMessagingComp, testDownloadFile)
@@ -207,7 +206,6 @@ TEST_F(TestMessagingComp, testDownloadFile)
EXPECT_CALL(mock_messaging_connection, mockSendRequest(_, _, _)).WillOnce(Return(res));
auto upload_res = messaging_comp.downloadFile(method, uri, "/tmp/test.txt", category, conn_metadata);
ASSERT_TRUE(upload_res.ok());
EXPECT_EQ(upload_res.unpack(), HTTPStatusCode::HTTP_OK);
}
bool

View File

@@ -110,7 +110,8 @@ TagAndEnumManagement::convertStringToTag(const string &tag)
{"apiDiscoveryCloudMessaging", ReportIS::Tags::API_DISCOVERY},
{"Playground", ReportIS::Tags::PLAYGROUND},
{"Nginx Proxy Manager", ReportIS::Tags::NGINX_PROXY_MANAGER},
{"APISIX Server", ReportIS::Tags::WEB_SERVER_APISIX}
{"APISIX Server", ReportIS::Tags::WEB_SERVER_APISIX},
{"Docker Deployment", ReportIS::Tags::DEPLOYMENT_DOCKER}
};
auto report_is_tag = strings_to_tags.find(tag);
@@ -318,7 +319,8 @@ EnumArray<Tags, string> TagAndEnumManagement::tags_translation_arr {
"Playground",
"apiDiscoveryCloudMessaging",
"Nginx Proxy Manager",
"APISIX Server"
"APISIX Server",
"Docker Deployment"
};
EnumArray<AudienceTeam, string> TagAndEnumManagement::audience_team_translation {