Revision history for Perl extension Feersum

1.507
        New:
        - multiple server instances (new_instance) and multiple listeners
          per instance, IPv6 among them
        - TLS 1.3 via picotls+openssl: per-listener certificates, SNI vhosts
        - HTTP/2 via nghttp2: multiplexing, streaming, extended CONNECT
          (RFC 8441), rapid-reset protection (CVE-2023-44487)
        - PROXY protocol v1/v2, including TLVs
        - reverse_proxy mode: take client_address and url_scheme from
          X-Forwarded-For/-Proto behind a trusted upstream; off by default
        - SO_REUSEPORT, sendfile, UNIX-socket listeners
        - timeouts and limits: header_timeout, read_timeout, write_timeout,
          linger_timeout, max_connections, max_body_len, max_uri_len,
          max_read_buf, max_accept_per_loop, max_h2_concurrent_streams,
          wbuf_low_water, max_connection_reqs
        - introspection: active_conns, total_requests, access_log,
          pause_accept/resume_accept, set_psgix_io
        - psgix.h2.trailers, psgix.h2.extended_connect, psgix.h2.protocol,
          psgix.proxy_tlvs
        - psgi.input gains getline, getlines and <$fh>
        - Feersum::Runner: hot_restart, pre_fork, preload_app, daemonize,
          pid_file, user/group, after_fork, access_log, graceful_timeout,
          startup_timeout, max_requests_per_worker
        - bin/feersum native mode with full Runner option parity
        - about 34% more PSGI throughput

        Incompatible with 1.505:
        - requires Perl 5.14 (was 5.8.7)
        - the Feersum object is no longer a hashref; use the public API
        - psgix.input.buffered is no longer advertised.  It promises a
          rewindable handle and psgi.input is forward-only; unset, Plack
          buffers the body itself and every read ordering works
        - a UTF8-flagged response string whose characters all fit in a byte
          is sent as those bytes, matching every other PSGI server
        - a 1xx final response status is refused (101 stays legal), and a
          status above 599 answers 500
        - response headers and status lines carrying CR, LF, NUL or other
          control characters are refused (CWE-113)
        - psgi.input is always present, per PSGI 1.1

        See the UPGRADING section in the Feersum docs for behaviour changes
        that need no code change to bite.

1.506 Thu Jan 16 00:00:00 2026 +0300
        Performance:
        - free-lists for iomatrix, feer_req and rinq structs
        - cache remote_addr/remote_port per connection
        - embed sockaddr_storage in feer_conn struct
        - cached SVs for common HTTP status codes
        - ASCII case conversion lookup tables
        - improved likely/unlikely branch hints

        Benchmarks (vs 1.505, keepalive mode, h2load -c100 -t2 -D10s):
        - TCP PSGI: 139K req/s (+42% vs 98K in 1.505)
        - TCP Native: 219K req/s (+61% vs 135K in 1.505)
        - Unix socket PSGI: 184K req/s (+32% vs TCP)
        - Unix socket Native: 352K req/s (+61% vs TCP)

        Features:
        - Expect: 100-continue support for HTTP/1.1 clients
        - Transfer-Encoding: chunked request body support
        - Native interface io() method for protocol upgrades (WebSocket, etc.)
        - Native interface return_from_io() for keepalive after io() access
        - PSGI return_from_psgix_io() for keepalive after psgix.io access
        - poll_cb support on Reader handles for streaming input
        - pause_accept/resume_accept methods for backpressure control
        - sendfile() zero-copy file transfer (Linux)
        - SO_REUSEPORT for better prefork scaling
        - configurable libev watcher priorities (read_priority, write_priority, accept_priority)

        Security:
        - Request smuggling prevention: reject requests with both
          Content-Length and Transfer-Encoding headers (RFC 7230)
        - Reject obsolete header line folding (obs-fold) per RFC 7230
        - DoS protection: MAX_TRAILER_HEADERS limit for chunked requests

        Bugfixes:
        - fix uninitialized pointer in feersum_env_headers (potential UB)
        - fix off-by-one in uri_decode_sv bounds check
        - fix fcntl calls to preserve existing file descriptor flags
        - fix RESPOND_SHUTDOWN debug string value
        - fix av_extend argument for psgi.version array
        - fix max_connection_reqs type handling for negative values
        - fix test files missing 'use blib' (t/17-priority.t, t/56-leak-extended.t)
        - fix error message consistency (remove trailing periods)
        - fix chunked encoding for streaming responses with Content-Length
        - fix io_taken flag reset in return_from_psgix_io for keepalive
        - fix missing HEADER_NORM_UPCASE_DASH in @EXPORT_OK

        Code quality:
        - add thread-safety documentation and comments to non-thread-safe structures
        - add unlikely() to error paths consistently
        - add trailer_count field to connection struct for chunked parsing state
        - improve assert messages with descriptions
        - remove dead code: unused str_eq function, obs-fold handlers,
          RINQ_IS_UNINIT and RINQ_IS_ATTACHED macros
        - remove unused forward declaration feersum_set_keepalive
        - remove unused crlf_sv variable
        - remove unused char* n in feersum_env_headers
        - remove redundant conditional in keepalive reset
        - add missing static keyword to ev_idle ei declaration
        - add default case to switch in feersum_env_headers
        - use STRLEN instead of int for buffer sizes
        - improve multiline header tracking variable naming
        - fix typos: theif -> thief, probaby -> probably
        - added OOM check in rinq allocation with croak()
        - update outdated documentation for poll_cb on Reader handles
        - update outdated documentation for keepalive support
        - refactor: extract send_100_continue() helper to deduplicate code
        - refactor: extract free_request() helper to deduplicate request cleanup
        - refactor: extract feersum_return_from_io() shared helper for io return

