Skip to content

Implement a cross-platform system HTTP client abstraction#2528

Merged
jviotti merged 6 commits into
mainfrom
system-http-client
Jun 18, 2026
Merged

Implement a cross-platform system HTTP client abstraction#2528
jviotti merged 6 commits into
mainfrom
system-http-client

Conversation

@jviotti

@jviotti jviotti commented Jun 18, 2026

Copy link
Copy Markdown
Member

Signed-off-by: Juan Cruz Viotti jv@jviotti.com

Review in cubic

@jviotti jviotti force-pushed the system-http-client branch 2 times, most recently from 0890c9b to 73e50a4 Compare June 18, 2026 17:14
@jviotti jviotti marked this pull request as ready for review June 18, 2026 17:23
@jviotti jviotti force-pushed the system-http-client branch from 73e50a4 to f567171 Compare June 18, 2026 17:23
@augmentcode

augmentcode Bot commented Jun 18, 2026

Copy link
Copy Markdown
🤖 Augment PR Summary

Summary: Adds a new cross-platform “system HTTP client” abstraction to Sourcemeta Core.

Changes:

  • Introduced public HTTPSystemRequest/HTTPResponse API in src/core/http/include/sourcemeta/core/http_system.h and re-exported it via http.h.
  • Implemented platform backends: cURL (default, runtime-loaded via dlopen), NSURLSession on Apple (Objective-C++), and WinHTTP on Windows.
  • Updated HTTP library CMake to select the appropriate backend source and link required platform dependencies (Foundation / winhttp / dl / libcurl).
  • Added build options SOURCEMETA_CORE_HTTP_USE_SYSTEM_CURL (link libcurl) and SOURCEMETA_CORE_TESTS_CI (enable CI-only tests).
  • Enabled Objective-C++ as a project language on Apple and added ARC compiler flags for ObjC/ObjC++ sources.
  • Added CI HTTP integration tests under test/http/ci and enabled them in GitHub Actions.

Technical Notes: The cURL backend shares logic between a link-time and runtime-loaded mode via a small function-pointer API table, and all backends support redirects, timeouts, automatic decompression, and optional maximum response size enforcement.

🤖 Was this summary useful? React with 👍 or 👎

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review completed. 6 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

auto operator=(CurlHeaderList &&) -> CurlHeaderList & = delete;

