http/2 ready
Powered by nginx
1.3.6 (Jan. 6 2023)
 fix: reloading Nginx with nchan_stub_status enabled may result in a crash (introduced in v1.3.1) 
 fix: nchan_redis_upstream_stats_enabled incorrectly documented as having "yes/no" values instead of "on/off"
 fix: compilation erros for Nginx 1.23.2
1.3.5 (Oct. 27 2022)
 feature: track Redis upstreams statistics with nchan_redis_upstream_stats
 fix: possible invalid memory access after Redis cluster node discovery
 fix: GET publisher location request may return incorrect subscriber count when using Redis
 fix: possible to log invalid string for rare error
1.3.4 (Sep. 1 2022)
 fix: Redis cluster slave failover may result in crash
1.3.3 (Aug. 29 2022)
 fix: incorrect timeout handling for new nchan_redis_accurate_subscriber_count resulted in inaccurate subscriber counts
1.3.2 (Aug. 23 2022)
 feature: stub status now shows the total number of commands sent to Redis
 fix: Redis cluster checks may not time out
 fix: Redis cluster may not be marked unhealthy if a required node is marked in the node list as 'fail'
 fix: simultaneous creating many Redis-backed channels may result in CPU usage spikes on Redis server
1.3.1 (Aug. 1 2022)
 fix: Nchan may become unresponsive after a worker is uncleanly terminated
 change: nchan_redis_optimize_setting is now obsolete
 feature: nchan_redis_accurate_subscriber_count that doesn't corrupt Redis
          subscriber counts when nginx workers are killed
 feature: added "redis unhealthy upstreams" to nchan_stub_status
 fix: incorrect nchan_stub_status variables after a worker is uncleanly terminated
 fix: build errors with Nginx >= 1.20.1
 feature: Redis >=7.0.1 SMESSAGE support
 fix: Redis cluster slot assignments may not be reconfigured correctly
 fix: discovery of Redis slave nodes in cluster may be incomplete
1.3.0 (May 26 2022)
 feature: configurable Redis command timeouts with nchan_redis_command_timeout
 feature: configurable Redis command retries with nchan_redis_retry_commands and nchan_redis_retry_commands_max_wait
 fix: Redis cluster status checks can now discover new slaves
 fix: Redis 7 cluster keyslot errors not recognized on Redis 7
 feature: Redis 7 sharded pubsub support
 feature: configurable Redis cluster recovery time, backoff, and jitter
 feature: Redis cluster failure recovery without disconnection
 feature: configurable Redis reconnection time, backoff, and jitter
 fix: Redis scripts are now loaded only when missing
1.2.15 (Dec. 27 2021)
 fix: publishing to >255 string-delimitered channels could result in a crash
 fix: Redis connection failures (since 1 2.14)
1.2.14 [WITHDRAWN] (Dec. 20 2021)
 fix: compiler warnings from the use of the 'typeof' macro
 fix: Nchan can't be built without the Nginx SSL module (bug introduced in 1.2.13)
 update: hiredis updated to 1.0.2
 fix: some Redis connection failures could result in a crash (bug introduced in 1.2.13)
 fix: upstream subrequests crashed with Nginx >= 1.19.9
1.2.13 [WITHDRAWN] (Dec. 13 2021)
 feature: Redis ACL support with username and passwword
 feature: Redis TLS support
1.2.12 (Sep. 22 2021)
 fix: better Redis cluster connection logging
 fix: redundant method to discover Redis slave nodes in cluster mode could result in receiving unreachable IPs
1.2.11 (Sep. 17 2021)
 feature: nchan_redis_discovered_ip_range_blacklist for ignoring autotiscoreved nodes
 feature: nchan_redis_storage_mode is now configurable in location contexts 
1.2.10 (Aug. 25 2021)
 fix: Nchan could not be built without openssl due to hiredis dependency
      (introduced in v1.2.9)
 feature: allow no separator for http-raw-stream (thanks @sclem)
1.2.9 (Aug. 12 2021)
 feature: Redis cluster reconfiguration check timer,
      nchan_redis_cluster_check_interval setting
 fix: detect Redis cluster reconfiguration when publishing messages in "nostore" mode
 update: hiredis updated to v1.0.0 
 fix: segfault on out-of-shared-memory condition for multiplexed publishers
