=== 0.99.0 / 2010-05-06 19:32 UTC Starting with this release, we'll always load Rack up front at startup. Previously we had complicated ways to avoid loading Rack until after the application was loaded to allow the application to load an alternate version of Rack. However this has proven too error-prone to be worth supporting even though Unicorn does not have strict requirements on currently released Rack versions. If an app requires a different version of Rack than what Unicorn would load by default, it is recommended they only install that version of Rack (and no others) since Unicorn does not have any strict requirements on currently released Rack versions. Rails 2.3.x users should be aware of this as those versions are not compatible with Rack 1.1.0. If it is not possible to only have one Rack version installed "globally", then they should either use Isolate or Bundler and install a private version of Unicorn along with their preferred version of Rack. Users who install in this way are recommended to execute the isolated/bundled version of Unicorn, instead of what would normally be in $PATH. Feedback/tips to mailto:mongrel-unicorn@rubyforge.org from Isolate and Bundler users would be greatly appreciated. === 0.98.0 / 2010-05-05 00:53 UTC Deployments that suspend or hibernate servers should no longer have workers killed off (and restarted) upon resuming. For Linux users of {raindrops}[http://raindrops.bogomips.org/] (v0.2.0+) configuration is easier as raindrops can now automatically detect the active listeners on the server via the new Unicorn.listener_names singleton method. For the pedantic, chunked request bodies without trailers are no longer allowed to omit the final CRLF. This shouldn't affect any real and RFC-compliant clients out there. Chunked requests with trailers have always worked and continue to work the same way. The rest are mostly small internal cleanups and documentation fixes. See the commit logs for full details. === 0.97.1 / 2010-04-19 21:00 UTC This release fixes a denial-of-service vector for derived servers exposed directly to untrusted clients. This bug does not affect most Unicorn deployments as Unicorn is only supported with trusted clients (such as nginx) on a LAN. nginx is known to reject clients that send invalid Content-Length headers, so any deployments on a trusted LAN and/or behind nginx are safe. Servers affected by this bug include (but are not limited to) Rainbows! and Zbatery. This bug does not affect Thin nor Mongrel, as neither got the request body filtering treatment that the Unicorn HTTP parser got in August 2009. The bug fixed in this release could result in a denial-of-service as it would trigger a process-wide assertion instead of raising an exception. For servers such as Rainbows!/Zbatery that serve multiple clients per worker process, this could abort all clients connected to the particular worker process that hit the assertion. === 0.97.0 / 2010-03-01 18:26 UTC A bunch of small fixes related to startup/configuration and hot reload issues with HUP: * Variables in the user-generated config.ru files no longer risk clobbering variables used in laucher scripts. * signal handlers are initialized before the pid file is dropped, so over-eager firing of init scripts won't mysteriously nuke a process. * SIGHUP will return app to original state if an updated config.ru fails to load due to {Syntax,Load}Error. * unicorn_rails should be Rails 3 compatible out-of-the-box ('unicorn' works as always, and is recommended for Rails 3) * unicorn_rails is finally "working_directory"-aware when generating default temporary paths and pid file * config.ru encoding is the application's default in 1.9, not forced to binary like many parts of Unicorn. * configurator learned to handle the "user" directive outside of after_fork hook (which will always remain supported). There are also various internal cleanups and possible speedups. === 0.96.1 / 2010-02-13 08:35 UTC This maintenance release is intended for users of Rainbows! and Zbatery servers (and anybody else using Unicorn::HttpParser). This memory leak DID NOT affect Unicorn itself: Unicorn always allocates the HttpParser once and always reuses it in every sequential request. This leak affects applications that repeatedly allocate a new HTTP parser. Thus this bug affects _all_ deployments of Rainbows! and Zbatery. These servers allocate a new parser for every client connection to serve clients concurrently. I misread the Data_Make_Struct()/Data_Wrap_Struct() documentation and ended up passing NULL as the "free" argument instead of -1, causing the memory to never be freed. From README.EXT in the MRI source which I misread: > The free argument is the function to free the pointer > allocation. If this is -1, the pointer will be just freed. > The functions mark and free will be called from garbage > collector. === 0.96.0 / 2010-01-08 05:18 UTC This release includes small changes for things allowed by Rack 1.1. It is also now easier to detect if daemonized process fails to start. Manpages received some minor updates as well. Rack 1.1 allowed us to make the following environment changes: * "rack.logger" is now set to the "logger" specified in the Unicorn config file. This defaults to a Logger instance pointing to $stderr. * "rack.version" is now at [1,1]. Unicorn remains compatible with previous Rack versions if your app depends on it. While only specified since Rack 1.1, Unicorn has always exposed "rack.input" in binary mode (and has ridiculous integration tests that go outside of Ruby to prove it!). === 0.95.3 / 2009-12-21 21:51 UTC The HTTP parser now allows (but does not parse) the userinfo component in the very rare requests that send absoluteURIs. Thanks to Scott Chacon for reporting and submitting a test case for this fix. There are also minor documentation updates and tiny cleanups. === 0.95.2 / 2009-12-07 09:52 UTC Small fixes to our HTTP parser to allows semicolons in PATH_INFO as allowed by RFC 2396, section 3.3. This is low impact for existing apps as semicolons are rarely seen in URIs. Our HTTP parser runs properly under Rubinius 0.13.0 and 1.0.0-rc1 again (though not yet the rest of the server since we rely heavily on signals). Another round of small documentation tweaks and minor cleanups. === 0.95.1 / 2009-11-21 21:13 UTC Configuration files paths given on the command-line are no longer expanded. This should make configuration reloads possible when a non-absolute path is specified for --config-file and Unicorn was deployed to a symlink directories (as with Capistrano). Since deployments have always been strongly encouraged to use absolute paths in the config file, this change does not affect them. This is our first gem release using gemcutter. Eric Wong (3): SIGNALS: HUP + preload_app cannot reload app code Do not expand paths given on the shell GNUmakefile: prep release process for gemcutter === 0.95.0 / 2009-11-15 22:21 UTC Mostly internal cleanups and documentation updates. Irrelevant stacktraces from client disconnects/errors while reading "rack.input" are now cleared to avoid unnecessary noise. If user switching in workers is used, ownership of logs is now preserved when reopening worker logs (send USR1 only to the the master in this case). The timeout config no longer affects long after_fork hooks or application startups. New features include the addition of the :umask option for the "listen" config directive and error reporting for non-portable socket options. No ponies have ever been harmed in our development. Eric Wong (28): unicorn.1: document RACK_ENV changes in 0.94.0 HACKING: update with "gmake" in examples don't nuke children for long after_fork and app loads local.mk.sample: steal some updates from Rainbows! Load Unicorn constants when building app tee_input: fix RDoc argument definition for tee Add FAQ FAQ: fix links to Configurator docs tee_input: better premature disconnect handling tee_input: don't shadow struct members raise Unicorn::ClientShutdown if client aborts in TeeInput tee_input: fix comment from an intermediate commit FAQ: additional notes on getting HTTPS redirects right configurator: update RDoc and comments in examples bump version to 0.95.0pre configurator: listen :umask parameter for UNIX sockets preserve user/group ownership when reopening logs old_rails/static: avoid freezing strings old_rails: autoload Static const: no need to freeze HTTP_EXPECT test_server: ensure stderr is written to before reading tee_input: expand client error handling replace "rescue => e" with "rescue Object => e" socket_helper: do not hide errors when setting socket options socket_helper: RDoc for constants ClientShutdown: RDoc Rakefile: add raa_update task tee_input: client_error always raises === 0.94.0 / 2009-11-05 09:52 UTC The HTTP parser is fix for oddly-aligned reads of trailers (this technically affects headers, too, but is highly unlikely due to our non-support of slow clients). This allows our HTTP parser to better support very slow clients when used by other servers (like Rainbows!). Fortunately this bug does not appear to lead to any invalid memory accesses (and potential arbitrary code execution). FreeBSD (and possibly other *BSDs) support is improved and and all the test cases pass under FreeBSD 7.2. Various flavors of GNU/Linux remains our primary platform for development and production. New features added include the "working_directory" directive in the configurator . Even without specifying a "working_directory", symlink-aware detection of the current path no longer depends on /bin/sh so it should work out-of-the-box on FreeBSD and Solaris and not just systems where /bin/sh is dash, ksh93 or bash. User-switching support is finally supported but only intended for use in the after_fork hook of worker processes. Putting it in the after_fork hook allows allows users to set things like CPU affinity[1] on a per-worker basis before dropping privileges. The master process retains all privileges it started with. The ENV["RACK_ENV"] (process-wide) environment variable is now both read and set for `unicorn' in the same way RAILS_ENV is used by `unicorn_rails'. This allows the Merb launcher to read ENV["RACK_ENV"] in config.ru. Other web servers already set this and there may be applications or libraries that already rely on this de facto standard. Eric Wong (26): cleanup: avoid redundant error checks for fstat test_helper: connect(2) may fail with EINVAL GNUmakefile: fix non-portable tar(1) usage tests: provide a pure Ruby setsid(8) equivalent more portable symlink awareness for START_CTX[:cwd] test_signals: avoid portability issues with fchmod(2) cleanup error handling and make it less noisy Do not override Dir.chdir in config files configurator: add "working_directory" directive configurator: working_directory is expanded configurator: set ENV["PWD"] with working_directory, too configurator: working_directory affects pid, std{err,out}_paths configurator: update documentation for working_directory TODO: remove working_directory bit, done Util.reopen_logs: remove needless Range worker: user/group switching for after_fork hooks Fix autoload of Etc in Worker for Ruby 1.9 bin/unicorn: allow RACK_ENV to be passed from parent tests for RACK_ENV preservation http: allow headers/trailers to be written byte-wise http: extra test for bytewise chunked bodies tee_input: do not clobber trailer buffer on partial uploads test_exec: ensure master is killed after test Util::tmpio returns a TmpIO that responds to #size TODO: remove user-switching bit, done unicorn 0.94.0 Wayne Larsen (1): bin/unicorn: set ENV["RACK_ENV"] on startup [1] - Unicorn does not support CPU affinity directly, but it is possible to load code that allows it inside after_fork hooks, or even just call sched_tool(8). === 0.93.5 / 2009-10-29 21:41 UTC This release fixes a regression introduced in 0.93.3 where timed-out worker processes run a chance of not being killed off at all if they're hung. While it's not ever advisable to have requests take a long time, we realize it's easy to fix everything :) Eric Wong (3): TODO: remove --kill fix reliability of timeout kills TODO: update for next version (possibly 1.0-pre) === 0.93.4 / 2009-10-27 07:57 UTC This release mainly works around BSD stdio compatibility issues that affect at least FreeBSD and OS X. While this issues was documented and fixed in [ruby-core:26300][1], no production release of MRI 1.8 has it, and users typically upgrade MRI more slowly than gems. This issue does NOT affect 1.9 users. Thanks to Vadim Spivak for reporting and testing this issue and Andrey Stikheev for the fix. Additionally there are small documentation bits, one error handling improvement, and one minor change that should improve reliability of signal delivery. Andrey Stikheev (1): workaround FreeBSD/OSX IO bug for large uploads Eric Wong (7): DESIGN: address concerns about on-demand and thundering herd README: alter reply conventions for the mailing list configurator: stop testing for non-portable listens KNOWN_ISSUES: document Rack gem issue w/Rails 2.3.2 stop continually resends signals during shutdowns add news bodies to site NEWS.atom.xml configurator: fix broken example in RDoc Suraj N. Kurapati (1): show configuration file path in errors instead of '(eval)' [1] http://redmine.ruby-lang.org/issues/show/2267 === 0.93.3 / 2009-10-09 22:50 UTC This release fixes compatibility with OpenBSD (and possibly other Unices with stricter fchmod(2) implementations) thanks to Jeremy Evans. Additionally there are small documentation changes all around. Eric Wong (12): doc: expand on the SELF_PIPE description fchmod heartbeat flips between 0/1 for compatibility examples/init.sh: remove "set -u" configurator: update with nginx fail_timeout=0 example PHILOSOPHY: clarify experience other deployments PHILOSOPHY: plug the Rainbows! spin-off project README: remove unnecessary and extraneous dash DESIGN: clarification and possibly improve HTML validity README: remove the "non-existent" part README: emphasize the "fast clients"-only part drop the whitespace cleaner for Ragel->C unicorn 0.93.3 === 0.93.2 / 2009-10-07 08:45 UTC Avoid truncated POST bodies from with URL-encoded forms in Rails by switching TeeInput to use read-in-full semantics (only) when a Content-Length: header exists. Chunked request bodies continue to exhibit readpartial semantics to support simultaneous bidirectional chunking. The lack of return value checking in Rails to protect against a short ios.read(length) is entirely reasonable even if not pedantically correct. Most ios.read(length) implementations return the full amount requested except right before EOF. Also there are some minor documentation improvements. Eric Wong (8): Fix NEWS generation on single-paragraph tag messages Include GPLv2 in docs doc: make it clear contributors retain copyrights TODO: removed Rainbows! (see rainbows.rubyforge.org) Document the START_CTX hash contents more-compatible TeeInput#read for POSTs with Content-Length tests for read-in-full vs readpartial semantics unicorn 0.93.2 === 0.93.1 / 2009-10-03 01:17 UTC Fix permissions for release tarballs/gems, no other changes. Thanks to Jay Reitz for reporting this. === 0.93.0 / 2009-10-02 21:04 UTC The one minor bugfix is only for Rails 2.3.x+ users who set the RAILS_RELATIVE_URL_ROOT environment variable in a config file. Users of the "--path" switch or those who set the environment variable in the shell were unaffected by this bug. Note that we still don't have relative URL root support for Rails < 2.3, and are unlikely to bother with it unless there is visible demand for it. New features includes support for :tries and :delay when specifying a "listen" in an after_fork hook. This was inspired by Chris Wanstrath's example of binding per-worker listen sockets in a loop while migrating (or upgrading) Unicorn. Setting a negative value for :tries means we'll retry the listen indefinitely until the socket becomes available. So you can do something like this in an after_fork hook: after_fork do |server, worker| addr = "127.0.0.1:#{9293 + worker.nr}" server.listen(addr, :tries => -1, :delay => 5) end There's also the usual round of added documentation, packaging fixes, code cleanups, small fixes and minor performance improvements that are viewable in the "git log" output. Eric Wong (55): build: hardcode the canonical git URL build: manifest dropped manpages build: smaller ChangeLog doc/LATEST: remove trailing newline http: don't force -fPIC if it can't be used .gitignore on *.rbc files Rubinius generates README/gemspec: a better description, hopefully GNUmakefile: add missing .manifest dep on test installs Add HACKING document configurator: fix user switch example in RDoc local.mk.sample: time and perms enforcement unicorn_rails: show "RAILS_ENV" in help message gemspec: compatibility with older Rubygems Split out KNOWN_ISSUES document KNOWN_ISSUES: add notes about the "isolate" gem gemspec: fix test_files regexp match gemspec: remove tests that fork from test_files test_signals: ensure we can parse pids in response GNUmakefile: cleanup test/manifest generation util: remove APPEND_FLAGS constant http_request: simplify and remove handle_body method http_response: simplify and remove const dependencies local.mk.sample: fix .js times TUNING: notes about benchmarking a high :backlog HttpServer#listen accepts :tries and :delay parameters "make install" avoids installing multiple .so objects Use Configurator#expand_addr in HttpServer#listen configurator: move initialization stuff to #initialize Remove "Z" constant for binary strings cgi_wrapper: don't warn about stdoutput usage cgi_wrapper: simplify status handling in response cgi_wrapper: use Array#concat instead of += server: correctly unset reexec_pid on child death configurator: update and modernize examples configurator: add colons in front of listen() options configurator: remove DEFAULT_LOGGER constant gemspec: clarify commented-out licenses section Add makefile targets for non-release installs cleanup: use question mark op for 1-byte comparisons RDoc for Unicorn::HttpServer::Worker small cleanup to pid file handling + documentation rails: RAILS_RELATIVE_URL_ROOT may be set in Unicorn config unicorn_rails: undeprecate --path switch manpages: document environment variables README: remove reference to different versions Avoid a small window when a pid file can be empty configurator: update some migration examples configurator: listen :delay must be Numeric test: don't rely on .manifest for test install SIGNALS: state that we stole semantics from nginx const: DEFAULT_PORT as a string doesn't make sense test_helper: unused_port rejects 8080 unconditionally GNUmakefile: SINCE variable may be unset tests: GIT-VERSION-GEN is a test install dependency unicorn 0.93.0 === 0.92.0 / 2009-09-18 21:40 UTC Small fixes and documentation are the focus of this release. James Golick reported and helped me track down a bug that caused SIGHUP to drop the default listener (0.0.0.0:8080) if and only if listeners were completely unspecified in both the command-line and Unicorn config file. The Unicorn config file remains the recommended option for specifying listeners as it allows fine-tuning of the :backlog, :rcvbuf, :sndbuf, :tcp_nopush, and :tcp_nodelay options. There are some documentation (and resulting website) improvements. setup.rb users will notice the new section 1 manpages for `unicorn` and `unicorn_rails`, Rubygems users will have to install manpages manually or use the website. The HTTP parser got a 3rd-party code review which resulted in some cleanups and one insignificant bugfix as a result. Additionally, the HTTP parser compiles, runs and passes unit tests under Rubinius. The pure-Ruby parts still do not work yet and we currently lack the resources/interest to pursue this further but help will be gladly accepted. The website now has an Atom feed for new release announcements. Those unfamiliar with Atom or HTTP may finger unicorn@bogomips.org for the latest announcements. Eric Wong (53): README: update with current version http: cleanup and avoid potential signedness warning http: clarify the setting of the actual header in the hash http: switch to macros for bitflag handling http: refactor keepalive tracking to functions http: use explicit elses for readability http: remove needless goto http: extra assertion when advancing p manually http: verbose assertions http: NIL_P(var) instead of var == Qnil http: rb_gc_mark already ignores immediates http: ignore Host: continuation lines with absolute URIs doc/SIGNALS: fix the no-longer-true bit about socket options "encoding: binary" comments for all sources (1.9) http_response: don't "rescue nil" for body.close CONTRIBUTORS: fix capitalization for why http: support Rubies without the OBJ_FROZEN macro http: define OFFT2NUM macro on Rubies without it http: no-op rb_str_modify() for Rubies without it http: compile with -fPIC http: use rb_str_{update,flush} if available http: create a new string buffer on empty values Update documentation for Rubinius support status http: cleanup assertion for memoized header strings http: add #endif comment labels where appropriate Add .mailmap file for "git shortlog" and other tools Update Manifest with mailmap Fix comment about speculative accept() SIGNALS: use "Unicorn" when referring to the web server Add new Documentation section for manpages test_exec: add extra tests for HUP and preload_app socket_helper: (FreeBSD) don't freeze the accept filter constant Avoid freezing objects that don't benefit from it SIGHUP no longer drops lone, default listener doc: generate ChangeLog and NEWS file for RDoc Remove Echoe and roll our own packaging/release... unicorn_rails: close parentheses in help message launchers: deprecate ambiguous -P/--p* switches man1/unicorn: avoid unnecessary emphasis Add unicorn_rails(1) manpage Documentation: don't force --rsyncable flag with gzip(1) Simplify and standardize manpages build/install GNUmakefile: package .tgz includes all generated files doc: begin integration of HTML manpages into RDoc Update TODO html: add Atom feeds doc: latest news is available through finger NEWS.atom: file timestamp matches latest entry pandoc needs the standalone switch for manpages man1/unicorn: split out RACK ENVIRONMENT section man1/unicorn_rails: fix unescaped underscore NEWS.atom.xml only lists the first 10 entries unicorn 0.92.0 === 0.91.0 / 2009-09-04 19:04 UTC HTTP/0.9 support, multiline header support, small fixes 18 years too late, Unicorn finally gets HTTP/0.9 support as HTTP was implemented in 1991. Eric Wong (16): Documentation updates examples/echo: "Expect:" value is case-insensitive http: make strings independent before modification http: support for multi-line HTTP headers tee_input: fix rdoc unicorn_http: "fix" const warning http: extension-methods allow any tokens http: support for simple HTTP/0.9 GET requests test_http_parser_ng: fix failing HTTP/0.9 test case launcher: defer daemonized redirects until config is read test to ensure stderr goes *somewhere* when daemonized http: SERVER_PROTOCOL matches HTTP_VERSION http: add HttpParser#headers? method Support HTTP/0.9 entity-body-only responses Redirect files in binary mode unicorn 0.91.0 === 0.90.0 / 2009-08-17 00:24 UTC switch chunking+trailer handling to Ragel, v0.8.4 fixes Moved chunked decoding and trailer parsing over to C/Ragel. Minor bug fixes, internal code cleanups, and API changes. Eric Wong (55): README: update version numbers for website Update Rails tests to run on Rails 2.3.3.1 README: latest stable version is 0.8.4 unicorn_http: small cleanups and size reduction Remove Ragel-generated file from version control unicorn_http: remove typedef from http_parser unicorn_http: update copyright unicorn_http: change "global_" prefix to "g_" unicorn_http: add helpful macros extconf: SIZEOF_OFF_T should be a ruby.h macro Refactoring unicorn_http C/Ragel code http: find_common_field_value => find_common_field http: split uncommon_field into a separate function http: remove some redundant functions http: "hp" denotes http_parser structs for consistency http: small cleanup in "https" detection http: minor cleanup of http_field handling http: split out server params handling http: move global initialization code http: cleanup setting for common values => globals http: remove noise functions http: move non-Ruby-specific macros c_util.h http: prepare http_parser struct for body processing http: generic C string vs VALUEs comparison function http: process Content-Length and Transfer-Encoding http: preliminary chunk decoding test_upload: extra CRLF is needed Switch to Ragel/C-based chunk/trailer parser http: unit tests for overflow and bad lengths http: add test for invalid trailer http: join repeated headers with a comma test_util: explicitly close tempfiles for GC-safety test_exec: wait for worker readiness Documentation updates test_signals: unlink log files of KILL-ed process http: rename read_body to filter_body http: add CONST_MEM_EQ macro http: add "HttpParser#keepalive?" method http: freeze fields when creating them, always README: everybody loves Ruby DSLs http_request: reinstate empty StringIO optimization tee_input: make interface more usable outside of Unicorn Drop the micro benchmarks http: fix warning when sizeof(off_t) == sizeof(long long) GNUmakefile: Fix "install" target Fix documentation for Util.reopen_logs http_response: pass through unknown status codes const: remove unused constants update TODO http: support for "Connection: keep-alive" TODO: remove keep-alive/pipelining Make launchers __END__-aware Remove explicit requires for Rack things app/inetd: explicitly close pipe descriptors on CatBody#close unicorn 0.90.0 === 0.8.4 / 2009-08-06 22:48 UTC pass through unknown HTTP status codes This release allows graceful degradation in case a user is using a status code not defined by Rack::Utils::HTTP_STATUS_CODES. A patch has been submitted[1] upstream to Rack but this issue may still affect users of yet-to-be-standardized status codes. Eric Wong (2): http_response: pass through unknown status codes unicorn 0.8.4 [1] - http://rack.lighthouseapp.com/projects/22435-rack/tickets/70 === 0.9.2 / 2009-07-20 01:29 UTC Ruby 1.9.2 preview1 compatibility This release mainly fixes compatibility issues the Ruby 1.9.2 preview1 release (and one existing 1.9.x issue). Note that Rails 2.3.2.1 does NOT appear to work with Ruby 1.9.2 preview1, but that is outside the scope of this project. The 0.9.x series (including this release) is only recommended for development/experimental use. This series is NOT recommended for production use, use 0.8.x instead. Eric Wong (10): README: add Gmane newsgroup info README: update about development/stable versions Rename unicorn/http11 => unicorn_http move all #gets logic to tee_input out of chunked_reader http_request: don't support apps that close env["rack.input"] HttpRequest: no need for a temporary variable Remove core Tempfile dependency (1.9.2-preview1 compat) fix tests to run correctly under 1.9.2preview1 app/exec_cgi: fix 1.9 compatibility unicorn 0.9.2 === 0.8.3 / 2009-07-20 01:26 UTC Ruby 1.9.2 preview1 compatibility This release fixes compatibility issues the Ruby 1.9.2 preview1 release (and one existing 1.9.x issue). Note that Rails 2.3.2.1 does NOT appear to work with Ruby 1.9.2 preview1, but that is outside the scope of this project. Eric Wong (4): Remove core Tempfile dependency (1.9.2-preview1 compat) fix tests to run correctly under 1.9.2preview1 app/exec_cgi: fix 1.9 compatibility unicorn 0.8.3 === 0.8.2 / 2009-07-09 08:59 UTC socket handling bugfixes and usability tweaks Socket handling bugfixes and socket-related usability and performance tweaks. We no longer trust FD_CLOEXEC to be inherited across accept(); thanks to Paul Sponagl for diagnosing this issue on OSX. There are also minor tweaks backported from 0.9.0 to make non-graceful restarts/upgrades go more smoothly. Eric Wong (6): Unbind listeners as before stopping workers Retry listen() on EADDRINUSE 5 times every 500ms Re-add support for non-portable socket options Minor cleanups to core always set FD_CLOEXEC on sockets post-accept() unicorn 0.8.2 === 0.9.1 / 2009-07-09 08:49 UTC FD_CLOEXEC portability fix (v0.8.2 port) Minor cleanups, set FD_CLOEXEC on accepted listen sockets instead of relying on the flag to be inherited across accept. The 0.9.x series (including this release) is NOT recommended for production use, try 0.8.x instead. Eric Wong (10): Avoid temporary array creation Favor Struct members to instance variables Minor cleanups to core Unbind listeners as before stopping workers Retry listen() on EADDRINUSE 5 times ever 500ms Re-add support for non-portable socket options Minor cleanups to core (cherry picked from commit ec70433f84664af0dff1336845ddd51f50a714a3) always set FD_CLOEXEC on sockets post-accept() unicorn 0.8.2 unicorn 0.9.1 (merge 0.8.2) === 0.9.0 / 2009-07-01 22:24 UTC bodies: "Transfer-Encoding: chunked", rewindable streaming We now have support for "Transfer-Encoding: chunked" bodies in requests. Not only that, Rack applications reading input bodies get that data streamed off to the client socket on an as-needed basis. This allows the application to do things like upload progress notification and even tunneling of arbitrary stream protocols via bidirectional chunked encoding. See Unicorn::App::Inetd and examples/git.ru (including the comments) for an example of tunneling the git:// protocol over HTTP. This release also gives applications the ability to respond positively to "Expect: 100-continue" headers before being rerun without closing the socket connection. See Unicorn::App::Inetd for an example of how this is used. This release is NOT recommended for production use. Eric Wong (43): http_request: no need to reset the request http_request: StringIO is binary for empty bodies (1.9) http_request: fix typo for 1.9 Transfer-Encoding: chunked streaming input support Unicorn::App::Inetd: reinventing Unix, poorly :) README: update with mailing list info local.mk.sample: publish_doc gzips all html, js, css Put copyright text in new files, include GPL2 text examples/cat-chunk-proxy: link to proposed curl(1) patch Update TODO Avoid duplicating the "Z" constant Optimize body-less GET/HEAD requests (again) tee_input: Don't expose the @rd object as a return value exec_cgi: small cleanups README: another note about older Sinatra tee_input: avoid defining a @rd.size method Make TeeInput easier to use test_upload: add tests for chunked encoding GNUmakefile: more stringent error checking in tests test_upload: fix ECONNRESET with 1.9 GNUmakefile: allow TRACER= to be specified for tests test_rails: workaround long-standing 1.9 bug tee_input: avoid rereading fresh data "Fix" tests that break with stream_input=false inetd: fix broken constant references configurator: provide stream_input (true|false) option chunked_reader: simpler interface http_request: force BUFFER to be Encoding::BINARY ACK clients on "Expect: 100-continue" header Only send "100 Continue" when no body has been sent http_request: tighter Transfer-Encoding: "chunked" check Add trailer_parser for parsing trailers chunked_reader: Add test for chunk parse failure TeeInput: use only one IO for tempfile trailer_parser: set keys with "HTTP_" prefix TrailerParser integration into ChunkedReader Unbind listeners as before stopping workers Retry listen() on EADDRINUSE 5 times ever 500ms Re-add support for non-portable socket options Move "Expect: 100-continue" handling to the app tee_input: avoid ignoring initial body blob Force streaming input onto apps by default unicorn 0.9.0 === 0.8.1 / 2009-05-28 21:45 UTC safer timeout handling, more consistent reload behavior This release features safer, more descriptive timeout handling, more consistent reload behavior, and is a miniscule amount faster on "Hello World" benchmarks Eric Wong (7): doc: cleanup summary/description Fix potential race condition in timeout handling SIGHUP reloads app even if preload_app is true Make our HttpRequest object a global constant Avoid instance variables lookups in a critical path Consistent logger assignment for multiple objects unicorn 0.8.1 === 0.8.0 / 2009-05-26 22:59 UTC enforce Rack dependency, minor performance improvements and fixes The RubyGem now has a hard dependency on Rack. Minor performance improvements and code cleanups. If RubyGems are in use, the Gem index is refreshed when SIGHUP is issued. Eric Wong (66): test_request: enable with Ruby 1.9 now Rack 1.0.0 is out Small cleanup test_upload: still uncomfortable with 1.9 IO encoding... Add example init script app/exec_cgi: GC prevention Add TUNING document Make speculative accept() faster for the common case app/old_rails: correctly log errors in output http_request: avoid StringIO.new for GET/HEAD requests http_response: luserspace buffering is barely faster benchmark/*: updates for newer versions of Unicorn http_request: switch to readpartial over sysread No point in unsetting the O_NONBLOCK flag Merge commit 'origin/benchmark' Safer timeout handling and test case Ignore unhandled master signals in the workers TUNING: add a note about somaxconn with UNIX sockets Remove redundant socket closing/checking Instant shutdown signals really mean instant shutdown test_signals: ready workers before connecting Speed up the worker accept loop Fix a warning about @pid being uninitialized Inline and remove the HttpRequest#reset method Preserve 1.9 IO encodings in reopen_logs configurator: fix rdoc formatting http_request: use Rack::InputWrapper-compatible methods app/exec_cgi: use explicit buffers for read/sysread Enforce minimum timeout at 3 seconds Avoid killing sleeping workers Remove trickletest HttpRequest::DEF_PARAMS => HttpRequest::DEFAULTS exec_cgi: don't assume the body#each consumer is a socket Reopen master logs on SIGHUP, too Require Rack for HTTP Status codes http_response: allow string status codes test_response: correct OFS test privatize constants only used by old_rails/static Disable formatting for command-line switches GNUmakefile: glob all files in bin/* test_request: enable with Ruby 1.9 now Rack 1.0.0 is out test_upload: still uncomfortable with 1.9 IO encoding... Add example init script app/exec_cgi: GC prevention Add TUNING document app/old_rails: correctly log errors in output Safer timeout handling and test case Ignore unhandled master signals in the workers TUNING: add a note about somaxconn with UNIX sockets Fix a warning about @pid being uninitialized Preserve 1.9 IO encodings in reopen_logs configurator: fix rdoc formatting Enforce minimum timeout at 3 seconds http_response: allow string status codes test_response: correct OFS test Disable formatting for command-line switches GNUmakefile: glob all files in bin/* Merge branch '0.7.x-stable' Define HttpRequest#reset if missing Merge branch 'benchmark' unicorn 0.7.1 Merge commit 'v0.7.1' Refresh Gem list when building the app Only refresh the gem list when building the app Switch to autoload to defer requires remove trickletest from Manifest unicorn 0.8.0 === 0.7.1 / 2009-05-22 09:06 UTC minor fixes, cleanups and documentation improvements Eric Wong (18): test_request: enable with Ruby 1.9 now Rack 1.0.0 is out test_upload: still uncomfortable with 1.9 IO encoding... Add example init script app/exec_cgi: GC prevention Add TUNING document app/old_rails: correctly log errors in output Safer timeout handling and test case Ignore unhandled master signals in the workers TUNING: add a note about somaxconn with UNIX sockets Fix a warning about @pid being uninitialized Preserve 1.9 IO encodings in reopen_logs configurator: fix rdoc formatting Enforce minimum timeout at 3 seconds http_response: allow string status codes test_response: correct OFS test Disable formatting for command-line switches GNUmakefile: glob all files in bin/* unicorn 0.7.1 === 0.7.0 / 2009-04-25 18:59 UTC rack.version is 1.0 Rack 1.0.0 compatibility, applications are now passed env["rack.version"] == [1, 0] Eric Wong (5): doc: formatting changes for SIGNALS doc configurator: "listen" directive more nginx-like Fix log rotation being delayed in workers when idle Rack 1.0.0 compatibility unicorn 0.7.0 === 0.6.0 / 2009-04-24 21:47 UTC cleanups + optimizations, signals to {in,de}crement processes * Mostly OCD-induced yak-shaving changes * SIGTTIN and SIGTTOU are now used to control incrementing and decrementing of worker processes without needing to change the config file and SIGHUP. Eric Wong (46): test_upload: ensure StringIO objects are binary http11: cleanup #includes and whitespace GNUmakefile: Fix ragel dependencies GNUmakefile: kill trailing whitespace after ragel Move absolute URI parsing into HTTP parser http11: remove unused variables/elements http_request: freeze modifiable elements HttpParser: set QUERY_STRING for Rack-compliance GNUmakefile: mark test_signals as a slow test const: remove unused QUERY_STRING constant http11: formatting cleanups http11: remove callbacks from structure replace DATA_GET macro with a function http11: minor cleanups in return types http11: make parser obey HTTP_HOST with empty port http11: cleanup some CPP macros http11: rfc2616 handling of absolute URIs http_response: small speedup by eliminating loop Stop extending core classes rename socket.rb => socket_helper.rb Remove @start_ctx instance variable http11: support underscores in URI hostnames test: empty port test for absolute URIs Cleanup some unnecessary requires Cleanup GNUmakefile and fix dependencies Fix data corruption with small uploads via browsers Get rid of UNICORN_TMP_BASE constant GNUmakefile: mark test_upload as a slow test unicorn_rails: avoid nesting lambdas test_exec: cleanup stale socket on exit Merge commit 'v0.5.4' http_request: micro optimizations IO_PURGATORY should be a global constant Make LISTENERS and WORKERS global constants, too test_socket_helper: disable GC for this test http_response: just barely faster http_response: minor performance gains make SELF_PIPE is a global constant Describe the global constants we use. Fixup reference to a dead variable Avoid getppid() if serving heavy traffic minor cleanups and save a few variables Allow std{err,out}_path to be changed via HUP SIGTT{IN,OU} {in,de}crements worker_processes cleanup: avoid duped self-pipe init/replacement logic unicorn 0.6.0 === 0.5.4 / 2009-04-24 01:41 UTC fix data corruption with some small uploads (not curl) Eric Wong (2): Fix data corruption with small uploads via browsers unicorn 0.5.4 === 0.5.3 / 2009-04-17 05:32 UTC fix 100% CPU usage when idle, small cleanups fix 100% CPU usage when idle Eric Wong (7): update Manifest (add test_signals.rb) Fix forgotten Rails tests Fix my local.mk file to always run Rails tests fix 100% CPU usage when idle remove DATE constant Small garbage reduction in HttpResponse unicorn 0.5.3 === 0.5.2 / 2009-04-16 23:32 UTC force Status: header for compat, small cleanups * Ensure responses always have the "Status:" header. This is needed for compatibility with some broken clients. * Other small and minor cleanups Eric Wong (10): Explicitly trap SIGINT/SIGTERM again s/rotating/reopening/g in log messages before_commit and before_exec can never be nil/false worker_loop cleanups, var golf, and yak-shaving http11: default server port is 443 for https ensure responses always have the "Status:" header test: fix dependency issue with "make test-unit" GNUmakefile: small dependency cleanups unicorn/const: kill trailing whitespace unicorn 0.5.2 === 0.5.1 / 2009-04-13 21:24 UTC exit correctly on INT/TERM, QUIT is still recommended, however We now exit correctly on INT/TERM signals, QUIT is still recommended as it does graceful shutdowns. Eric Wong (2): Fix SIGINT/SIGTERM handling (broken in 0.5.0) unicorn 0.5.1 === 0.5.0 / 2009-04-13 19:08 UTC {after,before}_fork API change, small tweaks/fixes * There is an API change in the {after,before}_fork hooks so now the entire Worker struct is exposed to the user. This allows Unicorn to unofficially support user/group privilege changing. * The "X-Forwarded-Proto:" header can be set by proxies to ensure rack.url_scheme is "https" for SSL-enabled sites. * Small cleanups and tweaks throughout, see shortlog (below) or changelog for details. Eric Wong (32): test_helper: redirect_io uses append and sync configurator: allow hooks to be passed callable objects Add a test for signal recovery Documentation updates Enforce umask 0000 with UNIX domain sockets local.mk: touch files after set-file-times Add test for :preload_app config option GNUmakefile: remove unnecessary asterisks in output GNUmakefile: allow "make V=1 ..." for verbosity test_configurator: rename test name that never ran cleanup some log messages test_request: tests esoteric/rare REQUEST_URIs http11: Remove qsort/bsearch code paths http11: handle "X-Forwarded-Proto: https" close listeners when removing them from our array config: handle listener unbind/replace in config file README: doc updates Restore unlinked UNIX sockets on SIGHUP listen backlog, sndbuf, rcvbuf are always changeable Remove _all_ non-POSIX socket options http11: cleanup+safer rack.url_scheme handling test_exec: fix potential races in fd leak test test_http_parser: fix broken URL in comment Save one fcntl() syscall on every request Remove unnecessary sync assignment Don't bother restoring ENV or umask across reexec old_rails: try harder to ensure valid responses small cleanups in signal handling and worker init Remove unnecessary local variables in process_client Expose worker to {before,after}_fork hooks Configurator: add example for user/group switching unicorn 0.5.0 === 0.4.2 / 2009-04-02 19:14 UTC fix Rails ARStore, FD leak prevention, descriptive proctitles Eric Wong (16): Manifest: updates Merge unicorn test_exec: add test case for per-worker listeners Remove set_cloexec wrapper and require FD_CLOEXEC All IOs created in workers have FD_CLOEXEC set FD_CLOEXEC all non-listen descriptors before exec Close std{err,out} redirection targets test_upload: fix a race condition in unlink test More descriptive process titles unicorn_rails: cleanup redundant bits test/rails: v2.1.2 + ActiveRecordStore all around Use File.basename instead of a regexp Add log directories to tests unicorn: remove unnecessary lambda generation GNUmakefile: "install" preserves unicorn_rails unicorn 0.4.2 === 0.4.1 / 2009-04-01 10:52 UTC Rails support, per-listener backlog and {snd,rcv}buf Eric Wong (50): All new benchmarks, old ones removed benchmark: header values must be strings Merge commit 'origin/benchmark' into release HttpResponse: speed up non-multivalue headers Streamline rack environment generation Don't bother unlinking UNIX sockets unicorn_rails: support non-Rack versions of Rails HttpRequest: small improvement for GET requests simplify the HttpParser interface Socket: add {snd,rcv}buf opts to bind_listen Merge commit 'v0.2.3' Don't allow failed log rotation to to break app Deferred log rotation in workers style: symbols instead of strings for signal names No need to disable luserspace buffering on client socket test_server: quieter tests Remove needless line break Always try to send a valid HTTP response back test_response: ensure closed socket after write test_response: ensure response body is closed TODO: update roadmap to 1.0.0 configurator: per-listener backlog, {rcv,snd}buf config configurator: favor "listen" directive over "listeners" http11: use :http_body instead of "HTTP_BODY" Avoid having two pid files pointing to the same pid test_exec: fix race conditions test_exec: fix response bodies Fix default listener setup test_exec: fix another race condition bin/*: parse CLI switches in config.ru sooner app/old_rails/static: define missing constant unicorn_rails: give more info when aborting GNUmakefile: add test-exec and test-unit targets cgi_wrapper: ensure "Status:" header is not set Better canonicalization of listener paths + tests configurator: remove unnecessary SocketHelper include unicorn_rails: minor cleanup for dead variable Use {read,write}_nonblock on the pipe unicorn_rails: cleanup path mapping usage Rails stack tests for unicorn_rails test: factor out exec helpers into common code for Rails tests cgi_wrapper: fix cookies and other headers GNUmakefile: prefix errors with $(extra) variable cgi_wrapper: HTTP status code cleanups Add more tests for Rails test_rails: 4x speedup Manifest update Documentation updates, prep for 0.4.1 release Add local.mk.sample file that I use unicorn 0.4.1 === 0.2.3 / 2009-03-25 23:31 UTC Unlink Tempfiles after use (they were closed, just not unlinked) Eric Wong (3): Don't bother unlinking UNIX sockets Ensure Tempfiles are unlinked after every request unicorn 0.2.3 === 0.2.2 / 2009-03-22 23:45 UTC small bug fixes, fix Rack multi-value headers (Set-Cookie:) Eric Wong (19): Fix link to Rubyforge releases page start libifying common launcher code unicorn_rails: fix standard pid path setup Move listen path and address expansion to Configurator Trap WINCH to QUIT children without respawning Remove Mongrel stuff from CHANGELOG HttpResponse: close body if it can close Add Unicorn::App::ExecCgi Process management cleanups documentation/disclaimer updates unicorn_rails: remove unnecessary Rack-loading logic unicorn/http11: remove GATEWAY_INTERFACE http11: don't set headers Rack doesn't like HttpRequest test so our requests pass Rack::Lint HttpRequest: correctly reference logger Rotate master logs before workers. Simplify code for sleeping/waking up the master Handle Rack multivalue headers correctly unicorn 0.2.2 === 0.2.1 / 2009-03-19 03:20 UTC Fix broken Manifest that cause unicorn_rails to not be bundled Eric Wong (1): unicorn v0.2.1, fix the Manifest === 0.2.0 / 2009-03-19 03:16 UTC unicorn_rails launcher script. Eric Wong (8): Start _Known Issues_ section in README Allow binding to UNIX sockets relative to "~" tests: do not trust (our correct use of) 1.9 encodings gracefully die if working dir is invalid at fork Add signal queueing for test reliability Add unicorn_rails script for Rails 2.3.2 Documentation updates, prepare for 0.2.0 unicorn 0.2.0 === 0.1.0 / 2009-03-11 01:50 UTC Unicorn - UNIX-only fork of Mongrel free of threading initial