Serf 1.0.3 [2012-03-20, from /tags/1.0.3, r1586]
  Map more OpenSSL errors into SERF_SSL_CERT_UNKNOWNCA (r1573)


Serf 1.0.2
  Not released.


Serf 1.0.1 [2012-02-15, from /tags/1.0.1, r1569]
  FreeBSD fixes in the test suite (r1560, r1565)
  Minor build fixes


Serf 1.0.0 [2011-07-15, from /tags/1.0.0, r1540]
  Fixed issue 38: enable builds using non-GNU make
  Fixed issue 49: support SSL tunnels for HTTPS via a proxy
  Fixed issue 56: allow Subject Alternative Name, and enable SNI
  Fixed issue 61: include order dependencies
  Fixed issue 66: improved error reporting when creating install dirs
  Fixed issue 71: handle ECONNREFUSED on Windows
  Fixed issue 79: destroy the APR allocator, if we create one
  Fixed issue 81: build failed on APR 0.9.x
  Major performance improvements and bug fixes for SSL buckets/handling (r1462)
  Add a new "iovec" bucket type (r1434)
  Minimize network packet writes based on ra_serf analysis (r1467, r1471)
  Fix out of order issue with multiple priority requests (r1469)
  Work around broken WSAPoll() impl on Windows introduced in APR 1.4.0 (r1506)
  Fix 100% CPU usage with many pipelined requests (r1456)
  Corrected contents of build/serf.def; it now includes bucket types (r1512)
  Removed "snapshot" feature from buckets (r1503)
  Various improvements to the test system
  Various memory leak fixes


Serf 0.7.2 [2011-03-12, from /tags/0.7.2, r1452]
  Actually disable Nagle when creating a connection (r1441)
  Return error when app asks for HTTPS over proxy connection (r1433)


Serf 0.7.1 [2011-01-25, from /tags/0.7.1, r1432]
  Fix memory leak when using SSL (r1408, r1416)
  Fix build for blank apr-util directory (r1421)


Serf 0.7.0 [2010-08-25, from /tags/0.7.0, r1407]
  Fix double free abort when destroying request buckets
  Fix test server in unit test framework to avoid random test failures
  Allow older Serf programs which don't use the new authn framework to still
    handle authn without forcing them to switch to the new framework. (r1401)
  Remove the SERF_DECLARE macros, preferring a .DEF file for Windows
  Barrier buckets now pass read_iovec to their wrapped bucket
  Fix HTTP header parsing to allow for empty header values


Serf 0.6.1 [2010-05-14, from /tags/0.6.1, r1370]
  Generally: this release fixes problems with the 0.4.0 packaging
  Small compilation fix in outgoing.c for Windows builds


Serf 0.6.0
  Not released.


Serf 0.5.0
  Not released.


Serf 0.4.0
  WITHDRAWN: this release misstated itself as 0.5.0; use a later release

  Provide authn framework, supporting Basic, Digest, Kerberos (SSPI, GSS),
    along with proxy authn using Basic or Digest
  Added experimental listener framework, along with test_server.c
  Improvements and fixes to SSL support, including connection setup changes
  Experimental support for unrequested, arriving ("async") responses
  Experimental BWTP support using the async arrival feature
  Headers are combined on read (not write), to ease certian classes of parsing
  Experimental feature on aggregate buckets for a callback-on-empty
  Fix the bucket allocator for when APR is using its pool debugging features
  Proxy support in the serf_get testing utility
  Fix to include the port number in the Host header
  serf_get propagates errors from the response, instead of aborting (Issue 52)
  Added serf_lib_version() for runtime version tests


Serf 0.3.1 [2010-02-14, from /tags/0.3.1, r1322]
  Fix loss of error on request->setup() callback. (Issue 47)
  Support APR 2.x. (Issue 48)
  Fixed slowdown in aggregate bucket with millions of child buckets
  Avoid hang in apr_pollset_poll() by unclosed connections after fork()


Serf 0.3.0 [2009-01-26, from /tags/0.3.0, r1217]
  Support LTFLAGS override as a config-time env. variable (Issue 44)
  Fix CUTest test harness compilation on Solaris (Issue 43)
  Fix small race condition in OpenSSL initialization (Issue 39)
  Handle content streams larger than 4GB on 32-bit OSes (Issue 41)
  Fix test_ssl.c compilation with mingw+msys
  Fix conn close segfault by explicitly closing conn when pool is destroyed
  Expose the depth of the SSL certificate so the validator can use that info
  Fix socket address family issue when opening a connection to a proxy
  Provide new API to take snapshots of buckets
  Implement snapshot API for simple and aggregate buckets
  Build with bundled apr and apr-util VPATH builds
  Build with bundled OpenSSL builds


Serf 0.2.0 [2008-06-06, from /tags/0.2.0, r1189]
  Enable use of external event loop: serf_create_context_ex
  Enable adding new requests at the beginning of the request queue
  Handle 'Connection:close' headers
  Enable limiting the number of outstanding requests
  Add readline function to simple buckets
  Concatenate repeated headers using comma as separator, as per RFC 2616,
    section 4.2. (Issue 29)
  Add proxy server support
  Add progress feedback support. (Issue 11)
  Provide new API to simplify use of proxy and progress feedback support
  Add callback to validate SSL server certificates. (Issue 31)
  Add new test framework
  Send current version string in the test programs (Issue 21)
  Bugfixes:
     Fix segfault with epoll when removing a NULL socket
     Reset OpenSSL thread-safety callbacks when apr_terminate() called
     Do not remove the socket from the pollset on pool cleanup
     Do not issue double close on skt w/second one being close(-1) (Issue 33)


Serf 0.1.2 [2007-06-18, from /tags/0.1.2, r1115]
  Enable thread-safety with OpenSSL (Issue 19)
  Teach serfmake to install headers into include/serf-0
  Be more tolerant when servers close the connection without telling us
  Do not open the connection until we have requests to deliver
  Fix serfmake to produce the library that corresponds to the minor version
  Fix a memory leak with the socket bucket (Issue 14)
  Fix uninitialized branch in serf_spider (Issue 15)


Serf 0.1.1 [2007-05-12, from /tags/0.1.1, r1105]
  Add SSL client certificate support
  Implement optimized iovec reads for header buckets
  Fix up 'make clean' and 'make distclean' (Issues 9, 10)
  Add SERF_VERSION_AT_LEAST macro
  Remove abort() calls (Issue 13)


Serf 0.1.0 [2006-12-14, from /tags/0.1.0, r1087]
  Initial packaged release
