2026-08-17 - v1.05
+ test: coverage added for the DEBUG_* env vars (never exercised before);
clarified DEBUG_RESPONSE_IF_FAIL's POD - it only narrows DEBUG_IN_OUT/
DEBUG_RESPONSE, it does nothing by itself (HAC-017, HAC-018)
+ fix: _execute_callbacks() used each() on the data/headers hash while
callbacks could mutate that same hash - confirmed via Perl's own
"each() after insertion" undefined-behavior warning. Now iterates a
keys() snapshot instead (HAC-016)
+ fix: root Dockerfile never put lib/ on PERL5LIB, so docker run always
failed at 'use HTTP::API::Client' - verified with a real build+run,
all tests now pass in the container (HAC-013)
+ test: coverage added for put()/head()/delete() (never exercised before)
and for json_response()/kvp_response()'s actual decode logic (only
their empty-input guards had coverage) - no behavior changed, all
confirmed already correct (HAC-014, HAC-015)
+ fix: a client configured with an engine other than LWP::UserAgent now
dies with a clear message instead of crashing later with a confusing
"is_success on an undefined value" - real custom-engine dispatch is
still an open design question, not decided here (HAC-010)
+ fix: RETRY_FAIL_STATUS crashed (wrong method name, decode_content vs
decoded_content) any time it was actually used - the body-pattern-match
it was trying to do was never wired up either, retry now happens purely
on status-code match as the POD has always documented (HAC-009)
+ fix: kvp_response() crashed if called before any request was made -
now returns {} like json_response() already did (HAC-007)
+ fix: convert_data() silently stringified a data hashref as 'HASH(0x...)'
for any content_type other than json/form-urlencoded - now returns an
empty body for empty data, dies with a clear message otherwise (HAC-008)
+ fix: a non-GET request (POST/PUT/DELETE) with application/x-www-form-urlencoded
content-type and empty data never built an HTTP::Request object and crashed
in send() - now builds an empty-content request correctly (HAC-004)
+ fix: send() slept RETRY_DELAY seconds on every failed request even with
RETRY_FAIL_RESPONSE=0 (the default, no retries) - now returns immediately
when no retry attempt is left (HAC-006)
+ license changed to MIT
+ Devel::Cover wired up as a develop-phase dependency, coverage documented in README
2021-03-31 - v1.03
+ use lazy builder, so the sub classes can just overwrite the _build_ sub instead of using default => sub {}
2021-03-31 - v1.02
+ convert number in the request
+ added data type markers
+ json true = xTRUE()
+ json false = xFALSE()
+ cgi param true = xTRUE() => "1"
+ cgi param false = xFALSE() => "0"
+ cgi param true = xTrue() => "True"
+ cgi param false = xFalse() => "False"
+ cgi param true = xtrue() => "true"
+ cgi param false = xfalse() => "false"
+ cgi param true = xt__e() => "t"
+ cgi param false = xf___e() => "f"
+ cgi param csv list = %a = (a => xCSV(1,2,3,4)) => "a=1,2,3,4"
otherwise = %b = (b => [1,2,3,4]) => "b=1&b=2&b=3&b=4"
2021-03-31 - v1.01
+ Enchance key value pairs representing on the cgi params
2021-03-31 - v1.0
+ improve readibility
+ improve the logic path
+ adding events to manipulate the logic flow
+ change some private methods to public methods
+ Change OOP Framework to Moo
2021-02-25 - v0.09
+ the data and header can be using callback function to make it more dynamic
2018-09-24 - v0.08 / v0.07
+ Bugfix pre defined headers and parameters
2017-08-10 - v0.06
+ You can pre defined parameters during object construction
+ You can pre defined headers during object construction
2015-01-20 - v0.04
+ Update POD
+ Remove unwanted perltidy message
2015-01-20 - v0.04
+ Fix test
2015-01-19 - 0.03
+ Add ENVIRONMENT VARIABLE usage
2015-01-18 - 0.02
+ Cleanup
2015-01-18 - 0.01
+ First version
2021-04-27 - v1.04
+ New event to not include keys that is defined in the request
+ Simplified the cpan module dep
+ Refresh the tests