auto append(const std::string &line) -> void {
auto *result{this->api_.slist_append(this->list_, line.c_str())};

@augmentcode augmentcode Bot Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/core/http/client_curl.cc:134-139: libcurl failures are currently silent here (e.g. curl_slist_append can return nullptr, and curl_easy_setopt/curl_easy_getinfo can fail), which can drop headers/options or leave response metadata unset without surfacing an error. Consider checking these return codes and failing the request when required configuration/info retrieval cannot be applied.

Severity: medium

Other Locations
  • src/core/http/client_curl.cc:321
  • src/core/http/client_curl.cc:396

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Comment thread src/core/http/client_curl.cc Outdated
void *user_data) -> std::size_t {
auto *context{static_cast<BodyContext *>(user_data)};
if (context->maximum_size.has_value() &&
context->output->size() + (size * count) >

@augmentcode augmentcode Bot Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/core/http/client_curl.cc:154-166: the maximum response size check uses output->size() + (size * count), which can overflow size_t and potentially bypass maximum_response_size_ for very large responses/chunks. Consider guarding against overflow in the size arithmetic before comparing/enforcing the limit.

Severity: medium

Other Locations
  • src/core/http/client_windows.cc:233
  • src/core/http/client_darwin.mm:71

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

this->connect_timeout_.has_value()
? static_cast<int>(this->connect_timeout_.value().count())
: total_timeout};
WinHttpSetTimeouts(request_handle.get(), connect_timeout, connect_timeout,

@augmentcode augmentcode Bot Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/core/http/client_windows.cc:149-170: return values from WinHttpSetOption and WinHttpSetTimeouts are ignored, so redirects/timeouts/decompression may silently fail and the request won’t honor the HTTPSystemRequest configuration. Consider checking these APIs and surfacing an HTTPError when WinHTTP configuration cannot be applied.

Severity: medium

Other Locations
  • src/core/http/client_windows.cc:151
  • src/core/http/client_windows.cc:169

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.


auto *headers{&self.response->headers};
[http_response.allHeaderFields
enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value,

@augmentcode augmentcode Bot Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/core/http/client_darwin.mm:102-108: NSHTTPURLResponse.allHeaderFields isn’t guaranteed to contain NSString* values for every entry, but the block assumes value is an NSString* and calls UTF8String, which could crash for other Foundation types. Consider defensively validating/casting/stringifying header values before converting to UTF-8.

Severity: low

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Comment thread .github/workflows/ci.yml
cmake -S . -B ./build
-DCMAKE_BUILD_TYPE:STRING=Release
-DSOURCEMETA_CORE_TESTS:BOOL=ON
-DSOURCEMETA_CORE_TESTS_CI:BOOL=ON

@augmentcode augmentcode Bot Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.github/workflows/ci.yml:96: CI now enables SOURCEMETA_CORE_TESTS_CI, which runs HTTP integration tests against schemas.sourcemeta.com; this can introduce flaky failures due to network/DNS/service availability rather than code regressions. Consider gating these tests (opt-in job/label, retries, or a skip mechanism when outbound network isn’t available).

Severity: medium

Other Locations
  • .github/workflows/ci.yml:108
  • test/http/ci/http_system_request_test.cc:8

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

"https://schemas.sourcemeta.com/self/v1/health"};
const auto response{request.send()};
EXPECT_EQ(response.status, sourcemeta::core::HTTP_STATUS_OK);
EXPECT_EQ(response.url, "https://schemas.sourcemeta.com/self/v1/health");

@augmentcode augmentcode Bot Jun 18, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test/http/ci/http_system_request_test.cc:13: asserting exact string equality for response.url may be brittle across backends (e.g., normalization around default ports or trailing slashes), causing false failures while behavior is equivalent. Consider asserting on a normalized/parsed URL shape (scheme/host/path) rather than exact string match.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

9 issues found and verified against the latest diff

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/core/http/include/sourcemeta/core/http_system.h">

<violation number="1" location="src/core/http/include/sourcemeta/core/http_system.h:141">
P2: `maximum_redirects()` accepts values that can overflow when converted to backend API types. Validate/clamp before storing to prevent truncation-driven misconfiguration.</violation>

<violation number="2" location="src/core/http/include/sourcemeta/core/http_system.h:147">
P2: `timeout()` allows durations larger than backend integer ranges. Add range validation to avoid overflow that can produce incorrect or negative-equivalent timeouts.</violation>
</file>

<file name="src/core/http/client_darwin.mm">

<violation number="1" location="src/core/http/client_darwin.mm:154">
P2: `connect_timeout_` is mapped to request idle/read timeout semantics on Darwin, not a connect-phase timeout. This makes timeout behavior inconsistent across backends and can fail requests during slow response gaps after connection.</violation>
</file>

<file name=".github/workflows/ci.yml">

<violation number="1" location=".github/workflows/ci.yml:96">
P2: Enabling `SOURCEMETA_CORE_TESTS_CI` unconditionally in CI runs HTTP integration tests against the live `schemas.sourcemeta.com` service. Transient network or DNS failures will cause false-negative test results. Consider adding a retry mechanism, gating behind a dedicated CI label/job, or skipping when the service is unreachable.</violation>
</file>

<file name="src/core/http/client_curl.cc">

<violation number="1" location="src/core/http/client_curl.cc:136">
P2: Header list allocation failure is silently ignored. This can drop required headers without error and change request semantics.</violation>

<violation number="2" location="src/core/http/client_curl.cc:321">
P2: libcurl option-setting errors are ignored; request can run with unintended defaults. Fail fast on non-CURLE_OK from each curl_easy_setopt/curl_easy_getinfo call.</violation>
</file>

<file name="src/core/http/client_windows.cc">

<violation number="1" location="src/core/http/client_windows.cc:165">
P2: WinHttpSetTimeouts return value is ignored. Timeout configuration failures become silent misconfiguration.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic


/// Set the maximum number of redirects to follow, 20 by default
auto maximum_redirects(const std::size_t value) -> HTTPSystemRequest & {
this->maximum_redirects_ = value;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: maximum_redirects() accepts values that can overflow when converted to backend API types. Validate/clamp before storing to prevent truncation-driven misconfiguration.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/core/http/include/sourcemeta/core/http_system.h, line 141:

<comment>`maximum_redirects()` accepts values that can overflow when converted to backend API types. Validate/clamp before storing to prevent truncation-driven misconfiguration.</comment>

<file context>
@@ -0,0 +1,192 @@
+
+  /// Set the maximum number of redirects to follow, 20 by default
+  auto maximum_redirects(const std::size_t value) -> HTTPSystemRequest & {
+    this->maximum_redirects_ = value;
+    return *this;
+  }
</file context>


/// Set the total request timeout, 30 seconds by default
auto timeout(const std::chrono::milliseconds value) -> HTTPSystemRequest & {
this->timeout_ = value;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: timeout() allows durations larger than backend integer ranges. Add range validation to avoid overflow that can produce incorrect or negative-equivalent timeouts.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/core/http/include/sourcemeta/core/http_system.h, line 147:

<comment>`timeout()` allows durations larger than backend integer ranges. Add range validation to avoid overflow that can produce incorrect or negative-equivalent timeouts.</comment>

<file context>
@@ -0,0 +1,192 @@
+
+  /// Set the total request timeout, 30 seconds by default
+  auto timeout(const std::chrono::milliseconds value) -> HTTPSystemRequest & {
+    this->timeout_ = value;
+    return *this;
+  }
</file context>

Comment thread src/core/http/client_curl.cc Outdated

auto append(const std::string &line) -> void {
auto *result{this->api_.slist_append(this->list_, line.c_str())};
if (result) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Header list allocation failure is silently ignored. This can drop required headers without error and change request semantics.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/core/http/client_curl.cc, line 136:

<comment>Header list allocation failure is silently ignored. This can drop required headers without error and change request semantics.</comment>

<file context>
@@ -0,0 +1,409 @@
+
+  auto append(const std::string &line) -> void {
+    auto *result{this->api_.slist_append(this->list_, line.c_str())};
+    if (result) {
+      this->list_ = result;
+    }
</file context>

}

HTTPResponse response;
api.easy_setopt(handle.get(), CURLOPT_URL, this->url_.c_str());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: libcurl option-setting errors are ignored; request can run with unintended defaults. Fail fast on non-CURLE_OK from each curl_easy_setopt/curl_easy_getinfo call.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/core/http/client_curl.cc, line 321:

<comment>libcurl option-setting errors are ignored; request can run with unintended defaults. Fail fast on non-CURLE_OK from each curl_easy_setopt/curl_easy_getinfo call.</comment>

<file context>
@@ -0,0 +1,409 @@
+  }
+
+  HTTPResponse response;
+  api.easy_setopt(handle.get(), CURLOPT_URL, this->url_.c_str());
+  api.easy_setopt(handle.get(), CURLOPT_FOLLOWLOCATION,
+                  this->follow_redirects_ ? 1L : 0L);
</file context>

configuration.timeoutIntervalForResource =
static_cast<double>(this->timeout_.count()) / 1000.0;
if (this->connect_timeout_.has_value()) {
configuration.timeoutIntervalForRequest =

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: connect_timeout_ is mapped to request idle/read timeout semantics on Darwin, not a connect-phase timeout. This makes timeout behavior inconsistent across backends and can fail requests during slow response gaps after connection.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/core/http/client_darwin.mm, line 154:

<comment>`connect_timeout_` is mapped to request idle/read timeout semantics on Darwin, not a connect-phase timeout. This makes timeout behavior inconsistent across backends and can fail requests during slow response gaps after connection.</comment>

<file context>
@@ -0,0 +1,192 @@
+      configuration.timeoutIntervalForResource =
+          static_cast<double>(this->timeout_.count()) / 1000.0;
+      if (this->connect_timeout_.has_value()) {
+        configuration.timeoutIntervalForRequest =
+            static_cast<double>(this->connect_timeout_.value().count()) /
+            1000.0;
</file context>

this->connect_timeout_.has_value()
? static_cast<int>(this->connect_timeout_.value().count())
: total_timeout};
WinHttpSetTimeouts(request_handle.get(), connect_timeout, connect_timeout,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: WinHttpSetTimeouts return value is ignored. Timeout configuration failures become silent misconfiguration.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/core/http/client_windows.cc, line 165:

<comment>WinHttpSetTimeouts return value is ignored. Timeout configuration failures become silent misconfiguration.</comment>

<file context>
@@ -0,0 +1,256 @@
+      this->connect_timeout_.has_value()
+          ? static_cast<int>(this->connect_timeout_.value().count())
+          : total_timeout};
+  WinHttpSetTimeouts(request_handle.get(), connect_timeout, connect_timeout,
+                     total_timeout, total_timeout);
+
</file context>

Comment thread src/core/http/client_windows.cc
Comment thread .github/workflows/ci.yml
cmake -S . -B ./build
-DCMAKE_BUILD_TYPE:STRING=Release
-DSOURCEMETA_CORE_TESTS:BOOL=ON
-DSOURCEMETA_CORE_TESTS_CI:BOOL=ON

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Enabling SOURCEMETA_CORE_TESTS_CI unconditionally in CI runs HTTP integration tests against the live schemas.sourcemeta.com service. Transient network or DNS failures will cause false-negative test results. Consider adding a retry mechanism, gating behind a dedicated CI label/job, or skipping when the service is unreachable.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/ci.yml, line 96:

<comment>Enabling `SOURCEMETA_CORE_TESTS_CI` unconditionally in CI runs HTTP integration tests against the live `schemas.sourcemeta.com` service. Transient network or DNS failures will cause false-negative test results. Consider adding a retry mechanism, gating behind a dedicated CI label/job, or skipping when the service is unreachable.</comment>

<file context>
@@ -93,6 +93,7 @@ jobs:
           cmake -S . -B ./build
           -DCMAKE_BUILD_TYPE:STRING=Release
           -DSOURCEMETA_CORE_TESTS:BOOL=ON
+          -DSOURCEMETA_CORE_TESTS_CI:BOOL=ON
           -DSOURCEMETA_CORE_BENCHMARK:BOOL=ON
           -DSOURCEMETA_CORE_DOCS:BOOL=OFF
</file context>

Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
@jviotti jviotti force-pushed the system-http-client branch 2 times, most recently from dcc2564 to 55ffefb Compare June 18, 2026 17:43
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
@jviotti jviotti force-pushed the system-http-client branch from 55ffefb to 0611d41 Compare June 18, 2026 17:48
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (linux/llvm)

Details
Benchmark suite Current: 15e91b5 Previous: 8cc4718 Ratio
Regex_Lower_S_Or_Upper_S_Asterisk 2.5043952700548684 ns/iter 2.8156307009646726 ns/iter 0.89
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 2.1800998008819517 ns/iter 2.463348366074538 ns/iter 0.89
Regex_Period_Asterisk 2.180638536764764 ns/iter 2.4617047634927394 ns/iter 0.89
Regex_Group_Period_Asterisk_Group 2.491568815977314 ns/iter 2.8151947048760926 ns/iter 0.89
Regex_Period_Plus 3.117266443618897 ns/iter 4.224681981702455 ns/iter 0.74
Regex_Period 2.8024207847838527 ns/iter 3.8691645328961126 ns/iter 0.72
Regex_Caret_Period_Plus_Dollar 2.803274086864416 ns/iter 3.8697604095820632 ns/iter 0.72
Regex_Caret_Group_Period_Plus_Group_Dollar 3.1122996805210006 ns/iter 4.220290814793648 ns/iter 0.74
Regex_Caret_Period_Asterisk_Dollar 2.491701775890014 ns/iter 3.175717817318527 ns/iter 0.78
Regex_Caret_Group_Period_Asterisk_Group_Dollar 2.1813468394475524 ns/iter 2.818053828296593 ns/iter 0.77
Regex_Caret_X_Hyphen 5.6119476152716095 ns/iter 7.039442436225255 ns/iter 0.80
Regex_Period_Md_Dollar 28.091692858182693 ns/iter 26.455207849162953 ns/iter 1.06
Regex_Caret_Slash_Period_Asterisk 6.228409141092894 ns/iter 7.693009946919405 ns/iter 0.81
Regex_Caret_Period_Range_Dollar 3.7335883032534736 ns/iter 3.8727090782388327 ns/iter 0.96
Regex_Nested_Backtrack 44.23671075734317 ns/iter 37.10696803974887 ns/iter 1.19
JSON_Array_Of_Objects_Unique 408.81008107181947 ns/iter 444.20021572608863 ns/iter 0.92
JSON_Parse_1 4884.311396368454 ns/iter 4757.524556208544 ns/iter 1.03
JSON_Parse_Real 5500.174064498947 ns/iter 5326.640874526267 ns/iter 1.03
JSON_Parse_Decimal 7709.29510674696 ns/iter 7788.020395284032 ns/iter 0.99
JSON_Parse_Schema_ISO_Language 3401948.17961186 ns/iter 3499798.0398008907 ns/iter 0.97
JSON_Parse_Integer 3763.581637158918 ns/iter 3976.4839314205756 ns/iter 0.95
JSON_Parse_String_NonSSO_Plain 5158.456809389788 ns/iter 5084.1877202926535 ns/iter 1.01
JSON_Parse_String_SSO_Plain 2799.6125584422853 ns/iter 2778.123651287989 ns/iter 1.01
JSON_Parse_String_Escape_Heavy 13943.01852920682 ns/iter 14643.650375703817 ns/iter 0.95
JSON_Parse_Object_Short_Keys 7750.64372191184 ns/iter 7764.679445630389 ns/iter 1.00
JSON_Parse_Object_Scalar_Properties 4037.2019209187883 ns/iter 3850.86835690143 ns/iter 1.05
JSON_Parse_Object_Array_Properties 5719.61170005902 ns/iter 5718.361681781186 ns/iter 1.00
JSON_Parse_Object_Object_Properties 5737.75717413979 ns/iter 5690.4300582537935 ns/iter 1.01
JSON_Parse_Nested_Containers 44577.43428680389 ns/iter 46236.16596732906 ns/iter 0.96
JSON_From_String_Copy 20.572663788029114 ns/iter 22.879959601155434 ns/iter 0.90
JSON_From_String_Temporary 17.78891043096609 ns/iter 20.413384417112063 ns/iter 0.87
JSON_Number_To_Double 22.87608264398521 ns/iter 22.95619496534264 ns/iter 1.00
JSON_Object_At_Last_Key/8 3.75375349213719 ns/iter 3.8762367484757028 ns/iter 0.97
JSON_Object_At_Last_Key/32 11.94331456351558 ns/iter 13.02994839201094 ns/iter 0.92
JSON_Object_At_Last_Key/128 48.283950615583336 ns/iter 47.03383045659184 ns/iter 1.03
JSON_Object_At_Last_Key/512 383.2353420984974 ns/iter 366.75866986184315 ns/iter 1.04
JSON_Fast_Hash_Helm_Chart_Lock 60.43251007067362 ns/iter 72.81320103060604 ns/iter 0.83
JSON_Equality_Helm_Chart_Lock 158.65855513375212 ns/iter 160.82744541445973 ns/iter 0.99
JSON_Divisible_By_Decimal 243.20909286708107 ns/iter 248.74527696378675 ns/iter 0.98
JSON_String_Equal/10 7.160490143932489 ns/iter 6.109661117132174 ns/iter 1.17
JSON_String_Equal/100 6.861259718337364 ns/iter 6.687837425866767 ns/iter 1.03
JSON_String_Equal_Small_By_Perfect_Hash/10 0.935212400265319 ns/iter 1.0556085150386019 ns/iter 0.89
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 14.93416393537132 ns/iter 12.34274332135921 ns/iter 1.21
JSON_String_Fast_Hash/10 2.4901185785376727 ns/iter 2.4823847034277 ns/iter 1.00
JSON_String_Fast_Hash/100 2.4921081502898286 ns/iter 2.4641360891570225 ns/iter 1.01
JSON_String_Key_Hash/10 2.738949592140605 ns/iter 2.463138792963701 ns/iter 1.11
JSON_String_Key_Hash/100 9.085696024009819 ns/iter 8.088235610124437 ns/iter 1.12
JSON_Object_Defines_Miss_Same_Length 2.7443419513113763 ns/iter 2.981125770378 ns/iter 0.92
JSON_Object_Defines_Miss_Too_Small 3.7350851499593554 ns/iter 4.222984968605876 ns/iter 0.88
JSON_Object_Defines_Miss_Too_Large 2.6762252304225584 ns/iter 2.9099548803424016 ns/iter 0.92
Pointer_Object_Traverse 24.178056257343187 ns/iter 25.74308727792707 ns/iter 0.94
Pointer_Object_Try_Traverse 28.45796648886305 ns/iter 30.674251928131838 ns/iter 0.93
Pointer_Push_Back_Pointer_To_Weak_Pointer 207.850830658179 ns/iter 197.91891590061195 ns/iter 1.05
Pointer_Walker_Schema_ISO_Language 1759382.4522610526 ns/iter 1827710.7565446096 ns/iter 0.96
Pointer_Maybe_Tracked_Deeply_Nested/0 1230911.526041625 ns/iter 1239590.0645161518 ns/iter 0.99
Pointer_Maybe_Tracked_Deeply_Nested/1 1567032.4489796127 ns/iter 1566242.6116071413 ns/iter 1.00
Pointer_Position_Tracker_Get_Deeply_Nested 672.1913140508691 ns/iter 718.4756792419525 ns/iter 0.94
URITemplateRouter_Create 33766.99547877413 ns/iter 30948.368970992546 ns/iter 1.09
URITemplateRouter_Match 175.44835755104646 ns/iter 182.2162353564315 ns/iter 0.96
URITemplateRouter_Match_BasePath 202.57783297787017 ns/iter 217.92006588785208 ns/iter 0.93
URITemplateRouterView_Restore 7938.241110806008 ns/iter 8674.388605317181 ns/iter 0.92
URITemplateRouterView_Match 164.77311412319187 ns/iter 172.8256573072147 ns/iter 0.95
URITemplateRouterView_Match_BasePath 187.61326167949034 ns/iter 196.04989933626322 ns/iter 0.96
URITemplateRouterView_Arguments 440.3576959404083 ns/iter 451.84494017343746 ns/iter 0.97
JSONL_Parse_Large 9774434.35211421 ns/iter 9167416.346666263 ns/iter 1.07
JSONL_Parse_Large_GZIP 11379639.000001736 ns/iter 10922879.749999836 ns/iter 1.04
HTML_Build_Table_100000 68172330.40000018 ns/iter 71511895.90000513 ns/iter 0.95
HTML_Render_Table_100000 5425906.196850928 ns/iter 4881447.867133333 ns/iter 1.11
GZIP_Compress_ISO_Language_Set_3_Locations 33564457.66666552 ns/iter 35962984.894737065 ns/iter 0.93
GZIP_Decompress_ISO_Language_Set_3_Locations 4257334.503067573 ns/iter 4273794.506097945 ns/iter 1.00
GZIP_Compress_ISO_Language_Set_3_Schema 1889667.9459458396 ns/iter 2135543.798780551 ns/iter 0.88
GZIP_Decompress_ISO_Language_Set_3_Schema 352535.1664989953 ns/iter 277583.9999999787 ns/iter 1.27
JOSE_VerifySignature_RS256 60341.46360582761 ns/iter 63838.899268739544 ns/iter 0.95
JOSE_VerifySignature_ES512 2358725.2222222276 ns/iter 2693099.861538538 ns/iter 0.88

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (macos/llvm)

Details
Benchmark suite Current: 15e91b5 Previous: 8cc4718 Ratio
Regex_Lower_S_Or_Upper_S_Asterisk 1.771042700913171 ns/iter 2.3109914921063894 ns/iter 0.77
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 1.8069315830705204 ns/iter 2.147494012492912 ns/iter 0.84
Regex_Period_Asterisk 1.7779934860260738 ns/iter 2.612487986724751 ns/iter 0.68
Regex_Group_Period_Asterisk_Group 1.9246047503509986 ns/iter 2.1638214478855784 ns/iter 0.89
Regex_Period_Plus 2.3161332015709455 ns/iter 2.5354249118670613 ns/iter 0.91
Regex_Period 2.0357544486105783 ns/iter 2.627342969260629 ns/iter 0.77
Regex_Caret_Period_Plus_Dollar 2.222197870558822 ns/iter 2.595556171903885 ns/iter 0.86
Regex_Caret_Group_Period_Plus_Group_Dollar 2.2581349485016733 ns/iter 2.423151505968675 ns/iter 0.93
Regex_Caret_Period_Asterisk_Dollar 1.9363453956321344 ns/iter 2.1592320033897736 ns/iter 0.90
Regex_Caret_Group_Period_Asterisk_Group_Dollar 1.978029305224305 ns/iter 2.085981286747236 ns/iter 0.95
Regex_Caret_X_Hyphen 6.471800122093434 ns/iter 8.306892637310098 ns/iter 0.78
Regex_Period_Md_Dollar 17.110202340067413 ns/iter 22.704344766129022 ns/iter 0.75
Regex_Caret_Slash_Period_Asterisk 4.486927898148282 ns/iter 5.643096695784644 ns/iter 0.80
Regex_Caret_Period_Range_Dollar 1.9644181442330328 ns/iter 2.5374413093582326 ns/iter 0.77
Regex_Nested_Backtrack 24.998951272791214 ns/iter 29.16777803486938 ns/iter 0.86
JSON_Array_Of_Objects_Unique 335.32266657792826 ns/iter 420.0116351427246 ns/iter 0.80
JSON_Parse_1 3636.6298523212677 ns/iter 4766.647565350533 ns/iter 0.76
JSON_Parse_Real 5085.877869203895 ns/iter 6370.26249191023 ns/iter 0.80
JSON_Parse_Decimal 5624.721300326662 ns/iter 6834.64094557151 ns/iter 0.82
JSON_Parse_Schema_ISO_Language 2955247.6451613074 ns/iter 3897561.9610388186 ns/iter 0.76
JSON_Parse_Integer 3180.364513386416 ns/iter 3692.9674606626586 ns/iter 0.86
JSON_Parse_String_NonSSO_Plain 3494.178343209702 ns/iter 4433.294993693247 ns/iter 0.79
JSON_Parse_String_SSO_Plain 1774.5430973783443 ns/iter 2145.264419237668 ns/iter 0.83
JSON_Parse_String_Escape_Heavy 15824.19623296416 ns/iter 19804.477972315737 ns/iter 0.80
JSON_Parse_Object_Short_Keys 5202.567910000653 ns/iter 6440.799325642464 ns/iter 0.81
JSON_Parse_Object_Scalar_Properties 2681.9140252365964 ns/iter 3520.641790289996 ns/iter 0.76
JSON_Parse_Object_Array_Properties 3465.7007184711697 ns/iter 4547.456895964538 ns/iter 0.76
JSON_Parse_Object_Object_Properties 3503.469103361908 ns/iter 4989.694599293121 ns/iter 0.70
JSON_Parse_Nested_Containers 27831.531048091565 ns/iter 34593.8685650666 ns/iter 0.80
JSON_From_String_Copy 23.66173633433458 ns/iter 33.88394606933448 ns/iter 0.70
JSON_From_String_Temporary 19.43000145064645 ns/iter 29.21159320002604 ns/iter 0.67
JSON_Number_To_Double 33.260326521898875 ns/iter 43.00041938777272 ns/iter 0.77
JSON_Object_At_Last_Key/8 3.742107607824787 ns/iter 4.365342340273569 ns/iter 0.86
JSON_Object_At_Last_Key/32 11.516916857068042 ns/iter 14.221800437155357 ns/iter 0.81
JSON_Object_At_Last_Key/128 54.457837594136706 ns/iter 58.402352838574295 ns/iter 0.93
JSON_Object_At_Last_Key/512 181.76649768143915 ns/iter 247.53614818776197 ns/iter 0.73
JSON_Fast_Hash_Helm_Chart_Lock 58.34223277054955 ns/iter 66.28732858069706 ns/iter 0.88
JSON_Equality_Helm_Chart_Lock 133.64813538149122 ns/iter 166.81510350985437 ns/iter 0.80
JSON_Divisible_By_Decimal 178.01284766550106 ns/iter 238.6984881976832 ns/iter 0.75
JSON_String_Equal/10 7.458282272186299 ns/iter 8.227128035575953 ns/iter 0.91
JSON_String_Equal/100 6.70714253749499 ns/iter 7.860591361461829 ns/iter 0.85
JSON_String_Equal_Small_By_Perfect_Hash/10 0.7611700792934681 ns/iter 0.8324565341212145 ns/iter 0.91
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 3.259320572142822 ns/iter 3.8988657508019666 ns/iter 0.84
JSON_String_Fast_Hash/10 2.6965462990546896 ns/iter 2.596193126710756 ns/iter 1.04
JSON_String_Fast_Hash/100 2.200198451905795 ns/iter 2.4887125366504486 ns/iter 0.88
JSON_String_Key_Hash/10 1.3757537695751054 ns/iter 1.6491119016951523 ns/iter 0.83
JSON_String_Key_Hash/100 2.1623976986218985 ns/iter 2.802576177532386 ns/iter 0.77
JSON_Object_Defines_Miss_Same_Length 2.3295188045737527 ns/iter 4.464525042125819 ns/iter 0.52
JSON_Object_Defines_Miss_Too_Small 2.387139699671595 ns/iter 2.940615769779611 ns/iter 0.81
JSON_Object_Defines_Miss_Too_Large 2.3333493304625907 ns/iter 3.311204418310936 ns/iter 0.70
Pointer_Object_Traverse 13.806383348926621 ns/iter 19.243814084285205 ns/iter 0.72
Pointer_Object_Try_Traverse 22.866385509381534 ns/iter 33.56020473534882 ns/iter 0.68
Pointer_Push_Back_Pointer_To_Weak_Pointer 153.47899916362707 ns/iter 238.071189378282 ns/iter 0.64
Pointer_Walker_Schema_ISO_Language 2365745.583038713 ns/iter 3810275.3544974625 ns/iter 0.62
Pointer_Maybe_Tracked_Deeply_Nested/0 911299.5689654304 ns/iter 1433296.778151173 ns/iter 0.64
Pointer_Maybe_Tracked_Deeply_Nested/1 1305352.1719858018 ns/iter 1899862.4134899895 ns/iter 0.69
Pointer_Position_Tracker_Get_Deeply_Nested 362.3155914983313 ns/iter 510.2640445036355 ns/iter 0.71
URITemplateRouter_Create 22870.76968016557 ns/iter 34655.20349801766 ns/iter 0.66
URITemplateRouter_Match 159.9729411241958 ns/iter 224.916150983148 ns/iter 0.71
URITemplateRouter_Match_BasePath 191.17536091055482 ns/iter 245.15512791913974 ns/iter 0.78
URITemplateRouterView_Restore 9388.900633031353 ns/iter 14858.768191227704 ns/iter 0.63
URITemplateRouterView_Match 130.48141690154534 ns/iter 178.84804895223473 ns/iter 0.73
URITemplateRouterView_Match_BasePath 142.76455064156121 ns/iter 216.54056612126394 ns/iter 0.66
URITemplateRouterView_Arguments 405.3166929196069 ns/iter 547.9634732618877 ns/iter 0.74
JSONL_Parse_Large 11995544.551723469 ns/iter 18194417.717950273 ns/iter 0.66
JSONL_Parse_Large_GZIP 13433967.942306098 ns/iter 19767892.26829424 ns/iter 0.68
HTML_Build_Table_100000 62605891.60000336 ns/iter 73003606.55555475 ns/iter 0.86
HTML_Render_Table_100000 3389315.688235349 ns/iter 4974511.075949631 ns/iter 0.68
GZIP_Compress_ISO_Language_Set_3_Locations 25634163.461540118 ns/iter 33612636.90476335 ns/iter 0.76
GZIP_Decompress_ISO_Language_Set_3_Locations 5562088.000000239 ns/iter 6062128.335999659 ns/iter 0.92
GZIP_Compress_ISO_Language_Set_3_Schema 1488599.6008677273 ns/iter 1693128.67254399 ns/iter 0.88
GZIP_Decompress_ISO_Language_Set_3_Schema 281722.9382342023 ns/iter 285833.285823458 ns/iter 0.99
JOSE_VerifySignature_RS256 21475.92978071964 ns/iter 26763.697332524727 ns/iter 0.80
JOSE_VerifySignature_ES512 982712.8814016836 ns/iter 1171767.154191653 ns/iter 0.84

This comment was automatically generated by workflow using github-action-benchmark.

Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/core/http/include/sourcemeta/core/http_system.h">

<violation number="1" location="src/core/http/include/sourcemeta/core/http_system.h:141">
P2: `maximum_redirects()` accepts values that can overflow when converted to backend API types. Validate/clamp before storing to prevent truncation-driven misconfiguration.</violation>

<violation number="2" location="src/core/http/include/sourcemeta/core/http_system.h:147">
P2: `timeout()` allows durations larger than backend integer ranges. Add range validation to avoid overflow that can produce incorrect or negative-equivalent timeouts.</violation>
</file>

<file name="src/core/http/client_darwin.mm">

<violation number="1" location="src/core/http/client_darwin.mm:154">
P2: `connect_timeout_` is mapped to request idle/read timeout semantics on Darwin, not a connect-phase timeout. This makes timeout behavior inconsistent across backends and can fail requests during slow response gaps after connection.</violation>
</file>

<file name=".github/workflows/ci.yml">

<violation number="1" location=".github/workflows/ci.yml:96">
P2: Enabling `SOURCEMETA_CORE_TESTS_CI` unconditionally in CI runs HTTP integration tests against the live `schemas.sourcemeta.com` service. Transient network or DNS failures will cause false-negative test results. Consider adding a retry mechanism, gating behind a dedicated CI label/job, or skipping when the service is unreachable.</violation>
</file>

<file name="src/core/http/client_curl.cc">

<violation number="1" location="src/core/http/client_curl.cc:136">
P2: Header list allocation failure is silently ignored. This can drop required headers without error and change request semantics.</violation>

<violation number="2" location="src/core/http/client_curl.cc:321">
P2: libcurl option-setting errors are ignored; request can run with unintended defaults. Fail fast on non-CURLE_OK from each curl_easy_setopt/curl_easy_getinfo call.</violation>
</file>

<file name="src/core/http/client_windows.cc">

<violation number="1" location="src/core/http/client_windows.cc:165">
P2: WinHttpSetTimeouts return value is ignored. Timeout configuration failures become silent misconfiguration.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread src/core/http/client_windows.cc Outdated
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 1 file (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/core/http/include/sourcemeta/core/http_system.h">

<violation number="1" location="src/core/http/include/sourcemeta/core/http_system.h:141">
P2: `maximum_redirects()` accepts values that can overflow when converted to backend API types. Validate/clamp before storing to prevent truncation-driven misconfiguration.</violation>

<violation number="2" location="src/core/http/include/sourcemeta/core/http_system.h:147">
P2: `timeout()` allows durations larger than backend integer ranges. Add range validation to avoid overflow that can produce incorrect or negative-equivalent timeouts.</violation>
</file>

<file name="src/core/http/client_darwin.mm">

<violation number="1" location="src/core/http/client_darwin.mm:154">
P2: `connect_timeout_` is mapped to request idle/read timeout semantics on Darwin, not a connect-phase timeout. This makes timeout behavior inconsistent across backends and can fail requests during slow response gaps after connection.</violation>
</file>

<file name=".github/workflows/ci.yml">

<violation number="1" location=".github/workflows/ci.yml:96">
P2: Enabling `SOURCEMETA_CORE_TESTS_CI` unconditionally in CI runs HTTP integration tests against the live `schemas.sourcemeta.com` service. Transient network or DNS failures will cause false-negative test results. Consider adding a retry mechanism, gating behind a dedicated CI label/job, or skipping when the service is unreachable.</violation>
</file>

<file name="src/core/http/client_curl.cc">

<violation number="1" location="src/core/http/client_curl.cc:136">
P2: Header list allocation failure is silently ignored. This can drop required headers without error and change request semantics.</violation>

<violation number="2" location="src/core/http/client_curl.cc:321">
P2: libcurl option-setting errors are ignored; request can run with unintended defaults. Fail fast on non-CURLE_OK from each curl_easy_setopt/curl_easy_getinfo call.</violation>
</file>

<file name="src/core/http/client_windows.cc">

<violation number="1" location="src/core/http/client_windows.cc:165">
P2: WinHttpSetTimeouts return value is ignored. Timeout configuration failures become silent misconfiguration.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread src/core/http/client_windows.cc
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (linux/gcc)

Details
Benchmark suite Current: 15e91b5 Previous: 8cc4718 Ratio
JOSE_VerifySignature_RS256 24390.81919263432 ns/iter 24477.169080427142 ns/iter 1.00
JOSE_VerifySignature_ES512 641865.3685662393 ns/iter 644499.9688358385 ns/iter 1.00
GZIP_Compress_ISO_Language_Set_3_Locations 39452504.555552214 ns/iter 39392853.83333097 ns/iter 1.00
GZIP_Decompress_ISO_Language_Set_3_Locations 4044464.1965316446 ns/iter 4065827.38372134 ns/iter 0.99
GZIP_Compress_ISO_Language_Set_3_Schema 2287122.7450982025 ns/iter 2286099.3366015125 ns/iter 1.00
GZIP_Decompress_ISO_Language_Set_3_Schema 276509.88064234186 ns/iter 278028.25482451636 ns/iter 0.99
HTML_Build_Table_100000 70506527.60000275 ns/iter 70296137.29999937 ns/iter 1.00
HTML_Render_Table_100000 1878919.948509437 ns/iter 2002931.999999705 ns/iter 0.94
JSONL_Parse_Large 12394692.70175457 ns/iter 12411864.303570854 ns/iter 1.00
JSONL_Parse_Large_GZIP 13963031.55999931 ns/iter 13910502.300000189 ns/iter 1.00
URITemplateRouter_Create 30890.85160128638 ns/iter 30211.324689241643 ns/iter 1.02
URITemplateRouter_Match 154.73957910092622 ns/iter 156.60064034394333 ns/iter 0.99
URITemplateRouter_Match_BasePath 183.66439322597543 ns/iter 185.9655893471588 ns/iter 0.99
URITemplateRouterView_Restore 8636.406642023832 ns/iter 8700.620403854102 ns/iter 0.99
URITemplateRouterView_Match 126.82798805929666 ns/iter 126.77290182549558 ns/iter 1.00
URITemplateRouterView_Match_BasePath 144.78874227776328 ns/iter 144.88346985762433 ns/iter 1.00
URITemplateRouterView_Arguments 457.68809682116944 ns/iter 457.6003802254374 ns/iter 1.00
Pointer_Object_Traverse 29.616100715494564 ns/iter 29.624655136244623 ns/iter 1.00
Pointer_Object_Try_Traverse 22.921146830237834 ns/iter 22.84916200844287 ns/iter 1.00
Pointer_Push_Back_Pointer_To_Weak_Pointer 169.18350879161738 ns/iter 170.84905804772623 ns/iter 0.99
Pointer_Walker_Schema_ISO_Language 1963286.0769232002 ns/iter 1913362.9610028507 ns/iter 1.03
Pointer_Maybe_Tracked_Deeply_Nested/0 1520830.030434779 ns/iter 1527477.006578842 ns/iter 1.00
Pointer_Maybe_Tracked_Deeply_Nested/1 1662674.5690476105 ns/iter 1660372.520094541 ns/iter 1.00
Pointer_Position_Tracker_Get_Deeply_Nested 538.8513303484352 ns/iter 589.6198253309873 ns/iter 0.91
JSON_Array_Of_Objects_Unique 376.55991982375275 ns/iter 402.40652901071655 ns/iter 0.94
JSON_Parse_1 7554.73135672356 ns/iter 7392.9423118028035 ns/iter 1.02
JSON_Parse_Real 6612.248716721771 ns/iter 6618.941851771369 ns/iter 1.00
JSON_Parse_Decimal 9516.477686758899 ns/iter 9483.980298296132 ns/iter 1.00
JSON_Parse_Schema_ISO_Language 5088987.978102145 ns/iter 5108958.288888566 ns/iter 1.00
JSON_Parse_Integer 4816.7796050140305 ns/iter 4819.605481853288 ns/iter 1.00
JSON_Parse_String_NonSSO_Plain 8456.126240192858 ns/iter 8819.15560669446 ns/iter 0.96
JSON_Parse_String_SSO_Plain 3558.893011032113 ns/iter 3690.888682344534 ns/iter 0.96
JSON_Parse_String_Escape_Heavy 19246.16829457879 ns/iter 19365.130246060042 ns/iter 0.99
JSON_Parse_Object_Short_Keys 11388.28662751917 ns/iter 11343.538485280704 ns/iter 1.00
JSON_Parse_Object_Scalar_Properties 5783.117864450018 ns/iter 5789.464182296807 ns/iter 1.00
JSON_Parse_Object_Array_Properties 9505.25785643622 ns/iter 8999.73724814563 ns/iter 1.06
JSON_Parse_Object_Object_Properties 9473.880650383215 ns/iter 9325.373990103539 ns/iter 1.02
JSON_Parse_Nested_Containers 72910.3111814383 ns/iter 73383.79450343704 ns/iter 0.99
JSON_From_String_Copy 20.214152336994392 ns/iter 19.508591657260446 ns/iter 1.04
JSON_From_String_Temporary 17.10414706133229 ns/iter 16.348598475216324 ns/iter 1.05
JSON_Number_To_Double 19.720778327033628 ns/iter 19.68631179397995 ns/iter 1.00
JSON_Object_At_Last_Key/8 6.686721748846806 ns/iter 6.684935610333219 ns/iter 1.00
JSON_Object_At_Last_Key/32 23.575308998938958 ns/iter 23.61576353386631 ns/iter 1.00
JSON_Object_At_Last_Key/128 91.1032243404916 ns/iter 91.11316519547869 ns/iter 1.00
JSON_Object_At_Last_Key/512 379.89909208396824 ns/iter 379.5457120668015 ns/iter 1.00
JSON_Fast_Hash_Helm_Chart_Lock 52.00889949658747 ns/iter 54.16526688826668 ns/iter 0.96
JSON_Equality_Helm_Chart_Lock 149.77872900371156 ns/iter 155.73211617079326 ns/iter 0.96
JSON_Divisible_By_Decimal 232.26197605931236 ns/iter 234.39696984866976 ns/iter 0.99
JSON_String_Equal/10 5.3237707002525 ns/iter 5.320591007164517 ns/iter 1.00
JSON_String_Equal/100 6.378226957788638 ns/iter 6.0276745752925445 ns/iter 1.06
JSON_String_Equal_Small_By_Perfect_Hash/10 0.7098915825057519 ns/iter 0.714870701463157 ns/iter 0.99
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 21.943499203318844 ns/iter 21.94406950767342 ns/iter 1.00
JSON_String_Fast_Hash/10 1.0556379122296573 ns/iter 1.0556214366823131 ns/iter 1.00
JSON_String_Fast_Hash/100 1.0604411901224406 ns/iter 1.0549720998286016 ns/iter 1.01
JSON_String_Key_Hash/10 1.083949643690296 ns/iter 1.0857451706235925 ns/iter 1.00
JSON_String_Key_Hash/100 14.761282328553333 ns/iter 15.07363266661416 ns/iter 0.98
JSON_Object_Defines_Miss_Same_Length 3.8712329228546603 ns/iter 3.8822455221215004 ns/iter 1.00
JSON_Object_Defines_Miss_Too_Small 3.869079140212956 ns/iter 3.867185370849452 ns/iter 1.00
JSON_Object_Defines_Miss_Too_Large 3.518057400069883 ns/iter 3.5162223313607326 ns/iter 1.00
Regex_Lower_S_Or_Upper_S_Asterisk 1.0592777219386091 ns/iter 1.0547183702199425 ns/iter 1.00
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 1.055290265446265 ns/iter 1.055505964297968 ns/iter 1.00
Regex_Period_Asterisk 0.7048836967818491 ns/iter 0.7041312384808168 ns/iter 1.00
Regex_Group_Period_Asterisk_Group 0.7039157588288492 ns/iter 0.7037498420280308 ns/iter 1.00
Regex_Period_Plus 1.0558842196593887 ns/iter 1.0556266841706763 ns/iter 1.00
Regex_Period 1.055802841496768 ns/iter 1.0546888791178899 ns/iter 1.00
Regex_Caret_Period_Plus_Dollar 0.7034426030560573 ns/iter 0.7052515712377729 ns/iter 1.00
Regex_Caret_Group_Period_Plus_Group_Dollar 0.7052692825756661 ns/iter 0.7039869784848539 ns/iter 1.00
Regex_Caret_Period_Asterisk_Dollar 1.0550607784102242 ns/iter 1.0556755619425715 ns/iter 1.00
Regex_Caret_Group_Period_Asterisk_Group_Dollar 1.0552450661397135 ns/iter 1.0818170008855115 ns/iter 0.98
Regex_Caret_X_Hyphen 4.21966528957093 ns/iter 4.221724488268305 ns/iter 1.00
Regex_Period_Md_Dollar 33.20293300534798 ns/iter 34.77601956177343 ns/iter 0.95
Regex_Caret_Slash_Period_Asterisk 3.8691459325754987 ns/iter 3.8687559930649837 ns/iter 1.00
Regex_Caret_Period_Range_Dollar 1.0554731290976767 ns/iter 1.06024489674554 ns/iter 1.00
Regex_Nested_Backtrack 38.965657374046 ns/iter 43.53478409452232 ns/iter 0.90

This comment was automatically generated by workflow using github-action-benchmark.

@jviotti jviotti merged commit bb1c78e into main Jun 18, 2026
12 checks passed
@jviotti jviotti deleted the system-http-client branch June 18, 2026 18:52

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (windows/msvc)

Details
Benchmark suite Current: 15e91b5 Previous: 8cc4718 Ratio
Regex_Lower_S_Or_Upper_S_Asterisk 5.086918000001788 ns/iter 5.072033999999803 ns/iter 1.00
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 5.013089999997646 ns/iter 5.247021000000132 ns/iter 0.96
Regex_Period_Asterisk 5.0246510000033595 ns/iter 5.026106249999884 ns/iter 1.00
Regex_Group_Period_Asterisk_Group 5.0188696428555035 ns/iter 5.125762813641865 ns/iter 0.98
Regex_Period_Plus 4.819870313577468 ns/iter 4.833065178571262 ns/iter 1.00
Regex_Period 4.823859988156383 ns/iter 4.811622099288711 ns/iter 1.00
Regex_Caret_Period_Plus_Dollar 4.825545112683114 ns/iter 4.8667149117976924 ns/iter 0.99
Regex_Caret_Group_Period_Plus_Group_Dollar 4.818914710897399 ns/iter 4.812733393929167 ns/iter 1.00
Regex_Caret_Period_Asterisk_Dollar 5.020226999999977 ns/iter 5.0107230000003256 ns/iter 1.00
Regex_Caret_Group_Period_Asterisk_Group_Dollar 5.014057999997021 ns/iter 5.325587499998262 ns/iter 0.94
Regex_Caret_X_Hyphen 8.165433445693074 ns/iter 8.155876116074774 ns/iter 1.00
Regex_Period_Md_Dollar 44.31582499998399 ns/iter 44.28878749999399 ns/iter 1.00
Regex_Caret_Slash_Period_Asterisk 7.84509374999536 ns/iter 7.929349330356875 ns/iter 0.99
Regex_Caret_Period_Range_Dollar 5.953354000002945 ns/iter 5.956174107142584 ns/iter 1.00
Regex_Nested_Backtrack 54.18077999997877 ns/iter 54.14916071430298 ns/iter 1.00
JSON_Array_Of_Objects_Unique 497.9296000001341 ns/iter 493.0466570854778 ns/iter 1.01
JSON_Parse_1 8761.659099740693 ns/iter 8771.759947502711 ns/iter 1.00
JSON_Parse_Real 16022.354910713178 ns/iter 15976.267857149245 ns/iter 1.00
JSON_Parse_Decimal 11833.403571423722 ns/iter 11810.414285711042 ns/iter 1.00
JSON_Parse_Schema_ISO_Language 7679374.444443157 ns/iter 7209916.666665272 ns/iter 1.07
JSON_Parse_Integer 6105.2714285706 ns/iter 6142.543750002005 ns/iter 0.99
JSON_Parse_String_NonSSO_Plain 7794.733258929146 ns/iter 7675.143973214305 ns/iter 1.02
JSON_Parse_String_SSO_Plain 3702.749726617548 ns/iter 3681.7093894223303 ns/iter 1.01
JSON_Parse_String_Escape_Heavy 21787.55625000406 ns/iter 21734.584374996753 ns/iter 1.00
JSON_Parse_Object_Short_Keys 13179.057142857735 ns/iter 13147.341071430674 ns/iter 1.00
JSON_Parse_Object_Scalar_Properties 6780.968749998197 ns/iter 6765.068750001189 ns/iter 1.00
JSON_Parse_Object_Array_Properties 11374.99821429141 ns/iter 11327.296428573522 ns/iter 1.00
JSON_Parse_Object_Object_Properties 11548.380357136726 ns/iter 11536.295312502887 ns/iter 1.00
JSON_Parse_Nested_Containers 79539.9330357327 ns/iter 78740.8370536115 ns/iter 1.01
JSON_From_String_Copy 66.62970535712377 ns/iter 63.89991964287642 ns/iter 1.04
JSON_From_String_Temporary 61.60445000000436 ns/iter 59.05656250003436 ns/iter 1.04
JSON_Number_To_Double 120.67637499995955 ns/iter 119.39903571430932 ns/iter 1.01
JSON_Object_At_Last_Key/8 7.391925223210195 ns/iter 7.233046875003066 ns/iter 1.02
JSON_Object_At_Last_Key/32 23.27759237413083 ns/iter 23.33445174848743 ns/iter 1.00
JSON_Object_At_Last_Key/128 89.27707637155146 ns/iter 89.31918351249558 ns/iter 1.00
JSON_Object_At_Last_Key/512 423.82690104442827 ns/iter 424.94951059480405 ns/iter 1.00
JSON_Fast_Hash_Helm_Chart_Lock 63.91376785712412 ns/iter 63.32599107143518 ns/iter 1.01
JSON_Equality_Helm_Chart_Lock 300.018872765788 ns/iter 300.6451785714554 ns/iter 1.00
JSON_Divisible_By_Decimal 296.3271477313059 ns/iter 300.82823874690575 ns/iter 0.99
JSON_String_Equal/10 15.080667410712422 ns/iter 15.176564732146044 ns/iter 0.99
JSON_String_Equal/100 16.322069979983226 ns/iter 16.379312500000815 ns/iter 1.00
JSON_String_Equal_Small_By_Perfect_Hash/10 2.5071310714289603 ns/iter 2.507871785714347 ns/iter 1.00
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 14.186611543817076 ns/iter 14.152690785030796 ns/iter 1.00
JSON_String_Fast_Hash/10 4.702198001567373 ns/iter 4.782502622185683 ns/iter 0.98
JSON_String_Fast_Hash/100 4.703623001571218 ns/iter 4.989934999998695 ns/iter 0.94
JSON_String_Key_Hash/10 5.33486964285755 ns/iter 5.337740999998459 ns/iter 1.00
JSON_String_Key_Hash/100 11.878314285711765 ns/iter 11.878142857142393 ns/iter 1.00
JSON_Object_Defines_Miss_Same_Length 4.084356257293997 ns/iter 4.082210379464815 ns/iter 1.00
JSON_Object_Defines_Miss_Too_Small 5.029437999996844 ns/iter 5.01872053571414 ns/iter 1.00
JSON_Object_Defines_Miss_Too_Large 4.391819998040913 ns/iter 4.392032500001619 ns/iter 1.00
Pointer_Object_Traverse 70.0294464285532 ns/iter 69.69215401783556 ns/iter 1.00
Pointer_Object_Try_Traverse 70.99121428568976 ns/iter 70.71739955359288 ns/iter 1.00
Pointer_Push_Back_Pointer_To_Weak_Pointer 193.50390120570907 ns/iter 190.98317776636162 ns/iter 1.01
Pointer_Walker_Schema_ISO_Language 8004906.666666203 ns/iter 7077117.857140332 ns/iter 1.13
Pointer_Maybe_Tracked_Deeply_Nested/0 2436905.2208827217 ns/iter 2302085.3571421998 ns/iter 1.06
Pointer_Maybe_Tracked_Deeply_Nested/1 3728352.941178013 ns/iter 3583633.8461544635 ns/iter 1.04
Pointer_Position_Tracker_Get_Deeply_Nested 550.3070535711784 ns/iter 564.9139508930391 ns/iter 0.97
URITemplateRouter_Create 40597.759851434625 ns/iter 40809.90656373775 ns/iter 0.99
URITemplateRouter_Match 219.155343750117 ns/iter 193.4435529859713 ns/iter 1.13
URITemplateRouter_Match_BasePath 238.0566428571131 ns/iter 213.49893749999185 ns/iter 1.12
URITemplateRouterView_Restore 31191.57725095408 ns/iter 31213.223631195477 ns/iter 1.00
URITemplateRouterView_Match 157.70388392856 ns/iter 157.8578634884692 ns/iter 1.00
URITemplateRouterView_Match_BasePath 175.34465236679816 ns/iter 174.80968749999144 ns/iter 1.00
URITemplateRouterView_Arguments 522.1019000000524 ns/iter 520.441000000119 ns/iter 1.00
JSONL_Parse_Large 33395819.047611788 ns/iter 32521419.04762798 ns/iter 1.03
JSONL_Parse_Large_GZIP 33486837.50001176 ns/iter 33209386.363627017 ns/iter 1.01
HTML_Build_Table_100000 90860457.14288308 ns/iter 97988557.1428635 ns/iter 0.93
HTML_Render_Table_100000 8376426.666664984 ns/iter 7070202.222222279 ns/iter 1.18
GZIP_Compress_ISO_Language_Set_3_Locations 36632642.105264254 ns/iter 36266315.7894818 ns/iter 1.01
GZIP_Decompress_ISO_Language_Set_3_Locations 10260509.333329538 ns/iter 9236263.999997998 ns/iter 1.11
GZIP_Compress_ISO_Language_Set_3_Schema 2114485.797102279 ns/iter 2116300.289854616 ns/iter 1.00
GZIP_Decompress_ISO_Language_Set_3_Schema 651489.017857086 ns/iter 595491.9642854455 ns/iter 1.09
JOSE_VerifySignature_RS256 21286.20799721459 ns/iter 21156.96562499636 ns/iter 1.01
JOSE_VerifySignature_ES512 1538275.6696433425 ns/iter 1531241.5178568375 ns/iter 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant