Arachne 1.0
Arachne - the perpetual stitcher of Wikidata entities.
Loading...
Searching...
No Matches
transport.cpp File Reference
#include "pheidippides/transport.hpp"
#include "arachne/contracts.hpp"
#include "arachne/crypto.hpp"
#include <curl/curl.h>
#include <nlohmann/json.hpp>
#include <sys/stat.h>
#include <algorithm>
#include <array>
#include <atomic>
#include <cctype>
#include <cerrno>
#include <chrono>
#include <cstring>
#include <ctime>
#include <fcntl.h>
#include <iomanip>
#include <iterator>
#include <limits>
#include <memory>
#include <mutex>
#include <optional>
#include <sstream>
#include <stdexcept>
#include <string_view>
#include <system_error>
#include <thread>
#include <unistd.h>
#include <utility>
Include dependency graph for transport.cpp:

Go to the source code of this file.

Classes

struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_easy_deleter
struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_url_deleter
struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_slist_deleter
struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::parsed_url
struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::allowed_authority
class  arachne::pheidippides::anonymous_namespace{transport.cpp}::verified_body_file
class  arachne::pheidippides::anonymous_namespace{transport.cpp}::staging_file
struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::receive_context
struct  arachne::pheidippides::anonymous_namespace{transport.cpp}::progress_context

Namespaces

namespace  arachne
namespace  arachne::pheidippides
namespace  arachne::pheidippides::anonymous_namespace{transport.cpp}

Typedefs

using arachne::pheidippides::anonymous_namespace{transport.cpp}::easy_handle = std::unique_ptr<CURL, curl_easy_deleter>
using arachne::pheidippides::anonymous_namespace{transport.cpp}::url_handle = std::unique_ptr<CURLU, curl_url_deleter>
using arachne::pheidippides::anonymous_namespace{transport.cpp}::header_list = std::unique_ptr<curl_slist, curl_slist_deleter>

Functions

void arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_share_lock (CURL *, const curl_lock_data, const curl_lock_access, void *) noexcept
void arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_share_unlock (CURL *, const curl_lock_data, void *) noexcept
void arachne::pheidippides::anonymous_namespace{transport.cpp}::initialize_curl ()
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::is_control (const char character) noexcept
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::valid_request_id (const std::string_view request_id)
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::artifact_id_for (const std::string_view request_id)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::valid_header_name (const std::string_view name)
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::ascii_lower (std::string value)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::valid_header (const http_header &header)
std::optional< std::string > arachne::pheidippides::anonymous_namespace{transport.cpp}::normalize_host (const std::string_view input)
std::optional< unsigned > arachne::pheidippides::anonymous_namespace{transport.cpp}::parse_port (const std::string_view text) noexcept
std::optional< parsed_urlarachne::pheidippides::anonymous_namespace{transport.cpp}::parse_url (const std::string &value, std::string &error)
std::optional< allowed_authorityarachne::pheidippides::anonymous_namespace{transport.cpp}::parse_allowed_authority (const std::string_view input)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::host_allowed (const parsed_url &url, const std::vector< std::string > &allowed_hosts, std::string &error)
std::optional< std::string > arachne::pheidippides::anonymous_namespace{transport.cpp}::resolve_redirect (const std::string &base, const std::string &location, std::string &error)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::path_begins_with (const std::filesystem::path &path, const std::filesystem::path &root)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::ensure_safe_parent (const std::filesystem::path &root, const std::filesystem::path &target, std::string &error)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::ensure_safe_existing_file (const std::filesystem::path &root, const std::filesystem::path &candidate, bool &unsafe, std::string &error)
std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::body_read_callback (char *destination, const std::size_t size, const std::size_t count, void *user_data) noexcept
int arachne::pheidippides::anonymous_namespace{transport.cpp}::body_seek_callback (void *user_data, const curl_off_t offset, const int origin) noexcept
int arachne::pheidippides::anonymous_namespace{transport.cpp}::transfer_progress_callback (void *user_data, const curl_off_t download_total, const curl_off_t download_now, const curl_off_t upload_total, const curl_off_t upload_now) noexcept
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::write_all (const int descriptor, const char *data, std::size_t size, std::string &error) noexcept
std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::body_callback (char *contents, const std::size_t size, const std::size_t count, void *user_data) noexcept
std::string_view arachne::pheidippides::anonymous_namespace{transport.cpp}::trim_header_value (std::string_view value) noexcept
std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::response_header_callback (char *contents, const std::size_t size, const std::size_t count, void *user_data) noexcept
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::is_redirect_status (const long status) noexcept
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::is_retryable_status (const long status) noexcept
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::is_retryable_curl_status (const CURLcode status) noexcept
std::optional< std::chrono::milliseconds > arachne::pheidippides::anonymous_namespace{transport.cpp}::retry_after_delay (const std::vector< http_header > &headers)
std::chrono::milliseconds arachne::pheidippides::anonymous_namespace{transport.cpp}::retry_delay (const fetch_request_v1 &request, const std::size_t attempt, const std::vector< http_header > &headers)
long arachne::pheidippides::anonymous_namespace{transport.cpp}::timeout_milliseconds (const std::chrono::steady_clock::time_point deadline) noexcept
header_list arachne::pheidippides::anonymous_namespace{transport.cpp}::build_request_headers (const std::vector< http_header > &headers)
acquired_artifact_v1 arachne::pheidippides::anonymous_namespace{transport.cpp}::fail_result (acquired_artifact_v1 result, const transport_status status, std::string message)
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::validation_message (const arachnespace::contracts::validation_result &validation)
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::rfc3339 (const std::chrono::system_clock::time_point time)
std::string_view arachne::pheidippides::anonymous_namespace{transport.cpp}::status_name (const transport_status status) noexcept
std::optional< std::string > arachne::pheidippides::anonymous_namespace{transport.cpp}::response_content_type (const std::vector< http_header > &headers)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::sensitive_header_name (const std::string_view name)
int arachne::pheidippides::anonymous_namespace{transport.cpp}::hexadecimal_value (const char character) noexcept
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::decode_query_name (const std::string_view name)
bool arachne::pheidippides::anonymous_namespace{transport.cpp}::sensitive_query_name (std::string name)
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::redact_url_query (const std::string &url)
std::string arachne::pheidippides::anonymous_namespace{transport.cpp}::receipt_safe_text (const std::string_view value)
std::string_view arachne::pheidippides::to_string (transport_operation value) noexcept
std::string_view arachne::pheidippides::to_string (freshness_policy value) noexcept
std::string_view arachne::pheidippides::to_string (delivery_mode value) noexcept
fetch_request_v1 arachne::pheidippides::from_contract (const nlohmann::json &document)
nlohmann::ordered_json arachne::pheidippides::to_contract (const acquired_artifact_v1 &artifact)

Variables

constexpr std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::maximum_header_bytes = 1024U * 1024U
constexpr std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::maximum_response_headers = 1'024U
constexpr std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::maximum_redirects = 20U
constexpr std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::maximum_transport_attempts = 20U
constexpr std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::maximum_url_bytes = 64U * 1024U
constexpr std::size_t arachne::pheidippides::anonymous_namespace{transport.cpp}::maximum_request_id_bytes = 128U
std::once_flag arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_global_once
std::recursive_mutex arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_share_mutex
CURLSH * arachne::pheidippides::anonymous_namespace{transport.cpp}::curl_connection_share = nullptr
std::atomic< std::uint64_t > arachne::pheidippides::anonymous_namespace{transport.cpp}::stage_sequence { 0 }