Revision history for Fetch

0.08    2026-08-04
        - JSON (the `json =>` request option and Fetch::Response->json) now goes
          through File::Raw::JSON's C ABI 
        - Fetch is now an ExtUtils::Depends provider
        - Bodyless responses: 1xx, 204 and 304 never carry a body (RFC 7230
          3.3.3), and a server MUST NOT send Content-Length on 1xx/204, so
          the h1 parser treated the missing length as read-until-close - a
          204 on a keep-alive connection hung until timeout. Those statuses
          now complete at the end of headers.

0.07    2026-08-04
        - Build and run on perl before 5.14. A new include/fetch/ft_compat.h
          supplies fallbacks for perl API the C core used but which predates
          the perls Fetch claims (5.8.3+), all guarded by PERL_VERSION so newer
          perls are untouched:
          - XSPROTO / XS_INTERNAL / XS_EXTERNAL (the closure-callback macros,
            added to XSUB.h at 5.16): without them the build failed to compile
            ("XS_INTERNAL undeclared" / "cv undeclared") before any test ran.
          - mg_findext (5.14), used by the C-closure machinery to fetch a
            closure's captured magic: without it the module built but died at
            runtime ("undefined symbol: mg_findext"), failing most tests.
          - croak_sv (5.13.1), used on a few error paths.

0.06    2026-08-03
        - Build against older OpenSSL. The TLS code uses the OpenSSL 1.1.0 API
          (TLS_client_method, SSL_CTX_set_min_proto_version, SSL_set1_host);
          on libraries that lack it (OpenSSL 1.0.x / 0.9.8 on legacy BSDs,
          LibreSSL before 2.7) the loadable object failed to load with an
          undefined symbol. TLS now compiles to stubs there, as when OpenSSL
          is absent, so the module loads and cleartext HTTP works (https then
          fails cleanly).

0.05    2026-08-02
        - Add an on_headers request option: a coderef fired once, before any
          on_body chunk, with ($status, [k,v,...]). Lets a streaming consumer
          act on the status/headers up front (e.g. open a downstream writer).
          Not fired for a WebSocket upgrade.
        - Add a C ABI so other XS modules can drive Fetch from C without a
          per-request Perl round trip. 

0.04    2026-08-02
        - Fixes for Windows build:
          - Rename the readiness-backend vtable member "wait" to "wait_ev"
          - Add a portable ft_memmem (a GNU/BSD extension MinGW lacks)
          - Define _CRT_RAND_S at the very top of Fetch.xs

0.03    2026-08-02
        - Fetch->new(simple_response => 1): resolve to a plain unblessed hashref
          { status, headers, content } instead of a blessed Fetch::Response, so
          callers read fields directly and skip method dispatch. A lean option
          for consuming very large numbers of responses.
        - Native Windows (MSWin32) port. A new socket/IO shim (ft_win.h) maps
          the ~dozen socket calls onto Winsock: sockets are wrapped in a CRT fd
          via _open_osfhandle so the rest of the core keeps its dense "int fd"
          model (per-fd callback arrays, the backend, TLS all unchanged), with
          the real SOCKET recovered only at the Winsock boundary and WSA errors
          mapped to errno. A select()-based readiness backend (backend_select.c)
          replaces poll (which Windows lacks)
        - Link -lrt when clock_gettime needs it. backend_poll.c calls
          clock_gettime(CLOCK_MONOTONIC), which lives in librt on glibc before
          2.17

0.02    2026-08-01
        - Fix a missing NUL terminator in the URL-scheme lowercaser
          (ft_lc_dup)

0.01    2026-08-01
        First version
