http/2 ready
Powered by nginx
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 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