2026-08-17 - v1.06
    + fix: any form-urlencoded request (the GET default, or content_type
      set explicitly) containing a genuinely wide Unicode character in a
      key or value - any CJK character, Cyrillic, Greek, emoji - crashed
      outright instead of encoding. kvp2str_each used URI::Escape's
      uri_escape(), which only handles codepoints up to 0xFF; switched to
      uri_escape_utf8(). JSON requests were unaffected (HAC-029)
    + test: coverage added for _tune_utf8's UTF-8 encoding path, tested
      directly as it's unreachable through the public API - convert_data()
      always hands it already byte-encoded content (HAC-028)
    + fix: RETRY_FAIL_STATUS silently dropped any status code after a
      comma-space separator (e.g. "500, 404") - the split didn't trim
      whitespace, so the leading space left on every status but the first
      never matched the response code and that status silently never
      retried (HAC-027)
    + test: coverage added for skip_headers/skip_key (new_request/
      kvp2json/kvp2str), previously undocumented and, for skip_headers,
      untested (HAC-026)
    + test: coverage added for before_headers and before_sorting_keys/
      after_sorting_keys events (never exercised before) (HAC-024)
    + fix: add_headers_keys, following its own documented usage (mutate
      %headers as a side effect, then return the key), caused that key to
      be double-counted in new_request()'s @keys - before_header/
      after_header for that key fired twice instead of once (HAC-025)
    + test: coverage added for headers_keys/add_headers_keys/before_header/
      after_header events (never exercised before), and for auth_token
      including the documented username/password-wins precedence rule
      (HAC-021, HAC-023)
    + fix: the not_include event was silently ignored in form-urlencoded
      mode (kvp2str) - it only worked for JSON (kvp2json). A key explicitly
      excluded via not_include still leaked into a form-urlencoded request
      body (HAC-022)
    + fix: kvp2str_each() silently stringified a nested hash value as
      'HASH(0x...)' in the query string - now dies with a clear message
      naming the key, mirroring the same fix already applied to
      convert_data() (HAC-020)

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