1.505 Wed Apr 09 16:20:00 2025 -0200
        - pipeline fix
        - minor: manifest fix and test tweaks

1.504 Sat Jan 18 19:14:15 2025 -0200
        - http/1.1 pipelining support

1.503 Tue Sep 17 12:14:15 2024 -0200
        - start listening on re-forked child
        - try fix test for some older perls on freebsd

1.502 Wed Sep 03 19:10:55 2024 -0200
        - don't generate Content-Length header for 204 responses
        - acknowledge PERL_USE_UNSAFE_INC=0

1.501 Sat Aug 31 09:10:55 2024 -0200
        - http/1.1 keepalive support for chunked(streaming) responses
        - max_connection_reqs to control requests per keepalive connection
        - tweak some tests for better cpantesters matrix

1.500 Tue Aug 20 18:10:55 2024 -0200
        Features:
        - native interface: access specific parts of request
        - http/1.1 keepalive support
        - http/1.1 date header
        - defer accept, accept4

        Backward incompatibly:
        - remove adobe flash policy support

1.410 Sat Dec  5 14:32:22 2020 +0800
        Features
        - Add unix domain socket support (vividsnow++)
         # for example:
         plackup -E production -l /tmp/app.sock -s Feersum --pre-fork N app.psgi
         feersum --native --listen /tmp/app.sock --pre-fork N ./app.feersum

1.407 Sun Jun  9 16:17:30 2019 +0800
        Bugfixes
        - Fix interim test failures (snakpak++)

1.406 Fri Sep 21 08:15:32 2018 -0400
        Bugfixes
        - Fix tests by depending on HTTP::Entity::Parser 0.20+ (ltriant++)

1.405 Sun Jun 18 00:55:56 2017 +0800
        Features
        - Handle server_ready option in plack handler (haarg++)

        Bugfixes
        - Handle POST with empty content (hoytech++)

1.404 Tue Nov  1 22:52:42 2016 +0800
        Features
        - Unix socket support (hoytech++)

1.403 Wed Aug 12 19:19:57 2015 +0800
        Features
        - Add OPTIONS method support (mgreter++)

1.402 Fri Jul 31 12:02:30 2015 +0800
        Bugfixes
        - memeory leak if request method is POST (fangyousong++)

1.401 Wed Nov  6 21:53:25 2013 +0800
        Bugfixes
        - Fix tests for newer Plack::Test (@gfx++)
        - Suppress compilation warnings under clang. (@gfx++)