1.2.8 (Apr. 12 2021)
 feature: nchan_subscriber_info locations for receiving customizable info from 
      subscribers of a given channel.
 fix: incorrect lgging of disconnected subscribers with 400 error instead of 499
      (bug introduced in v1.2.7)
 feature: add $nchan_channel_subscriber_last_seen, $nchan_channel_subscriber_count 
      and $nchan_channel_message_count variables
 fix: GCC 10 compatibility
1.2.7 (Mar. 17 2020)
 fix: unidirectional subscribers have their connection terminated if they send any data to the server
      after the initial request handshake. This applies to all subscribers except Websocket
 feature: periodic pings for EventSource subscribers
 fix: Redis pending commands count may be incorrect in nchan's stub status page
 fix: channel deletion fails to propagate to Redis slaves
 fix: possible stack overflow when using websocket subscribers
1.2.6 (Jun. 18 2019)
 fix: when using Redis, a channel can stop receiving new messages if 
      they are published faster than they can be sent to subscribers and the 
      message buffer is sufficiently small
 fix: websocket PONG response did not contain PING frame data
 fix: multiplexed channels may stop receiving messages
 fix (security): specially crafted websocket publisher requests when using Redis
      may result in use-after-free memory access
 fix: Nginx config reload may result in crash when using Redis cluster
1.2.5 (Mar. 20 2019)
 fix: using multiplexed channels with Redis in backup mode may result in worker crash
 fix: nchan_publisher_channel_id could not be set exclusively in a publisher location
 fix: Google pagespeed module compatibility
 fix: nchan prevents nginx from starting if no http {} block is configured
1.2.4 (Feb. 25 2019)
 fix: Redis cluster info with zero-length hostname may result in worker crash
 fix: build problems with included hiredis lib in FreeBSD
 feature: nchan_redis_namespace and nchan_redis_ping_interval now work in upstream blocks
 fix: websocket publisher did not publishing channel events
 fix: Redis namespace was limited to 8 bytes
1.2.3 (Oct. 15 2018)
 fix: possible invalid memory access when the initial connection to a Redis cluster node times out
1.2.2 (Oct. 9 2018)
 fix (security): using an unresponsive, overloaded Redis server may result in invalid memory access
 fix: incorrect logging of discovered Redis cluster nodes
 fix: better handling of connection loss when Redis server is unresponsive
 fix: presence of Redis cluster nodes with no known address ("noaddr") nodes could result in worker crash
 fix (security): subscriber may erroneously receive a 400 Bad Request or crash a worker 
      based on data from a previous subscriber
 feature: built-in backend benchmark
 feature: add optimized fastpublish option to Redis nostore mode for maximum
      message publishing thoroughput via Redis
 feature: add no-store Redis mode that uses Redis for broadcasting messages, not storage
 fix: connecting to load-balancing Redis proxy resulted in crash
 fix: using longpoll-multipart in "raw" mode cound result in worker crash
 fix: channel events used with Redis resulted in segfault
1.2.1 (Aug. 2 2018)
 fix: channel last_requested was set to 0 instead of -1 on channel creation
 fix: authentication failure body not forwarded for Nginx > 1.13.10
 fix: possible invalid memory access for websocket unsubscribe requests
 fix: building Nchan could interfere with building other modules
