requests feature with cURL and emscript
parent
c241085afb
commit
e2dc35fea9
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
include(cmake/color.cmake)
|
include(cmake/color.cmake)
|
||||||
set(BLT_VERSION 5.2.43)
|
set(BLT_VERSION 5.3.0)
|
||||||
|
|
||||||
set(BLT_TARGET BLT)
|
set(BLT_TARGET BLT)
|
||||||
|
|
||||||
|
@ -108,6 +108,7 @@ endif ()
|
||||||
|
|
||||||
#include zlib if the user has it.
|
#include zlib if the user has it.
|
||||||
find_package(ZLIB QUIET)
|
find_package(ZLIB QUIET)
|
||||||
|
find_package(CURL QUIET)
|
||||||
|
|
||||||
if (${ZLIB_FOUND})
|
if (${ZLIB_FOUND})
|
||||||
include_directories(${ZLIB_INCLUDE_DIRS})
|
include_directories(${ZLIB_INCLUDE_DIRS})
|
||||||
|
@ -115,6 +116,13 @@ else ()
|
||||||
message("ZLIB was not found, this is fine however if you wish you use gzip with NBT it is required.")
|
message("ZLIB was not found, this is fine however if you wish you use gzip with NBT it is required.")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (${CURL_FOUND})
|
||||||
|
message(STATUS "Linking cURL!")
|
||||||
|
include_directories(${CURL_INCLUDE_DIRS})
|
||||||
|
else ()
|
||||||
|
message(STATUS "cURL not found, some library features will be disabled!")
|
||||||
|
endif ()
|
||||||
|
|
||||||
include_directories(include/)
|
include_directories(include/)
|
||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}/config/)
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/config/)
|
||||||
|
|
||||||
|
@ -148,6 +156,11 @@ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libraries/parallel-hashmap)
|
||||||
target_include_directories(${BLT_TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/libraries/parallel-hashmap)
|
target_include_directories(${BLT_TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/libraries/parallel-hashmap)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (${CURL_FOUND})
|
||||||
|
target_include_directories(${BLT_TARGET} PUBLIC ${CURL_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(${BLT_TARGET} PUBLIC ${CURL_LIBRARIES})
|
||||||
|
endif ()
|
||||||
|
|
||||||
message("BLT ${Yellow}${BLT_VERSION}${ColourReset} Successfully included!")
|
message("BLT ${Yellow}${BLT_VERSION}${ColourReset} Successfully included!")
|
||||||
|
|
||||||
message("Installing to ${CMAKE_INSTALL_LIBDIR} with headers at ${CMAKE_INSTALL_INCLUDEDIR}")
|
message("Installing to ${CMAKE_INSTALL_LIBDIR} with headers at ${CMAKE_INSTALL_INCLUDEDIR}")
|
||||||
|
|
|
@ -86,7 +86,7 @@ namespace blt::fs
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void seek(i64 offset, seek_origin origin = seek_origin::seek_set)
|
virtual void seek(i64, seek_origin)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
#pragma once
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Brett Terpstra
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLT_STD_REQUESTS_H
|
||||||
|
#define BLT_STD_REQUESTS_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace blt::requests
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string send_get_request(const std::string& url);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //BLT_STD_REQUESTS_H
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* <Short Description>
|
||||||
|
* Copyright (C) 2025 Brett Terpstra
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <blt/std/requests.h>
|
||||||
|
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
#include <emscripten.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__has_include) && __has_include(<curl/curl.h>)
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#define BLT_HAS_CURL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace blt::requests
|
||||||
|
{
|
||||||
|
#ifdef BLT_HAS_CURL
|
||||||
|
struct curl_init_t
|
||||||
|
{
|
||||||
|
curl_init_t()
|
||||||
|
{
|
||||||
|
const auto version_data = curl_version_info(CURLVERSION_NOW);
|
||||||
|
if (!(version_data->features & CURL_VERSION_THREADSAFE))
|
||||||
|
{
|
||||||
|
thread_safe = false;
|
||||||
|
}
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
~curl_init_t()
|
||||||
|
{
|
||||||
|
curl_global_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool thread_safe = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct curl_easy_init_t
|
||||||
|
{
|
||||||
|
curl_easy_init_t(): curl(curl_easy_init())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~curl_easy_init_t()
|
||||||
|
{
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
|
||||||
|
CURL* curl;
|
||||||
|
};
|
||||||
|
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
static curl_init_t curl_init_obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
CURL* easy_init()
|
||||||
|
{
|
||||||
|
thread_local curl_easy_init_t curl_easy_init_obj;
|
||||||
|
return curl_easy_init_obj.curl;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t write_to_string_func(const void* data, const size_t size, const size_t nmemb, void* user_data) {
|
||||||
|
auto& str = *static_cast<std::string*>(user_data);
|
||||||
|
str.append(static_cast<const char*>(data), size * nmemb);
|
||||||
|
return size * nmemb;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::string send_get_request(const std::string& url)
|
||||||
|
{
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
auto* str = static_cast<char*>(EM_ASM_PTR(
|
||||||
|
{ const v = await fetch('$0', { 'credentials': 'omit', 'headers': { 'User-Agent':
|
||||||
|
'Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0', 'Accept': '/', 'Accept-Language': 'en-US,en;q=0.5',
|
||||||
|
'Priority': 'u=4' }, 'method': 'GET', 'mode': 'cors' }); if (!v.ok) { throw v.status; } return stringToNewUTF8(await response.text());
|
||||||
|
}, url.c_str()));
|
||||||
|
std::string str_obj{str};
|
||||||
|
free(str);
|
||||||
|
return str_obj;
|
||||||
|
#else
|
||||||
|
init();
|
||||||
|
auto curl = easy_init();
|
||||||
|
if (!curl)
|
||||||
|
throw std::runtime_error("Failed to initialize curl");
|
||||||
|
std::string response_string;
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast<void*>(&response_string));
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_to_string_func);
|
||||||
|
|
||||||
|
const auto res = curl_easy_perform(curl);
|
||||||
|
if(res != CURLE_OK)
|
||||||
|
throw std::runtime_error(curl_easy_strerror(res));
|
||||||
|
|
||||||
|
return response_string;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue