CONTRIBUTIONS & CHANGE HISTORY
==============================

01-05-2026  - v4.5.0
             * Added connect_to request option for connecting to an alternate
               network target while preserving the original URL host for the
               Host header, cookies, and TLS SNI (PR#183)
             * Added format_status/1 callback to strip sensitive data from
               gen_server status output (PR#182)
             * Bumped minimum supported Erlang/OTP version to 25; replaced
               Travis CI with GitHub Actions (PR#181)
             * Added option to disable trap_exit in worker processes so
               external connection pools can rely on link-based cleanup
               (PR#171)
             * Internal timestamps are now strictly monotonic, and the
               pre-OTP-25 fallback path has been removed
               (PR#173, PR#185)
             * Performance: refactored chunk_request_body so the Erlang
               compiler can reuse the binary match context; added
               chunk-encoding tests to CI (PR#184)
             * Performance: replaced lists:keysearch/3 with the more
               efficient lists:keyfind/3 (PR#186)
             * Added a helper to update download_dir in the internal config
               ETS table at runtime (PR#158)
             * Fix: routing acquires a fresh load-balancer pid if the cached
               one is no longer alive (PR#166)
             * Test/build: use ssl:handshake/2 on OTP 21+, increased timeout
               in the small_pipeline test, miscellaneous typo fixes
               (PR#172, PR#174, PR#175)

21-09-2018  - v4.4.2
             * Fix for #163 - default to using IPv4

23-08-2018  - v4.4.1
             * Fixes to TLS socket handling (PR#163)
             * Fix ipv6 address family handling (PR#155)
             * Don't send messages to closed/inactive connections (PR#152)

28-01-2017 - v4.4
             * Fixes to SOCKS over SSL processing
             * Added stream_full_chunks option
             * Merged pull requests 145, 151

07-06-2016 - v4.3
             * Adopted erlang.mk for compiling. I find it easier to understand
               how 'make' behaves compared to rebar. This repo can still be built
               using rebar for those who prefer it
             * Removed references to lager. Introduced configurable logging function
             * Fixed an issue where the calling process was getting an extra
               spurious timeout message when the request was timing out

19-04-2016 - v4.2.4
             * Fixed travis-ci build as it was failing in running tests. 
               No code changes to ibrowse

19-04-2016 - v4.2.3
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/143
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/142
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/139
             * Fixed behaviour of option preserve_status_line

25-11-2015 - v4.2.2
             * Fix to ibrowse.app.src to enable publishing using Hex

25-11-2015 - v4.2.1
             * Merged pull request https://github.com/cmullaparthi/ibrowse/pull/132
             * Merged pull request https://github.com/cmullaparthi/ibrowse/pull/137

28-09-2015 - v4.2
             * Merged long pending improvements to pipelining
               https://github.com/cmullaparthi/ibrowse/pull/123
             * Merged pull request https://github.com/cmullaparthi/ibrowse/pull/131

03-08-2015 - v4.1.2
             * R18 compatibility fix
               https://github.com/cmullaparthi/ibrowse/issues/129
             * Add max_attempts option
               https://github.com/cmullaparthi/ibrowse/pull/125
             * Fix for https://github.com/cmullaparthi/ibrowse/pull/120
             * Enhanced SOCKS5 support
               https://github.com/cmullaparthi/ibrowse/pull/117

10-07-2014 - v4.1.1
             * Added support for accepting binaries as header names
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/110
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/111
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/112

18-04-2013 - v4.1.0
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/101
             * Support for https://github.com/cmullaparthi/ibrowse/issues/90
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/86
             * Merged various contributions. Please see commit history for details
             * Introduced the return_raw_request option

09-04-2013 - v4.0.2
             * Tagging master with new version to cover changes
               contributed over the past few months via various pull requests

07-08-2012 - v4.0.1
             * Fix issue 67 properly.

03-08-2012 - v4.0.0
             * Fixed a regression in handling HEAD.
               https://github.com/cmullaparthi/ibrowse/issues/67

             * Fixed a bug in handling SSL requests through a proxy

06-04-2012 - v3.0.4
             * Fix for the following issue
               https://github.com/cmullaparthi/ibrowse/issues/67

13-03-2012 - v3.0.3
             * Fixes the following issues
               https://github.com/cmullaparthi/ibrowse/issues/64
               https://github.com/cmullaparthi/ibrowse/issues/63
               https://github.com/cmullaparthi/ibrowse/issues/62

31-01-2012 - v3.0.2
             * Fixed bug when stopping ibrowse. Not service affecting.

23-01-2012 - v3.0.1
             * Fixed bug highlighted by Dialyzer

23-01-2012 - v3.0.0
             * Change to the way pipelining works.
             * Fixed various issues reported

13-04-2011 - v2.2.0
             * Filipe David Manana added IPv6 support. This is a major new
               feature, Thank you Filipe!
             * Joseph Wayne Norton contributed tweaks to .gitignore

09-02-2011 - v2.1.4
             * Fixed a bug reported by Ryan Zezeski with the
               save_response_to_file option.
               https://github.com/cmullaparthi/ibrowse/issues#issue/33

16-01-2011 - v2.1.3
             * Fixed issues with streaming and chunked responses when using
               the 'caller controls socket' feature. See following links for
               details. Contributed by Filipe David Manana.
               https://github.com/cmullaparthi/ibrowse/pull/24
               https://github.com/cmullaparthi/ibrowse/pull/25
               https://github.com/cmullaparthi/ibrowse/pull/27
               https://github.com/cmullaparthi/ibrowse/pull/28
               https://github.com/cmullaparthi/ibrowse/pull/29

             * Fix for issue 32 reported by fholzhauser
               https://github.com/cmullaparthi/ibrowse/issues#issue/32

             * Fixed some dialyzer warnings. Thanks to Kostis for reporting
               them.

20-12-2010 - v2.1.2
             * Pipelining wasn't working when used in conjunction with the
               {stream_to, {self(), once}} option. Bug report by
               Filipe David Manana.

10-12-2010 - v2.1.1
             * Fix for https://github.com/cmullaparthi/ibrowse/issues/issue/20
               by Filipe David Manana

             * Fix for https://github.com/cmullaparthi/ibrowse/issues/issue/21
               by Filipe David Manana

             * Fix for https://github.com/cmullaparthi/ibrowse/issues/issue/23
               by Filipe David Manana

             * Fix for bugs when using SSL by Jo?o Lopes

25-10-2010 - v2.1.0
             * Fixed build on OpenSolaris. Bug report and patch from
               tholschuh.
               http://github.com/cmullaparthi/ibrowse/issues/issue/10

             * Fixed behaviour of inactivity_timeout option. Reported by
               Jo?o Lopes.
               http://github.com/cmullaparthi/ibrowse/issues/issue/11

             * Prevent atom table pollution when bogus URLs are input to
               ibrowse. Bug report by Jo?o Lopes.
               http://github.com/cmullaparthi/ibrowse/issues/issue/13

             * Automatically do Chunked-Transfer encoding of request body
               when the body is generated by a fun. Patch provided by
               Filipe David Manana.
               http://github.com/cmullaparthi/ibrowse/issues/issue/14

             * Depending on input options, ibrowse sometimes included multiple
               Content-Length headers. Bug reported by Paul J. Davis
               http://github.com/cmullaparthi/ibrowse/issues/issue/15

             * Deal with webservers which do not provide a Reason-Phrase on the
               response Status-Line. Patch provided by Jeroen Koops.
               http://github.com/cmullaparthi/ibrowse/issues/issue/16

             * Fixed http://github.com/cmullaparthi/ibrowse/issues/issue/17
               This was reported by Filipe David Manana.

             * Fixed http://github.com/cmullaparthi/ibrowse/issues/issue/19
               This was reported by Dan Kelley and Filipe David Manana.

             * Added ibrowse:stream_close/1 to close the connection
               associated with a certain response stream. Patch provided by
               Jo?o Lopes.

             * Prevent port number being included in the Host header when port
               443 is intended. Bug reported by Andrew Tunnell-Jones

24-09-2010 - v2.0.1
             * Removed a spurious io:format statement

22-09-2010 - v2.0.0.

           * Added option preserve_chunked_encoding. This allows the
             caller to get the raw HTTP response when the
             Transfer-Encoding is Chunked. This feature was requested
             by Benoit Chesneau who wanted to write a HTTP proxy using
             ibrowse.

           * Fixed bug with the {stream_to, {Pid, once}} option. Bug
             report and lot of help from Filipe David Manana. Thank
             you Filipe.

           * The {error, conn_failed} and {error, send_failed} return
             values are now of the form {error, {conn_failed, Err}}
             and {error, {send_failed, Err}}. This is so that the
             specific socket error can be returned to the caller. I
             think it looks a bit ugly, but that is the best
             compromise I could come up with.

           * Added application configuration parameters
             default_max_sessions and default_max_pipeline_size. These
             were previously hard coded to 10.

           * Versioning of ibrowse now follows the Semantic Versioning
             principles.  See http://semver.org. Thanks to Anthony
             Molinaro for nudging me in this direction.

           * The connect_timeout option now only applies to the
             connection setup phase. In previous versions, the time
             taken to setup the connection was deducted from the
             specified timeout value for the request.

17-07-2010 - * Merged change made by Filipe David Manana to use the base64
               module for encoding/decoding.

11-06-2010 - * Removed use of deprecated concat_binary. Patch supplied by
               Steve Vinoski

10-06-2010 - * Fixed bug in https requests not going via the proxy

12-05-2010 - * Added support for the CONNECT method to tunnel HTTPS through
               a proxy. When a https URL is requested through a proxy,
               ibrowse will automatically use the CONNECT method to first
               setup a tunnel through the proxy. Once this succeeds, the
               actual request is dispatched. Successfully tested with the
               new SSL implementation in R13B-03
             * Added SSL support for direct connections.
               See ibrowse:spawn_worker_process/1 and
               ibrowse:spawn_link_worker_process/1
             * Added option to return raw status line and raw unparsed headers

23-04-2010 - * Fixes to URL parsing by Karol Skocik

08-11-2009 - * Added option headers_as_is

04-10-2009 - * Patch from Kostis Sagonas to cleanup some code and suppress
               dialyzer warnings

24-09-2009 - * When a filename was supplied with the 'save_response_to_file'
               option, the option was being ignored. Bug report from
               Adam Kocoloski

05-09-2009 - * Introduced option to allow caller to set socket options.

29-07-2009 - * The ETS table created for load balancing of requests was not
               being deleted which led to the node not being able to create
               any more ETS tables if queries were made to many number of
               webservers. ibrowse now deletes the ETS table it creates once the
               last connection to a webserver is dropped.
               Reported by Seth Falcon.
             * Spurious data being returned at end of body in certain cases of
               chunked encoded responses from the server.
               Reported by Chris Newcombe.

03-07-2009 - Added option {stream_to, {Pid, once}} which allows the caller
             to control when it wants to receive more data. If this option
             is used, the call ibrowse:stream_next(Req_id) should be used
             to get more data.
   *  Patch submitted by Steve Vinoski to remove compiler warnings
             about the use of obsolete guards

29-06-2009 - * Fixed following issues reported by Oscar Hellstr?m
       *  Use {active, once} instead of {active, true}
       *  Fix 'dodgy' timeout handling
       *  Use binaries internally instead of lists to reduce memory
                 consumption on 64 bit platforms. The default response format
                 is still 'list' to maintain backwards compatibility. Use the
                 option {response_format, binary} to get responses as binaries.
             * Fixed chunking bug (reported by Adam Kocoloski)
             * Added new option {inactivity_timeout, Milliseconds} to timeout
               requests if no data is received on the link for the specified
               interval. Useful when responses are large and links are flaky.
             * Added ibrowse:all_trace_off/0 to turn off all tracing
             * Change to the way responses to asynchronous requests are
               returned. The following messages have been removed.
                * {ibrowse_async_response, Req_id, {chunk_start, Chunk_size}}
                 * {ibrowse_async_response, Req_id, chunk_end}
             * Fixed Makefiles as part of Debian packaging
               (thanks to Thomas Lindgren)
             * Moved repository from Sourceforge to Github

11-06-2009 - * Added option to control size of streamed chunks. Also added
               option for the client to receive responses in binary format.

21-05-2008 - * Fixed bug in reading some options from the ibrowse.conf file.
               Reported by Erik Reitsma on the erlyaws mailing list
             * Fixed bug when cleaning up closing connections

27-03-2008 - * Major rewrite of the load balancing feature. Additional module,
               ibrowse_lb.erl, introduced to achieve this.
             * Can now get a handle to a connection process which is not part of
               the load balancing pool. Useful when an application is making
               requests to a webserver which are time consuming (such as
               uploading a large file). Such requests can be put on a separate
               connection, and all other smaller/quicker requests can use the
               load balancing pool. See ibrowse:spawn_worker_process/2 and
               ibrowse:spawn_link_worker_process/2
             * Ram Krishnan sent a patch to enable a client to send a lot of
               data in a request by providing a fun which is invoked by the
               connection handling process. This fun can fetch the data from
               any where. This is useful when trying to upload a large file
               to a webserver.
             * Use the TCP_NODELAY option on every socket by default
             * Rudimentary support for load testing of ibrowse. Undocumented,
               but see ibrowse_test:load_test/3. Use the source, Luke!
             * New function ibrowse:show_dest_status/2 to view state of
               connections/pipelines to a web server

20-02-2008 - Ram Krishnan sent another patch for another hidden bug in the
             save_response_to_file feature.

07-02-2008 - Ram Krishnan (kriyative _at_ gmail dot com) sent a simple patch to
             enable specifying the filename in the save_response_to_file option.
             When testing the patch, I realised that my original implementation
             of this feature was quite flaky and a lot of corner cases were
             not covered.  Fixed all of them. Thanks Ram!

17-10-2007 - Matthew Reilly (matthew dot reilly _at_ sipphone dot com)
             sent a bug report and a fix. If the chunk trailer spans two TCP
             packets, then ibrowse fails to recognise that the chunked transfer
             has ended.

29-08-2007 - Bug report by Peter Kristensen(ptx _at_ daimi dot au dot dk).
             ibrowse crashes when the webserver returns just the Status line
             and nothing else.

28-06-2007 - Added host_header option to enable connection to secure sites
             via stunnel

20-04-2007 - Geoff Cant sent a patch to remove URL encoding for digits in
             ibrowse_lib:url_encode/1.
             ibrowse had a dependency on the inets application because the
             ibrowse_http_client.erl invoked httpd_util:encode_base64/1. This
             dependency is now removed and the encode_base64/1 has been
             implemented in ibrowse_lib.erl

06-03-2007 -  Eric Merritt sent a patch to support WebDAV requests.

12-01-2007 -  Derek Upham sent in a bug fix. The reset_state function was not
              behaving correctly when the transfer encoding was not chunked.

13-11-2006 -  Youn?s Hafri reported a bug where ibrowse was not returning the
                temporary filename when the server was closing the connection
                after sending the data (as in HTTP/1.0).
              Released ibrowse under the BSD license

12-10-2006 -  Chris Newcombe reported bug in dealing with requests where no
              body is expected in the response. The first request would succeed
              and the next request would hang.

24-May-2006 - Sean Hinde reported a bug. Async responses with pipelining was
              returning the wrong result.

08-Dec-2005 - Richard Cameron (camster@citeulike.org). Patch to ibrowse to
              prevent port number being included in the Host header when port
              80 is intended.

22-Nov-2005 - Added ability to generate requests using the Chunked
              Transfer-Encoding.

08-May-2005 - Youn?s Hafri made a CRUX LINUX port of ibrowse.
              http://yhafri.club.fr/crux/index.html