1.2.0 (Jul. 23 2018)
 feature: configurable support for CORS Access-Control-Allow-Credentials header
 fix: better compliance with RFC7692  Websocket permessage-deflate parameter negotiation
 fix (security): possible busy-loop denial-of-service for specially crafted 
      handshakes from Websocket subscribers using permessage-deflate
      (Thanks, Benjamin Michéle)
 fix: nchan_permessage_deflate_compression_memlevel was not applied when set
 refactor: all publisher and subscriber upstream requests are now more memory-efficient
 fix: Using websocket publisher upstream requests may result in invalid memory access
 fix: publishing Redis-backed messages with 1-second expiration may fail after
      cluster restart
 change: nchan_redis_wait_after_connecting directive is now obsolete, and is ignored
 feature: nchan_redis_optimize_target for "cpu" or "bandwidth". Trades off CPU
      load on Redis slaves for syncronization bandwidth.
 feature: configurable Redis master/slave channel subscribe weights with
      nchan_redis_subscribe_weights
 fix: Compilation issues on OS X and systems lacking non-POSIX memrchr()
 fix: nchan_pubsub CORS Allowed headers did not include headers used by subscribers
 fix: Redis-backed channel buffer length could exceed nchan_message_buffer_length
 fix: Publisher upstream compatibility for Nginx > 1.13.10
 feature: nchan_redis_connect_timeout to configure maximum connection time 
      to Redis servers
 feature: Offload Redis SUBSCRIBE traffic to slaves 
      (one SUBSCRIBE per channel per worker)
 fix: Redis cluster and master/slave failover and reconnection issues
 refactor: Redis connection handling rewritten from scratch
 fix: subscribers may not receive new messages after reconnecting to Redis
 fix: publishing to an unavailable Redis-backed channel may result in a 
      following 400 Bad Request
 change: Old Redis-backed channel messages are now delivered after the message
      buffer is fully loaded into memory. Previously they were delivered
      incrementally while the buffer loaded.
 fix: multiplexed Redis-backed channels may not deliver messages if one or
      more channels' messages all expire
 fix: possible crash when catching up to reconnected Redis channel with
      subscribers waiting for consecutive messages
 fix: possible crash from rapidly creating and deleting channels
1.1.15 (Apr. 27 2018)
 fix: A disconnect from a Redis cluster node can result in a segfault
 fix: Using Redis-backed multiplexed channels can result in a segfault
1.1.14 (Jan. 10 2018)
 feature: added nchan_redis_wait_after_connecting setting
 fix: compatibility with Redis >= 4.0 cluster
1.1.13 (Dec. 4 2017)
 fix: added Redis backwards compatibility with Nchan 1.1.7 and below
      for online upgrades with mixed-version Nchan cluster
1.1.12 (Dec. 1 2017)
 fix: possible "Unexpected spool == nuspool" worker crash
 fix: subscriber messages delivered during active nchan_subscribe subrequest
      may be garbled
1.1.11 (Nov. 29 2017)
 fix: Redis backup-mode not working (since 1.1.9)
 fix: incorrect handling of Redis permessage-deflated messages results in
      missing first char of eventsource event type
 fix: worker crash when unable to create temp file for large websocket
      permessage-deflate message
 fix: CPU-bound overloaded Nginx may result in worker crashes
      (may occur with large Openresty Lua load)
 change: default nchan_shared_memory_size is now 128M
 fix: some channel info from publisher GET requests may be incorrect with Redis
 fix: file descriptor leak when reconnecting to Redis