1.400 Wed Sep  7 20:00:00 2011 -0700
        Features
        - Add flash socket policy support (au++)
        Bugfixes
        - mortal scalar leak (thanks bfg)
        - 400s on incremental request parsing (GH#12 thanks danmcc)
        Docs
        - policy support and other tunables
        - add some missed API
        - mark the --pre-fork option as Experimental
        Tests
        - a bunch of author tests
        - reduce the amount of parallelism in tests (makes them faster)

1.202 Thu Jun 30 00:45:00 2011 -0700
        Fix double-plan test failures when Test::LeakTrace missing (au++)

1.201 Wed Jun 29 11:00:00 2011 -0700
        Fix sockaddr memory leak (thanks bfg)

1.200 Fri Apr 15 12:00:00 2011 -0700
        Fix major defect: corrupted large static files (thanks leedo)

1.101 Wed Apr 13 12:00:00 2011 -0700
        Fix 62-plack-runner.t again (thanks cpantesters)

1.100 Mon Apr 11 12:40:00 2011 -0700
        Fix major defect: truncated writes (fbb3664)
        Finish Solaris compatibility (thanks konobi)
        Fix t/11-runner.t failing when JSON::XS missing

1.002 Sat Apr  9 16:15:00 2011 -0700
        Try to fix persistent failing of 62-plack-runner.t
        Update picohttpparser from upstream
        Fix printf warnings on Lucid

1.001 Mon Jan 31 10:00:00 2011 -0800
        Address RT#65239 by making Plack a true dep. if present.
        Test::TCP is now a hard build dependency.
        Use Test::Fatal instead of Test::Exception.

1.000 Mon Nov 22 12:00:00 2010 -0800
        Socialtext now runs Feersum in production, hence 1.000
        Add write_array() to Writer handle (undoc'd Feersum extension)
        Be explicit about the EU::MM requirement (thanks au)
        Formally support PSGI 1.1 (thanks miyagawa)

0.986 Mon Oct 26 09:16:00 2010 -0700
        Fix compilation for EV 4.00 (thanks au)

0.985 Mon Oct 25 16:18:00 2010 -0700
        Require EV 4.00.
        Make two example scripts emit a constant Content-Length for ab.
        Code reworking and optimization.

0.984 Fri Oct 15 10:45:00 2010 -0700
        Fix a misspelling of SvREFCNT_dec

0.983 Thu Oct 14 17:45:00 2010 -0700
        Add a response_guard() method and psgix.output.guard

0.982 Tue Oct 12 10:55:00 2010 -0700
        Initial pre-forking support via Feersum::Runner & Plack::Runner
        Fix: resource leak induced by header-read errors
        Fix: compilation on BSD & Solaris re: SOL_TCP

0.981 Wed Oct  9 04:30:00 2010 -0700
        Support Web::Hippie (and psgix.io)
        Add missing JSON::XS test-dep.
        Fix: write() prototype was incorrect.
        Fix: writer not flushing on DESTROY.
        Fix: IO::Handle in PSGI streaming response.
        Fix: `use overload` PSGI callbacks in perl 5.8.x

0.971 Wed Oct  6 16:21:00 2010 -0700
        Fix the feersum script.

0.97  Wed Oct  6 15:00:00 2010 -0700
        Full Plack::Test::Suite compliance!
        Handle 304 responses properly.
        Don't manually steal TEMP vars.

0.961 Wed Oct  6 08:40:00 2010 -0700
        Fix building under threaded perls.
        Work around a bug (?) in 5.12.1 when declaring -DDEBUGGING.

0.96  Fri Oct  1 15:30:00 2010 -0700
        Support Tatsumaki running under Feersum.
        Content-Type is now in the CONTENT_TYPE env.

0.95  Fri Oct  1 13:45:00 2010 -0700
        Specify Plack >= 0.995 version for testing & recommending
        Experiment with close() rather than shutdown() for ending connections.
        Actually install bin/feersum as a script
        Fix coredumps/hangs due to improper refcounting.
        Fix examples, Add a chat app example.

0.94  Thu Sep 30 22:45:00 2010 -0700
        Major documentation rewrite.
        Deprecated the "delayed response" part of the Feersum API in favor of the "streamed response" API.
        Allow for tied variables in the response.
        Move the IO::Handle response reading code into XS.

0.93  Tue Sep 29 01:30:00 2010 -0700
        First CPAN release.
        Redo PSGI streaming responses (mostly for code clarity).
        Fixes for Perl 5.8.x

0.92  Tue Sep 28 22:18:01 2010 -0700
        Support "Connection:close" style streaming for 1.0 clients.
        Support IO::Handle-like responses for PSGI handlers.
        Add REMOTE_ADDR and REMOTE_PORT to env.

0.91  Sun Sep 19 15:33:39 2010 -0700
        Support running Feersum under plackup.
        Remove AnyEvent::HTTP dependency.
        Make $r->env() calls faster.

0.90  Mon Sep  6 16:35:00 2010
        Initial PSGI 1.03 support (except for IO::Handle-like responses)

0.02  Fri Apr 23 10:55:54 2010
        Renamed a good chunk of the functions & classes.
        Made psgi.input and stream-writer objects separate from the main connection class.

0.01  Fri Apr 23 10:55:54 2010
        Started project.
