Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lib http client #697

Open
wants to merge 14 commits into
base: develop
Choose a base branch
from
Next Next commit
Add lib http client to pktvisor (#696)
  • Loading branch information
leoparente committed Oct 17, 2023
commit 72a9f99730d67bd16ebb7fd404b0d72039518c21
2 changes: 2 additions & 0 deletions conanfile.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ catch2/3.4.0
corrade/2020.06
cpp-httplib/0.14.1
docopt.cpp/0.6.3
gnutls/3.7.8
fast-cpp-csv-parser/cci.20211104
json-schema-validator/2.2.0
libmaxminddb/1.7.1
libnghttp2/1.57.0
nlohmann_json/3.11.2
openssl/1.1.1w
opentelemetry-proto/1.0.0
Expand Down
5 changes: 4 additions & 1 deletion libs/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ add_subdirectory(visor_test)
add_subdirectory(visor_transaction)
add_subdirectory(visor_tcp)
add_subdirectory(visor_dns)
add_subdirectory(visor_utils)
add_subdirectory(visor_utils)
if(NOT WIN32)
add_subdirectory(visor_http_client)
endif()
37 changes: 37 additions & 0 deletions libs/visor_http_client/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
message(STATUS "Visor Lib HTTP Client")

add_library(VisorLibHttpClient
httpssession.cpp
tcpsession.cpp
url_parser.c
)
add_library(Visor::Lib::HttpClient ALIAS VisorLibHttpClient)


target_include_directories(VisorLibHttpClient
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)

target_link_libraries(VisorLibHttpClient
PUBLIC
${CONAN_LIBS_LIBNGHTTP2}
${CONAN_LIBS_LIBUV}
${CONAN_LIBS_UVW}

${CONAN_LIBS_NETTLE}
${CONAN_LIBS_GMP}
${CONAN_LIBS_LIBICONV}
${CONAN_LIBS_ZLIB}
${CONAN_LIBS_ZSTD}
${CONAN_LIBS_BROTLI}
${CONAN_LIBS_GNUTLS}
)

## TEST SUITE
add_executable(unit-tests-visor-http-client test_driver.cpp)

target_link_libraries(unit-tests-visor-http-client
PRIVATE
Visor::Lib::HttpClient
${CONAN_LIBS_CATCH2})
120 changes: 120 additions & 0 deletions libs/visor_http_client/base64.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
base64.cpp and base64.h

base64 encoding and decoding with C++.

Version: 1.01.00

Copyright (C) 2004-2017 René Nyffenegger
ALTERED by Jeroen Wijenbergh to allow for encoding of URLs

This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.

2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.

3. This notice may not be removed or altered from any source distribution.

René Nyffenegger rene.nyffenegger@adp-gmbh.ch

*/

#include "base64.h"
#include <iostream>

static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789-_";


static inline bool is_base64(unsigned char c) {
return (isalnum(c) || (c == '-') || (c == '_'));
}

std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];

while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;

for(i = 0; (i <4) ; i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}

if (i)
{
for(j = i; j < 3; j++)
char_array_3[j] = '\0';

char_array_4[0] = ( char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

for (j = 0; (j < i + 1); j++)
ret += base64_chars[char_array_4[j]];

}

return ret;

}

std::string base64_decode(std::string const& encoded_string) {
size_t in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
std::string ret;

while (in_len-- && is_base64(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_]; in_++;
if (i ==4) {
for (i = 0; i <4; i++)
char_array_4[i] = base64_chars.find(char_array_4[i]) & 0xff;

char_array_3[0] = ( char_array_4[0] << 2 ) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

for (i = 0; (i < 3); i++)
ret += char_array_3[i];
i = 0;
}
}

if (i) {
for (j = 0; j < i; j++)
char_array_4[j] = base64_chars.find(char_array_4[j]) & 0xff;

char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);

for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
}

return ret;
}
14 changes: 14 additions & 0 deletions libs/visor_http_client/base64.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// base64 encoding and decoding with C++.
// Version: 1.01.00
//

#ifndef BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A
#define BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A

#include <string>

std::string base64_encode(unsigned char const* , unsigned int len);
std::string base64_decode(std::string const& s);

#endif /* BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A */
9 changes: 9 additions & 0 deletions libs/visor_http_client/http.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#ifndef FLAMETHROWER_HTTP_H
#define FLAMETHROWER_HTTP_H

enum class HTTPMethod {
POST,
GET,
};

#endif //FLAMETHROWER_HTTP_H
Loading