1.1.10 (Nov. 13 2017)
 feature: nchan_authorize_request failure response forwarded back to subscriber
      Sponsored by Symless (https://symless.com/)
 fix: allow nchan_access_control_allow_origin in if blocks
 fix: longpoll-multipart may read uninitialized memory when receiving 
      zero-length message
 fix (security): invalid memory access for aborted websocket subscriber 
      after channel existence check via Redis
 fix: websocket handhshake failure handled incorrectly when messages 
      are available
 fix (security): websocket subscriber disconnecting before handshake may
      result in invalid memory access
 fix (security): possible invalid memory access for disappearing longpoll sub
 feature: add "shared memory limit" to nchan_stub_status output
1.1.9 (Oct. 30 2017)
 fix: more proper websocket extension negotiation with more 
      informative failure messages
 fix: websocket handshake failure response included superfluous CLOSE frame
 feature: websocket deflate-frame and x-webkit-deflate-frame support
1.1.8 (Oct. 26 2017)
 feature: websocket permessage-deflate support
      Sponsored by HYFN (https://hyfn.com/)
 fix (security): websocket publisher may crash worker when publishing with
      channel group accounting on to a new group
 fix: messages published to Nchan via websocket binary frames 
      should have content-type set to "application/octet-stream"
 fix: accept websocket publisher binary frames (thanks @rponczkowski)
 fix: multiplexing over exactly 255 channels results in worker crash
 fix (security): Specially crafted invalid subscriber msgid may crash worker
 fix: nchan_subscriber_first_message <= 0 (newest) with existing Redis data
      incorrectly treated as "oldest" for initial subscribers
 fix: 0-length channel name may crash worker
 fix: subscribe/unsubscribe callback requests do not work when used with
      authorization callback request
 fix (security): Messages published with Redis through websocket publisher 
      may result in worker crash (bug introduced in 1.1.5)
 fix: nchan_pubsub setting may not be parsed correctly
1.1.7 (Jul. 3 2017)
 fix: possible read-after-free after redis disconnect
 fix: publishing to redis cluster before it is connected results in worker crash
 fix: possible use-after-free for suddenly disconnected longpoll-multipart subscriber
 fix: possible use-after-free when using nchan_authorize_request for slow subscribers and slow upstream
 fix: nchan_stub_status "stored messages" value could be incorrect when using Redis
1.1.6 (May 9 2017)
 fix: messages published through Redis may crash worker (introduced in 1.1.5)
 fix (security): urlencoded message id in url parsed incorrectly can result in worker crash
1.1.5 (May 3 2017)
 feature: get current Nchan version through $nchan_version variable 
      and nchan_stub_status
 fix (security): invalid memory access for multiplexed channel subscribers 
      with buffered output (Thanks Casey Forbes (@caseyf) for debugging.)
 fix: "redis pending commands" nchan_stub_status stat could be wrong after 
      deleting channels
 fix: invalid memory access when using Redis under high load
 fix: possible "message from the past" errors under high publishing load
 fix: graceful publisher/subscriber notifications when out of shared memory
      (via HTTP 507 Insufficient Storage status code)
 fix: compatibility with limit_except directive
1.1.4 (Apr. 25 2017)
 fix (security): possible memory corruption using multiplexed channels 
      at high load (Thanks Giovanni Caporaletti (@TrustNoOne) for debugging.)
 fix: possible crash when reconnecting to Redis cluster (introduced in 1.1.3)
1.1.3 (Mar. 25 2017)
 fix (security): incorrect handling of WS optimization could trigger SIGABRT
 fix: Redis cluster reconnect readiness verification
1.1.2 (Mar. 1 2017)
 change: "interprocess alert X delayed by Y sec" log messages downgraded 
      from ERROR to NOTICE
 fix: "group info string too short" error
 fix: Incorrect handling of connections to Redis cluster nodes with round-robin
      DNS hostnames (Thanks to ring.com for sponsoring this fix!)
1.1.1 (Feb. 8 2017)
 fix: incorrect stats for nchan_stub_status after reload.
      (Stats are no longer reset after reload)
 fix: websocket subscriber may receive two CLOSE frames
 fix: websocket with ws+meta.nchan subprotocol did not receive empty messages
 feature: websocket client heartbeats with nchan_websocket_client_heartbeat
 fix: websocket now echoes code and reason when connection close initiated from client
1.1.0 (Jan. 4 2017)
 feature: websocket subscribers now receive "application/octet-stream" messages
      in binary frame rather than text
 fix: publisher request variables not always passed to nchan_publisher_upstream_request
 feature: Redis storage 'backup' mode strictly for data persistence
 fix: possible lingering subscriber if connection is closed just before subscribing
 fix: possible memory leak when using multiplexed channels
 security fix: subscribing with If-Modified-Since and without If-None-Match headers
      crashed the Nginx worker (thanks @supertong)
 security fix: sending an empty message to multipart/mixed subscriber crashed Nginx worker
 fix: publisher & subscriber response codes were logged incorrectly
 fix: websocket subscriber memory leak on upstream authentication failure
 fix: possible crash after reloading when using several instances of Nchan with Redis
 feature: nchan_access_control_allow_origin can accept nginx variables
 feature: Redis key namespaces
 feature: all size configurations can now parse decimal values
 fix: off-by-one subscriber count when using multiplexed channels
 feature: accounting and dynamic limits for channel groups
1.0.8 (Nov. 28 2016)
 fix: possible crash under severely heavy load, introduced in 1.0.7 with stack-overflow fix
1.0.7 (Nov. 27 2016)
 fix: memory leak after websocket publisher uncleanly aborts connection
 fix: misbehaving websocket publisher with nchan_publisher_upstream_request
 fix: potential stack overflow with very large message buffers
 fix: invalid memory access with empty nchan_publisher_upstream_request for websocket publisher
 fix: incorrect handling of chunked response from nchan_publisher_upstream_request
 fix: publishing through websocket too fast may result in buffered messages that never arrive
 fix: DELETE to multiplexed channel should delete all listed channels
 fix: abort if publishing to multiple channels while using redis
1.0.6 (Nov. 15 2016)
 fix: large messages were sometimes incorrectly cleaned up, leaving behind temp files
 fix: file descriptor leak when listening on a unix socket and suddenly 
      aborting client connections
 fix: invalid memory access after reloading twice with redis enabled
 fix: crash after shutting down nginx when 'master_process' set to 'off'
 change: nchan_max_channel_subscribers now always refers to subscribers on this instance of
      Nchan, even when using Redis.
 feature: subscribe/unsubscribe callbacks with nchan_subscribe_request and nchan_unsubscribe_request
1.0.4 (Oct. 28 2016)
 security: fix crash when receiving large messages over websocket with ws+nchan subprotocol
1.0.3 (Sept. 3 2016)
 feature: nchan_message_timeout and nchan_message_buffer_length 
      can now use nginx variables for dynamic values
 fix: unsolicited websocket PONGs disconnected the subscriber in violation of RFC6455
 fix: possible script error when getting channel from Redis
 fix: possible incorrect message IDs when using Redis (thanks @supertong)
 security: possible invalid memory access on publisher GET, POST, or DELETE when
      using Redis and the publisher connection is terminated before receiving
      a response
 fix: correct publisher response code when nchan_authorize_request is unavailable
      (502 instead of 500)
 security: crash if publisher POSTs request with no Content-Length header when 
      using nchan_authorize_request
1.0.2 (Aug. 29 2016)
 fix: more informative missed-message warnings
 fix: invalid memory access when Redis enabled without setting server URL
 fix: incomplete redis channel deletion
 fix: Redis command responses may not be processed after large message
      until next command
 feature: catch up with missed messages after reconnecting to Redis cluster
 fix: possible invalid memory access after disconnecting from Redis cluster
 fix: Redis-stored unbuffered messages may not be delivered
 fix: possible invalid memory access when using previously idling channels
 fix: invalid memory access if publisher POST request's connection terminates
      before receiving response
 fix: messages published rapidly to Redis via different Ncnan servers may
      be received out of order
 fix: possible stack overflow when receiving messages through Redis
      for multiplexed channels
 fix: channels with 'nchan_store_messages off' published 1 message per second
 fix: issue warning when out-of-order published message is detected
 fix: Redis cluster compatibility with channel ids containing '}' character
 fix: Redis-stored channel deleted too quickly when publishing short-lived messages
1.0.1 (Aug. 22 2016)
 feature: nchan_stub_status shared memory accounting
 fix: various compiler warnings
1.0.0 (Aug. 20 2016)
 fix: incorrectly repeated subscriber_enqueue channel events
 fix: badly handled Redis messages with TTL < 1 (again)
 fix: websocket didn't close connection on PING fail
 feature: nchan_stub_status stats location
 fix: bad memory access for Redis channels when unsubscribing and very busy
 optimize: SSE2 & AVX2 optimizations for websocket frame unmasking
 feature: Redis Cluster support
 (WARNING:) data in Redis from previous versions will be inaccessible
 feature: different locations can use different Redis servers
 feature: nchan_subscriber_first_message can take a number (positive or negative) 
      for nth message (from first or last)
 feature: expire Redis-stored idle channels with nchan_redis_idle_channel_cache_timeout
 fix: some multiplexed channels never garbage-collected when inactive
 fix: unbuffered message garbage collector was too lazy
 fix: update nchan_message_buffer_length correctly when using Redis (thanks @supertong)
 fix: incorrect handling of missing/expired messages in multiplexed channels
 fix: memory leak when publishing via Websocket on a pubsub location
 fix: multiplexed channel DELETE when using Redis handled incorrectly
 fix: rare Redis script error when publishing message
 fix: Redis connection ping infinite loop when reloading
 fix: crash if Redis message TTL less than 1 sec
 fix: message delivery occasionally stopped when using Redis 
      and rapidly publishing messages
 fix: logpoll-multipart sometimes failed to respond when using Redis 
      and rapidly publishing messages
 fix: don't crash if Redis server is busy loading data
0.99.16 (Jun 10 2016)
 fix: invalid memory access when upstream subscriber authorize request failed
 fix: longpoll-multipart subscriber was managed incorrectly on channel deletion
 fix: subscribers may not receive messages after Redis reconnection
0.99.15 (May 31 2016)
 feature: Redis client keepalive configurable with nchan_redis_ping_interval
 feature: try to reconnect to Redis after lost connection to Redis
 fix: invalid memory access after lost connection to Redis
 fix: use-after-free error if subscriber disconnects before response 
      from upstream authorize server (thanks Filip Jenicek)
 fix: corrupt longpoll-multipart boundary data with long messages
 feature: 'raw' mode for longpoll-multipart
 feature: http-raw-stream client, like Push Stream Module's 'stream' mode
 fix: incomplete longpoll-multipart response when using Redis
 fix: "subrequests cycle" error for websocket publisher for nginx > 1.9.4
 fix: nchan_channel_id_split_delimiter inheritance
 fix: subscriber memory leak from 0.99.8
 fix: reload crash from 0.99.14
0.99.14 (May 4 2016)
 fix: trailing NULL character in Publisher response content-type for json, xml, and yaml
 fix: don't crash when out of shared memory
 fix: invalid memory access when using nchan_publisher_upstream_request with websocket 
 fix: incorrect stored messages count when using Redis store
 fix: incorrect last_message_id on publisher GETs (memstore and Redis)
 fix: incorrect behavior when subscribing right after startup before all workers are ready
 fix: some internal event loop timers were not being canceled, leading to slow shutdown
 fix: resuming some subscribers with valid message ids didn't work when using Redis store
 fix: possible invalid memory access when restarting Nginx after using multiplexed channels
 fix: accept url-encoded message ids
 feature: add ws+meta.nchan websocket subprotocol that include message metadata
 fix: all requests after X-Accel-Redirect from upstream were treated as GETs
0.99.13 (Apr. 20 2016)
 fix: invalid content-length for nchan_authorize_request publisher requests
 fix: "subrequests cycle" error after 200 websocket publish requests
 fix: zero-size buf warning when publishing empty messages via websocket
 fix: nchan_max_channel_subscribers was ignored
 fix: use a blocking Redis connection for commands during shutdown to ensure commands are sent
 fix: better TTL handling for Redis keys
0.99.12 (Apr. 10 2016)
 fix: SPDY compatibility with EventSource and multipart/mixed subscribers
 fix: warnings when shutting down Redis storage
 feature: use system's hiredis library if present
 fix: incorrect handling of missing messages when publishing to Redis
0.99.11 (Apr. 3 2016)
 feature: nchan can be built as a dynamic module (for nginx >= 1.9.11)
0.99.10 (Apr. 2 2016)
 fix: messages not freed until expired after being deleted from channel
 fix: buffering and output issues for large messages
 update: hiredis updated to v0.13.3
 fix: Redis publishing and subscribing memory leaks
 optimize: per-channel Redis subscriber counts batched into 100-ms intervals
    to prevent Redis roundtrip floods
 fix: Redis subscriber memory leak
 refactor: extracted shared subscriber and message store logic
 fix: use-after-free error for Redis channels without subscribers
 fix: channel readying logic sometimes got confused and tripped up assert()s
 fix: even more proper handling of websocket close frames
 change: 408 Request Timeout instead of 304 No Content status code for timed out subscribers
0.99.8 (Mar. 13 2016)
 fix: multipart/mixed subscriber output issues
 fix: memory leak for multiplexed > 4 channels
 fix: invalid memory access for aborted subscriber connection with Redis
      and nchan_subscribe_existing_channels_only
 fix: accept websocket binary data frames
 fix: proper handling of websocket close frames
 fix: incorrect expire calculation for cached Redis-stored messages
 fix: double free for multiplexed >4 websocket subs
0.99.7 (Mar. 10 2016)
 fix: websocket infinite ping loop after reload
 feature: nchan_subscriber_message_id_custom_etag_header for misbehaving proxies that eat etags
 fix: 100% cpu after lost Redis connection
 fix: refined CORS cross-origin access control headers and logic
 fix: longpoll subscriber in multipart mode didn't output all messages
 fix: longpoll subscriber in multipart mode could access invalid memory
 fix: compatibility with supported Redis versions < 2.8.14
 fix: nchan_message_timeout 0 should not expire messages
0.99.6 (Feb. 22 2016)
 fix: SIGHUP reloading under load
0.99.5 (Feb 15 2016)
 fix: publishing with client_body_in_file_only enabled
0.99.4 (Feb 12 2016)
 fix: invalid memory access in channel DELETE response
 fix: race condition in IPC during channel creation (thanks vtslothy)
0.99.3 (Feb 10 2016)
 fix: SIGHUP reloading
 fix: startup with insufficient file descriptors shouldn't crash
 fix: longpoll-multipart failure to immediately respond
 fix: longpoll-multipart abort handling
 fix: Redis-store cached message timeouts
 fix: Redis connection-lost handling
 fix: startup with 'master_process off' (single-process mode)
 feature: EventSource 'event:' line support with custom header or config
0.98 (Jan 21 2016)
 feature: publish to multiple channels with one request
 feature: nchan_longpoll_multipart_response config setting
 fix: large message (in-file) handling for multipart/mixed and chunked subscribers
 fix: 400 Bad Request error on 32-bit systems
 fix: memory allocation error for >8 multi-channel subscribers
0.97 (Jan 5 2016) 
 fix: build issues with debian
 fix: compatibility with nginx versions down to 1.0.15
 fix: publishing bug introduced in 0.96
0.961 (Jan 4 2016)
 fix: compiler warning
0.96 (Jan 1. 2016)
 feature: websocket ping with nchan_websocket_ping_interval
 fix: unsafe memory access for Redis publisher
 feature: nchan_publisher_upstream_request
 fix: http/2 compatibility for EventSource and multipart/mixed
 fix: nchan_authorize_request for publisher location endpoints
 fix: publishing long (stored in file) messages to Redis-store
0.95 (Dec. 24 2015)
 feature: configurable nchan_access_control_origin_header, default to *
 fix: recognize non-preflighted CORS requests
 fix: Redis invalid memory access after timeout
0.94 (Dec. 22 2015)
 feature: last mesage id in channel info response
 feature: subscribe up to 255 channel ids using nchan_channel_id_split_delimiter
 fix: tried connecting to Redis when not needed
 change: "last requested" no longer has a -1 value for 'never requested'.
 fix: "last requested" in channel info sometimes not updated
 fix: deleting empty channels
 change: more compact message ids
0.931 (Dec. 14 2015)
 optimize: inter-process internal subscriber fetched too many messages
0.93 (Dec. 12 2015)
 feature: optionally only use Etag for subscriber message id
 feature: optionally get requested message id from variable config
0.92 (Dec. 11 2015)
 feature: HTTP multipart/mixed subscriber
 fix: EventSource bad memory access on disconnect
 feature: HTTP chunked encoding subscriber
 fix: resolved some strict compiler warnings
 fix: more stringent out-of-memory detection during response output. thanks @woodyhymns
 fix: less-than-optimal cache filename handling. thanks @ZhouBox
 fix: incorrect EventSource charset in header. thanks @eschultz
 fix: segfault when websocket publishes message and immediately disconnects
 fix: Duplicate "Connection: Upgrade" header for websocket handshake. thanks @eschultz 
0.904 (Dec. 7 2015)
 fix: more flexible Websocket handshake for "Connection" header. thanks @eschultz
 fix: out-of-memory safety check. thanks @woodyhymns
0.903 (Dec 3 2015)
 fix: better Redis engine connection initializer
 change: simpler message buffer settings
 fix: more backwards-compatibility for pushmodule config settings
0.9 (Dec. 2 2015) - first beta pre-release tag after rebranding as Nchan
 feature: meta channel events: track when subscribers connect and disconnect, and when messages are
          published, with configurable event strings
 feature: request authorization: send upstream request before publishing or subscribing.
          works just like the auth_request module.
 feature: channel multiplexing. up to 4 channels can be subscribed to from a single location
 fix: channel ids were not set within if statements in the nginx config
 feature: hybrid memstore + Redis storage. local caching + distributed message publishing, the best
          of both worlds. (still slower than pure memstore though)
 feature: pubsub locations, optional separate publisher and subscriber channel ids per location
 feature: websocket publisher support
 name change: we're nchan now. code renamed, and cleaned up. config options are backwards-compatible.
 feature: websocket subscriber support
 huge refactor: completely new in-memory storage engine. No more global lock.
    Actually, no more locks at all!
 feature: Redis storage engine. 
0.73 (Sep. 2 2014)
 fix: turning on gzip cleared Etag subscriber response header
 fix: channels incorrectly deleted when overwhelmed with connections
 feature: CORS support via OPTIONS request method response
 fix: file descriptor leak when restarting nginx via SIGHUP
 improve: concurrency for interprocess notifications
 refactor: completely encapsulated message store
 fix: slow memory leak introduced in 0.7
 fix: memory leak when not using message buffer
0.712 (Mar. 21 2014)
 fix: intermittently dropped long-polling connections on internal redirects
 fix: unable to proxy long-polling subscribers. (thanks wandenberg and sanmai)
0.711 (Mar. 13 2014)
 fix: incompatibility with cache manager (proxy_cache and fastcgi_cache directives)
0.71 (Mar. 1 2014)
 fix: removed unused variables and functions to quiet down GCC
0.7: (Feb. 20 2014)
 fix: last-in concurrency setting wasn't working reliably
 refactor: partially separated message storage. add a test harness.
 fix: segfault from concurrency bug while garbage-collecting channels
 fix: some large messages got lost
0.692 (Feb. 3 2010)
 fix: error log reported failed close() for some publisher requests with large messages
 fix: occasional memory leak during message deletion
 fix: worker messages intended for dead worker processes were not deleted
0.691 (Feb. 2 2010)
 fix: server reload (via SIGHUP signal) was failing
 fix: segfault on messages longer than client_body_buffer_size (thanks wfelipe)
 change: removed push_min_message_recipients, added push_delete_oldest_received_message
0.69 (Nov. 17 2009)
 fix: publisher got a 201 Created response even if the channel had no subscribers at the time (should be 202 Accepted)
 fix: small memory leak after each message broadcast to a channel
 feature: optional push_max_channel_subscribers setting added
 fix: first-in concurrency setting wasn't responding to subscribers with a correct status code on conflict
 fix: reused subscriber connections sometimes failed to receive messages
 unfeature: no more nginx 0.6 support. not worth the hassle.
0.683 (Nov. 10 2009)
 change: default max. reserved memory size changed form 16MB to 32 MB
 change: unused node garbage collection made a little more aggressive (max. 3 unused channels per channel search instead of 1)
 fix: unused nodes were deleted only on channel id hash collision (very rare)
 fix: segmentation fault from allocating insufficient memory for interprocess messaging
0.681 (Nov. 6 2009)
 feature: added push_message_buffer_length setting, which sets push_message_max_buffer_length and push_message_min_buffer_length at once.
 fix: publisher channel info text/json response now uses double quotes instead of single.
 fix: interprocess messages were not removed from shared memory correctly, causing weird errors
0.68 (Nov. 5 2009)
 change: default push_subscriber_concurrency value is now "broadcast"
 fix: incorrect error messages for invalid push_pubscriber and push_subscriber_concurrency settings
 change: removed deprecated push_buffer_size and push_queue_messages settings
 feature: rudimentary content-type negotiation for publisher channel info response.
   support text/plain, text/json, text/yaml and application/xml (and mimetype equivalents)
 fix: publisher GET response has HTTP status 0
0.67beta (Nov. 4 2009) and older
 see git repository
copy, but don't plagiarise