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.