#+TITLE:    clj-http changelog
#+AUTHOR:   Lee Hinman
#+STARTUP:  fold nodlcheck lognotestate hideall
#+OPTIONS:  H:4 num:nil toc:t \n:nil @:t ::t |:t ^:{} -:t f:t *:t
#+OPTIONS:  skip:nil d:(HIDE) tags:not-in-toc
#+PROPERTY: header-args :results code :exports both :noweb yes
#+HTML_HEAD: <style type="text/css"> body {margin-right:15%; margin-left:15%;} </style>
#+LANGUAGE: en

* Changelog
List of user-visible changes that have gone into each release
** 3.12.4 (unreleased)
** 3.12.3
- Allow http-client re-use in async situation (#599)
  https://github.com/dakrone/clj-http/pull/599
** 3.12.2
- Upgrade Dependencies (#598)
  https://github.com/dakrone/clj-http/pull/598
** 3.12.1
- Bugfix for :normalize-uri (#584)
  https://github.com/dakrone/clj-http/pull/584
** 3.12.0
- Create SSLContext consistently for all connection managers (#575)
  https://github.com/dakrone/clj-http/pull/575
- Adds RequestConfig Option :normalize-uri (#583)
  https://github.com/dakrone/clj-http/pull/583
** 3.11.0
- Adds workaround for Async Multipart uploads greater than 25 kb (#574)
  https://github.com/dakrone/clj-http/pull/574
- Adds an additional style for multi-param-style added (#562)
  https://github.com/dakrone/clj-http/pull/562
- Close transit input stream after reading response (#565)
  https://github.com/dakrone/clj-http/pull/565
- Bump patch versions of apache httpcomponents to latest. (#569)
  https://github.com/dakrone/clj-http/pull/569
- Fixed decode-json-body (#568)
  https://github.com/dakrone/clj-http/pull/568
- Handle quoted parameter values in content type (#573)
  https://github.com/dakrone/clj-http/pull/573
** 3.10.3
- Improve error message when using incompatible version of cheshire
  https://github.com/dakrone/clj-http/pull/558
- Properly handle "308 Permanent Redirect" status code
  https://github.com/dakrone/clj-http/pull/554
** 3.10.2
- Fix performance regressions from #528
  https://github.com/dakrone/clj-http/pull/546
- Adds support for custom DNS Resolvers
  https://github.com/dakrone/clj-http/pull/545
- Buffer :debug output to improve readability
  https://github.com/dakrone/clj-http/pull/544
- Improve compatbility with GraalVM
  https://github.com/dakrone/clj-http/pull/543
- Bug fix: Check first byte before wrapping response stream with gunzip
  https://github.com/dakrone/clj-http/pull/549
** 3.10.1
- JSON parsing is always strict. See [[file:README.org::*Incrementally%20JSON%20Parsing][README#Incrementally JSON Parsing]]. This is
  a *breaking change* and users *must* upgrade to cheshire >= 5.9.0.
  https://github.com/dakrone/clj-http/pull/507
** 3.10.0
- Add trust-manager and key-managers support to the client
  https://github.com/dakrone/clj-http/pull/469
- Improving consistency of connection option names
  https://github.com/dakrone/clj-http/pull/483
  https://github.com/dakrone/clj-http/issues/477
- Ensure Socket Timeout is set for BasicHttpClientConnectionManager
  https://github.com/dakrone/clj-http/pull/463
- Reduce body allocation and copying
  https://github.com/dakrone/clj-http/pull/475
** 3.9.1
- Fix body parsing when first byte value is 255
  https://github.com/dakrone/clj-http/pull/449
- Add custom =:unexceptional-status= option
  https://github.com/dakrone/clj-http/pull/451
** 3.9.0
- Add support for reusable http clients, returning the client in =:http-client= and allowing one to
  be specified (with the same setting) - https://github.com/dakrone/clj-http/issues/441
- Cancelling the =Future= returned from an async http request now also aborts the HttpRequest object
- Async connection managers no longer put the connection manager in an illegal ACTIVE state [[https://github.com/dakrone/clj-http/issues/443][#443]]
- Added the =:cookie-spec= and =:cookie-policy-registry= options for specifying a custom cookie spec
  for parsing cookies. Since clj-http doesn't rely on Apache's cookies handling, this is for
  advanced users who wish to add their own cookie validation, or use Apache's handling instead of
  clj-http's. It also allows a user who wants to registry a custom spec to reuse the spec without
  creating it for every request. Semi-related to https://github.com/dakrone/clj-http/issues/444
- Added support for caching HTTP responses from a server. This can dramatically speed up requests to
  the same URL. Filling and invalidating the cache is handled by Apache's httpclient-cache project,
  with configuration exposed under the =:cache= and =:cache-config= parameters in the option map.
  https://github.com/dakrone/clj-http/issues/445

** 3.8.0
- Reintroduce the =:save-request= and =:debug-body= options
- +Wrap nested querystring params before form params, fixing
  https://github.com/dakrone/clj-http/issues/427+ Reverted, see further below
- Merged https://github.com/dakrone/clj-http/pull/426 to allow an empty SSLGenericSocketFactory
  context
- Merged https://github.com/dakrone/clj-http/pull/424 to add :mime-subtype request parameter to
  override mime subtype
- create-multipart-entity with three arguments arity lets the selection of =HttpMultipartMode=
- new request key :http-multipart-mode which is HttpMultipartMode/STRICT by default
- Added =:ignore-nested-query-string=, =:flatten-nested-form-params=, and =:flatten-nested-keys=
  options for finer-grained control over which nested parts of the request are flattened. Fixes
  https://github.com/dakrone/clj-http/issues/427
- Added =:http-builder-fns= and =:async-http-builder-fns= to support arbitrary customizations to the
  =HttpClientBuilder= and =HttpAsyncClientBuilder=
- Fixed an issue where redirects to a bad location could cause the async client to hang -
  https://github.com/dakrone/clj-http/pull/435
- =client/parse-url= now includes the original URL in the =:url= key
- =core/get-cookie-policy= is now a multimethod. This allows users to customize the return of their
  own cookie validation method.
- Empty responses with coercion no longer throw exceptions when processing empty gzipped response
  streams. Fixes https://github.com/dakrone/clj-http/issues/257

** 3.7.0
This list contains all the changes since 3.0.0.

Added:
- HttpRequestInterceptor support 155bd23
- protocol-version and reason-phrase f430517
- support for async HTTP requests (like Ring) 44d10ec
- support for different multi-param encoding (:repeating, :array, :indexed) cddeb3e
- Add unparse function aec7dd1
- Added :redirect-strategy :graceful
- Allow RequestConfig and HttpClientContext to be injected feb3c48

Removed:
- :save-request

Changed:
- re-written middleware using apache http client 4.5
- Fix retry-handler to be added in correct place a2c31f5
- POST Mutipart: Use charset "UTF-8" instead of "ASCII" as default charset to support internationalization 983508f

** 2.0.0
- merged https://github.com/dakrone/clj-http/pull/274 to update Potemkin so it
  supports Clojure 1.7.0 correctly
- merged https://github.com/dakrone/clj-http/pull/264 to add support for
  coercion of urlencoded data
- make ALL optional dependencies opt-in, rather than opt-out
** 1.1.2
- bumped dependencies for transit-clj and tools.reader
- merge https://github.com/dakrone/clj-http/pull/263 to only decode body headers
  when the content-type is either missing or starts with "text"
** 1.1.1
- merge https://github.com/dakrone/clj-http/pull/262 to prevent
  NullPointerException when decoding body headers with HEAD requests
- merge https://github.com/dakrone/clj-http/pull/261 to decode user info from
  URL if provided
- merge https://github.com/dakrone/clj-http/pull/260 to upgrade tools.reader
  for better cljs compatibility
- add =304= (not modified) to the list of unexceptional responses, see #259
** 1.1.0
- merged https://github.com/dakrone/clj-http/pull/255 to add support for Windows
  NTLM authentication
- Add the `with-additional-middleware` macro
- Add the ability to specify form-param-encoding for encoding form parameters
- merged https://github.com/dakrone/clj-http/pull/248 to removed deprecated
  cookie APIs from cookie.clj
- merged https://github.com/dakrone/clj-http/pull/245 to do some cleanups and
  small import fixes
- merged https://github.com/dakrone/clj-http/pull/240 to implement
  meta/with-meta for the header map
- merged https://github.com/dakrone/clj-http/pull/242 fixing a connection leak
  when http-entity is null
- bumped all dependencies to latest versions
- merged https://github.com/dakrone/clj-http/pull/235 to fix wrap-nested-params
- merged https://github.com/dakrone/clj-http/pull/236 to clean up multipart
  constructors and reflection
- merged https://github.com/dakrone/clj-http/pull/234 to allow scheme
  customization in default connection
** 1.0.1
- merged https://github.com/dakrone/clj-http/pull/232 to fix =empty= on
  header-map
- fix :json-strict-string-keys
- exclude clojure.core/update from client ns
- added =:decode-cookies= option to allow skipping cookie header decode (if the
  server sends incorrectly formatted cookies for some reason)
** 1.0.0
- merged https://github.com/dakrone/clj-http/pull/215 to add transit support
- drop support for clojure 1.4.0, start testing 1.7.0
- merged https://github.com/dakrone/clj-http/pull/213 to allow passing in an
  already existing keystore, not just a path
- merged https://github.com/dakrone/clj-http/pull/211 to detect charset encoding
  for url-encode
** 0.9.2
- merged https://github.com/dakrone/clj-http/pull/206 to handle null passwords
  for keystores
- merged https://github.com/dakrone/clj-http/pull/201 to make :auto content type
  parsing dispatch pluggable
- Bump crouton and tools.reader dependencies
- Merged https://github.com/dakrone/clj-http/pull/199 to add support for form
  parameters in the PATCH method
- Bump dependencies and fix tests for 1.6.0 compatibility
** 0.9.1
- automatically coerce header values to strings
- fix issue where :ignore-unknown-host wasn't using the =opt= function correctly
** 0.9.0
- Bumped httpcore to 4.3.2
- Merged https://github.com/dakrone/clj-http/pull/190 to support file multiparts
  with content, mime-type and name
- Unify all boolean operators so {:debug true} and {:debug? true} are treated
  the same
- Fix :trace-redirects being [nil] when :uri is used
- Merged https://github.com/dakrone/clj-http/pull/184 containing a bevy of
  changes:
  - initial header-map implementation, allowing headers to be used case
    insensitively
  - drop support for clojure 1.2 and 1.3
  - add support for clojure 1.6
  - change all :use statements to :require statements
  - use better docstring support for defs
  - remove sleep calls in tests
  - make Jetty quieter while running tests
  - newer type hinting syntax
** 0.7.9
- Make :decode-body-headers more reliable by using a byte array instead of
  slurp.
- Merged https://github.com/dakrone/clj-http/pull/181 to fix some tests
- Merged https://github.com/dakrone/clj-http/pull/178 to eliminate test
  reflection
- Merged https://github.com/dakrone/clj-http/pull/177 to update apache HTTP deps
- Merged https://github.com/dakrone/clj-http/pull/175 to add {:as :json-strict}
  for output coercion
- Added {:as :json-strict-string-keys} output coercion
- bump dependencies to their latest
- Merged https://github.com/dakrone/clj-http/pull/172 to update .gitignore file
  and clean up whitespace for new clojure-mode
- Merged https://github.com/dakrone/clj-http/pull/171 to support SOCKS proxies
* Work log
** 2015-07-24
- branched master to create 2.x
- start major rewrite on master branch for non-deprecated Apache usage
** Released 2.0.0
** 2015-07-18
- merged https://github.com/dakrone/clj-http/pull/274 to update Potemkin so it
  supports Clojure 1.7.0 correctly
** 2015-05-23
- merged https://github.com/dakrone/clj-http/pull/264 to add support for
  coercion of urlencoded data
- make ALL optional dependencies opt-in, rather than opt-out
** Released 1.1.2
** 2015-05-06
- bumped dependencies for transit-clj and tools.reader
** 2015-04-24
- merge https://github.com/dakrone/clj-http/pull/263 to only decode body headers
  when the content-type is either missing or starts with "text"
** Released 1.1.1
** 2015-04-22
- merge https://github.com/dakrone/clj-http/pull/262 to prevent
  NullPointerException when decoding body headers with HEAD requests
** 2015-04-20
- merge https://github.com/dakrone/clj-http/pull/261 to decode user info from
  URL if provided
** 2015-04-14
- merge https://github.com/dakrone/clj-http/pull/260 to upgrade tools.reader
  for better cljs compatibility
** 2015-04-05
- add =304= (not modified) to the list of unexceptional responses, see #259
** Released 1.1.0 
** 2015-03-03
- merged https://github.com/dakrone/clj-http/pull/255 to add support for Windows
  NTLM authentication
** 2015-02-08
- Add the `with-additional-middleware` macro
- Add the ability to specify form-param-encoding for encoding form parameters
** 2015-01-19
- merged https://github.com/dakrone/clj-http/pull/248 to removed deprecated
  cookie APIs from cookie.clj
- merged https://github.com/dakrone/clj-http/pull/245 to do some cleanups and
  small import fixes
** 2015-01-15
- merged https://github.com/dakrone/clj-http/pull/240 to implement
  meta/with-meta for the header map
- merged https://github.com/dakrone/clj-http/pull/242 fixing a connection leak
  when http-entity is null
- bumped all dependencies to latest versions
** 2014-12-13
- merged https://github.com/dakrone/clj-http/pull/235 to fix wrap-nested-params
** 2014-12-12
- merged https://github.com/dakrone/clj-http/pull/236 to clean up multipart
  constructors and reflection
** 2014-12-02
- merged https://github.com/dakrone/clj-http/pull/234 to allow scheme
  customization in default connection
** Released 1.0.1
** 2014-10-28
- merged https://github.com/dakrone/clj-http/pull/232 to fix =empty= on
  header-map
** 2014-10-17
- fix :json-strict-string-keys
** 2014-09-08
- exclude clojure.core/update from client ns
** 2014-08-15
- added =:decode-cookies= option to allow skipping cookie header decode (if the
  server sends incorrectly formatted cookies for some reason)
** Released 1.0.0
** 2014-08-11
- merged https://github.com/dakrone/clj-http/pull/215 to add transit support
- drop support for clojure 1.4.0, start testing 1.7.0
** 2014-08-07
- merged https://github.com/dakrone/clj-http/pull/213 to allow passing in an
  already existing keystore, not just a path
** 2014-07-27
- merged https://github.com/dakrone/clj-http/pull/211 to detect charset encoding
  for url-encode
** Released 0.9.2
** 2014-05-27
- merged https://github.com/dakrone/clj-http/pull/206 to handle null passwords
  for keystores
** 2014-05-14
- merged https://github.com/dakrone/clj-http/pull/201 to make :auto content type
  parsing dispatch pluggable
** 2014-04-21
- Bump crouton and tools.reader dependencies
** 2014-04-09
- Merged https://github.com/dakrone/clj-http/pull/199 to add support for form
  parameters in the PATCH method
** 2014-03-26
- Bump dependencies and fix tests for 1.6.0 compatibility
** Released 0.9.1
** 2014-03-15
- automatically coerce header values to strings
** 2014-03-05
- fix issue where :ignore-unknown-host wasn't using the =opt= function correctly
** Released 0.9.0
** 2014-02-25
- Bumped httpcore to 4.3.2
** 2014-02-19
- Merged https://github.com/dakrone/clj-http/pull/190 to support file multiparts
  with content, mime-type and name
** 2014-02-16
- Unify all boolean operators so {:debug true} and {:debug? true} are treated
  the same
** 2014-02-09
- Fix :trace-redirects being [nil] when :uri is used
** 2014-02-06
- Merged https://github.com/dakrone/clj-http/pull/184 containing a bevy of
  changes:
  - initial header-map implementation, allowing headers to be used case
    insensitively
  - drop support for clojure 1.2 and 1.3
  - add support for clojure 1.6
  - change all :use statements to :require statements
  - use better docstring support for defs
  - remove sleep calls in tests
  - make Jetty quieter while running tests
  - newer type hinting syntax
** Released 0.7.9
** 2014-02-01
- Make :decode-body-headers more reliable by using a byte array instead of
  slurp.
