.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. _release/1.6.x:

============
1.6.x Branch
============

.. contents::
    :depth: 1
    :local:

.. _release/1.6.x/upgrade:

Upgrade Notes
=============

The :ref:`Proxy Authentication <api/auth/proxy>` handler was renamed to
``proxy_authentication_handler`` to follow the ``*_authentication_handler`` form
of all other handlers. The old ``proxy_authentification_handler`` name is marked
as deprecated and will be removed in future releases. It's strongly recommended
to update ``httpd/authentication_handlers`` option with new value
in case if you had used such handler.

.. _release/1.6.0:

Version 1.6.0
=============

* :issue:`2200`: support Erlang/OTP 17.0 :commit:`35e16032`
* Fauxton: many improvements in our experimental new user interface, including
  switching the code editor from CodeMirror to Ace as well as better support
  for various browsers.
* Add the ``max_count`` option (:ref:`config/uuids`) to allow rate-limiting
  the amount of UUIDs that can be requested from the :ref:`api/server/uuids`
  handler in a single request (:ref:`CVE 2014-2668 <cve/2014-2668>`).
* :issue:`1986`: increase socket buffer size to improve replication speed
  for large documents and attachments, and fix tests on BSD-like systems.
  :commit:`9a0e561b`
* :issue:`1953`: improve performance of multipart/related requests.
  :commit:`ce3e89dc`
* :issue:`2221`: verify that authentication-related configuration settings
  are well-formed. :commit:`dbe769c6`
* :issue:`1922`: fix CORS exposed headers. :commit:`4f619833`
* Rename ``proxy_authentification_handler`` to ``proxy_authentication_handler``.
  :commit:`c66ac4a8`
* :issue:`1795`: ensure the startup script clears the pid file on termination.
  :commit:`818ef4f9`
* :issue:`1962`: replication can now be performed without having write access
  to the source database (:commit:`1d5fe2aa`), the replication checkpoint
  interval is now configurable (:commit:`0693f98e`).
* :issue:`2025`: add support for SOCKS5 proxies for replication.
  :commit:`fcd76c9`
* :issue:`1930`: redirect to the correct page after submitting a new document
  with a different ID than the one suggested by Futon. :commit:`4906b591`
* :issue:`1923`: add support for `attachments` and `att_encoding_info` options
  (formerly only available on the documents API) to the view API.
  :commit:`ca41964b`
* :issue:`1647`: for failed replications originating from a document in the
  `_replicator` database, store the failure reason in the document.
  :commit:`08cac68b`
* A number of improvements for the documentation.
