Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 4 additions & 20 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ cmake_minimum_required(VERSION 3.16)
file(READ "${CMAKE_CURRENT_LIST_DIR}/VERSION" JSONSCHEMA_VERSION)
string(STRIP "${JSONSCHEMA_VERSION}" JSONSCHEMA_VERSION)
project(jsonschema VERSION "${JSONSCHEMA_VERSION}" LANGUAGES C CXX)
if(APPLE)
enable_language(OBJCXX)
endif()
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")

# Options
Expand All @@ -26,30 +29,11 @@ endif()
find_package(Blaze REQUIRED)
find_package(JSONBinPack REQUIRED)

if(JSONSCHEMA_USE_SYSTEM_CURL)
list(REMOVE_ITEM CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
find_package(CURL REQUIRED)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
find_package(CPR REQUIRED)
else()
if(NOT WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "MSYS")
find_package(MbedTLS REQUIRED)
endif()
find_package(Nghttp2 REQUIRED)
if(NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "MSYS")
find_package(CAres REQUIRED)
endif()
find_package(PSL REQUIRED)
find_package(ZLIB REQUIRED)
find_package(CURL REQUIRED)
find_package(CPR REQUIRED)
endif()

add_subdirectory(src)

if(JSONSCHEMA_DEVELOPMENT)
sourcemeta_target_clang_format(SOURCES
src/*.h src/*.cc)
src/*.h src/*.cc src/*.mm)
sourcemeta_target_shellcheck(SOURCES
test/*.sh install *.sh completion/*)
endif()
Expand Down
3 changes: 1 addition & 2 deletions DEPENDENCIES
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
vendorpull https://github.com/sourcemeta/vendorpull 1dcbac42809cf87cb5b045106b863e17ad84ba02
core https://github.com/sourcemeta/core df8f2970ccf85a3a3f01e004ac436ff916f8c52a
core https://github.com/sourcemeta/core eb361a9f3a01f7cffb5da7946a9516ee11dc9ede
jsonbinpack https://github.com/sourcemeta/jsonbinpack ac8e1af733a781fc4c94a14157f80970ea569479
blaze https://github.com/sourcemeta/blaze 7b214cff6d575831c16a2ce33f55d97c02eb6338
mbedtls https://github.com/Mbed-TLS/mbedtls v3.6.6
curl https://github.com/curl/curl curl-8_20_0
nghttp2 https://github.com/nghttp2/nghttp2 v1.67.1
cpr https://github.com/libcpr/cpr 1.14.2
c-ares https://github.com/c-ares/c-ares v1.34.5
libpsl https://github.com/rockdaboot/libpsl 0.21.5
zlib https://github.com/madler/zlib v1.3.2
Expand Down
158 changes: 0 additions & 158 deletions cmake/FindCPR.cmake

This file was deleted.

5 changes: 4 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
add_subdirectory(http)

sourcemeta_executable(
PROJECT jsonschema
NAME cli
Expand Down Expand Up @@ -25,6 +27,7 @@ target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::uri)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::json)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::jsonl)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::gzip)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::http)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::jsonpointer)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::yaml)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::core::regex)
Expand All @@ -43,7 +46,7 @@ target_link_libraries(jsonschema_cli PRIVATE sourcemeta::blaze::output)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::blaze::test)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::blaze::alterschema)
target_link_libraries(jsonschema_cli PRIVATE sourcemeta::blaze::codegen)
target_link_libraries(jsonschema_cli PRIVATE CPR::cpr)
target_link_libraries(jsonschema_cli PRIVATE jsonschema_http)

configure_file(configure.h.in configure.h @ONLY)
target_include_directories(jsonschema_cli PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
Expand Down
58 changes: 58 additions & 0 deletions src/error.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
#include <sourcemeta/blaze/test.h>
#include <sourcemeta/core/error.h>
#include <sourcemeta/core/gzip.h>
#include <sourcemeta/core/http.h>
#include <sourcemeta/core/io.h>
#include <sourcemeta/core/json.h>
#include <sourcemeta/core/jsonpointer.h>
#include <sourcemeta/core/options.h>

#include <concepts> // std::same_as, std::convertible_to
#include <cstdint> // std::uint64_t
#include <filesystem> // std::filesystem
#include <functional> // std::function
Expand Down Expand Up @@ -566,6 +568,54 @@ inline auto print_exception(const bool is_json, const Exception &exception)
}
}

if constexpr (requires(const Exception &current) {
{
current.status()
} -> std::same_as<sourcemeta::core::HTTPStatus>;
}) {
const auto status{exception.status()};
if (is_json) {
error_json.assign("status", sourcemeta::core::JSON{
static_cast<std::size_t>(status.code)});
} else {
std::cerr << " with status ";
if (status.wire.empty()) {
std::cerr << status.code;
} else {
std::cerr << status.wire;
}
std::cerr << "\n";
}
}

if constexpr (requires(const Exception &current) {
{
current.method()
} -> std::same_as<sourcemeta::core::HTTPMethod>;
}) {
if (is_json) {
error_json.assign(
"method",
sourcemeta::core::JSON{std::string{
sourcemeta::core::http_method_string(exception.method())}});
} else {
std::cerr << " with method "
<< sourcemeta::core::http_method_string(exception.method())
<< "\n";
}
}

if constexpr (requires(const Exception &current) {
{ current.url() } -> std::convertible_to<std::string_view>;
}) {
if (is_json) {
error_json.assign("url",
sourcemeta::core::JSON{std::string{exception.url()}});
} else {
std::cerr << " at url " << exception.url() << "\n";
}
}

if constexpr (requires(const Exception &current) {
current.base().recompose();
}) {
Expand Down Expand Up @@ -1007,6 +1057,14 @@ inline auto try_catch(const sourcemeta::core::Options &options,
const auto is_json{options.contains("json")};
print_exception(is_json, error);
return EXIT_OTHER_INPUT_ERROR;
} catch (const sourcemeta::core::HTTPStatusError &error) {
const auto is_json{options.contains("json")};
print_exception(is_json, error);
return EXIT_UNEXPECTED_ERROR;
} catch (const sourcemeta::core::HTTPError &error) {
const auto is_json{options.contains("json")};
print_exception(is_json, error);
return EXIT_UNEXPECTED_ERROR;

// Standard library handlers
} catch (const sourcemeta::core::IOFileNotFoundError &error) {
Expand Down
37 changes: 37 additions & 0 deletions src/http/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# On Apple and Windows platforms, HTTP requests are served by the
# operating system networking stack. Everywhere else, they go through
# cURL (by default vendored alongside its dependencies)
if(APPLE)
add_library(jsonschema_http STATIC http.h http_darwin.mm)
set_source_files_properties(http_darwin.mm
PROPERTIES COMPILE_OPTIONS "-fobjc-arc")
target_link_libraries(jsonschema_http PRIVATE "-framework Foundation")
target_link_libraries(jsonschema_http PRIVATE sourcemeta::core::text)
elseif(WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "MSYS")
add_library(jsonschema_http STATIC http.h http_windows.cc)
target_link_libraries(jsonschema_http PRIVATE winhttp)
target_link_libraries(jsonschema_http PRIVATE sourcemeta::core::unicode)
else()
if(JSONSCHEMA_USE_SYSTEM_CURL)
list(REMOVE_ITEM CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
find_package(CURL REQUIRED)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
else()
find_package(MbedTLS REQUIRED)
find_package(Nghttp2 REQUIRED)
if(NOT CMAKE_SYSTEM_NAME STREQUAL "MSYS")
find_package(CAres REQUIRED)
endif()
find_package(PSL REQUIRED)
find_package(ZLIB REQUIRED)
find_package(CURL REQUIRED)
endif()

add_library(jsonschema_http STATIC http.h http_curl.cc)
target_link_libraries(jsonschema_http PRIVATE CURL::libcurl)
endif()

sourcemeta_add_default_options(PRIVATE jsonschema_http)
target_link_libraries(jsonschema_http PUBLIC sourcemeta::core::http)
target_include_directories(jsonschema_http PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
set_target_properties(jsonschema_http PROPERTIES FOLDER "jsonschema/http")
Loading
Loading