ChangeLog
============

- 1.4.2
  - create_dispatcher is determined by URL ws/wss, NOT by presence of sslopt args, to maintain consistency (#875)
  - Remove redundant key generation line (#864)
  - Updated docs to fix old links and updated CI to include Python 3.11

- 1.4.1
  - Fix stack growth bug when `run_forever` reconnects (#854)
  - Add doctest CI for sphinx docs code examples (d150099)
  - General docs improvements

- 1.4.0
  - Fix automatic reconnect with `run_forever` (#838)
  - Allow a timeout to be set when using a proxy (#842)

- 1.3.3
  - Fix unclosed socket error (#826)
  - Update header dict access (#818)
  - Add utf8 workaround to docs (fc9ee9f)

- 1.3.2
  - Add support for pre-initialized stream socket in new WebSocketApp (#804)
  - Remove rel.saferead() in examples (f0bf03d)
  - Increase scope of linting checks (dca4022)
  - Start adding type hints (a8a4099)

- 1.3.1
  - Fix 10 year old bug and improve dispatcher handling for run_forever (#795)
  - Fix run_forever to never return None, only return True or False, and add two tests (#788)
  - Remove Python 3.6 support, EOL in Dec 2021

- 1.3.0
  - BREAKING: Set Origin header to use https:// scheme when wss:// WebSocket URL is passed (#787)
  - Replace deprecated/broken WebSocket URLs with working ones (6ad5197)
  - Add documentation referencing rel for automatic reconnection with run_forever()
  - Add missing opcodes 1012, 1013 (#771)
  - Add errno.ENETUNREACH to improve error handling (da1b050)
  - Minor documentation improvements and typo fixes

- 1.2.3
  - Fix broken run_forever() functionality (#769)

- 1.2.2
  - Migrate wsdump script in setup.py from scripts to newer entry_points (#763)
  - Add support for ssl.SSLContext for arbitrary SSL parameters (#762)
  - Remove keep_running variable (#752)
  - Remove HAVE_CONTEXT_CHECK_HOSTNAME variable (dac1692)
  - Replace deprecated ssl.PROTOCOL_TLS with ssl.PROTOCOL_TLS_CLIENT (#760)
  - Simplify code and improve Python 3 support (#751, #750, #746)
  - Fill default license template fields (#748)
  - Update CI tests
  - Improve documentation (#732, #733, #734, #737, #766, #768)

- 1.2.1
  - Fix python-socks dependency issue mentioned in #728
  - Replace echo.websocket.org with a local websockets echo server for unit tests (4951de2)

- 1.2.0
  - Fix #697, #665: Transition from LGPL 2.1 license to Apache 2.0 license
  - Revert #417 and reimplement SOCKS proxy support with python-socks instead of PySocks (fbcbd43)

- 1.1.1
  - Fix #377: increase exception verbosity in _app.py callback exception
  - Fix #717: race condition during connection close
  - Fix #722: improve handling where credentials include symbols like @
  - Fix #711: improve handling if ssl is None

- 1.1.0
  - Set enable_multithread to True by default (beb135a)
  - Performance improvement in _mask() function (287970e, #433)
  - Performance improvement in recv_strict() function (60e4711, #255)
  - Performance improvement by removing numpy-related code (a462d45)
  - Support uppercase no_proxy, http_proxy, https_proxy env vars (150df4f, #700)
  - Add sslopt 'server_hostname' support (#698)
  - Replace deprecated ssl.PROTOCOL_SSLv23 with ssl.PROTOCOL_TLS (494564f)
  - Update documentation, README (7c9d604, #704)

- 1.0.1
 - Fix exception handling bug #694

- 1.0.0

 - Removed Python 2 code, now only Python 3 compatible (d45343b, b7c5733, ff67af8)
 - Use semver for release versions, unlike breaking release 0.58.0 (#669)
 - Enhance enableTrace output (13e83b4)
 - Improve unit tests to over 80% code coverage (1679ab0, a00dd2d, etc.)
 - Fix old _app.py close status code bug (resulted in on_close() requiring 3 args) (#686)
 - Replace select import with selectors (#568)

- 0.59.0

 - Last main release to support Python 2
 - Fix Python 2 urlparse scheme (#332)
 - Add support for headers with multiple values (#627)
 - Add debug support for reserved custom status codes (#639)
 - Allow multiple Set-Cookie: headers (#649)
 - Simplified cookie sorting (#662)
 - Add no_proxy support (#671)
 - Add Host header to HTTP proxy request (#677)
 - Improve PEP8 style compliance (dc3f5c4)

- 0.58.0

 - Fix README typos (#659)
 - Create README.md from README.rst (#655)
 - Capitalize 'Upgrade' in 'Connection: Upgrade' (#605)
 - Add Python 3.8 and 3.9 CI support (#596)
 - Replace deprecated `thread.isAlive` with `thread.is_alive` (#594)
 - Revert to LGPL v2.1 license (#526)
 - Add code coverage CI testing (#663)
 - Properly revert callback (#442)
 - Replace TravisCI with GitHub Actions (36e32c7)
 - Create Sphinx readthedocs.io documentation (aace06b)

- 0.57.0

 - wsdump: Fix --headers option (#589)
 - Fix getting 400 bad request with long proxy authorization string (#587)
 - Fix for errors that occur when closing websocket from another thread (#586)
 - avoid calling repr(data) if tracing is not enabled (#584)
 - Fixed typo (#579)
 - Create dummy `ssl` object (#577)
 - Show compressed text messages in wsdump.py (#576)
 - Resolve issue opening socket to intranet on Windows 10 with no proxy settings but behind proxy (#573)
 - Expose http connection header to user (#566)
 - Improve the readability of HTTP status codes. (#553)
 - fix the compatible issue with gevent+dnspython (#547)
 - v should be checked for empty string before splitting it (#539)
 - _handshake: hasattr checks on six before accessing the values (#533)

- 0.56.0

 - Don't retry sockets with timeout set to 0(#536)

- 0.55.0

  - Add response headers in WebSocketBadStatusException (#501)
  - Manually assigning WebSocket-Version (#506)
  - SSL socket handling fix (#474)
  - Let setup.py use the same license as LICENSE file (#517)
  - Ensure that "timeout" is passed down, when calling WebSocket.connect() (#513)
  - Retry connect on "Interrupted system call" (#528)

- 0.54.0

  - Change license from LGPL to BSD.
  - Status return for WebSocketApp.run_forever() (#492)
  - Handle redirects in handshake (#491)
  - Make proxy_type option available in WebSocketApp.run_forever() (#486)
  - Fix typo in supress_origin (#485)
  - WebSocketApp's on_close never emits status code or reason (#479)

- 0.53.0

  - on_open() missing 1 required positional argument: 'ws' (#471)
  
- 0.52.0

  - fixed callback argument in _app.py (#468)
  - Fixing none compare bug in run_forever (#472)
  - Fix NoneType bug introduced by #386 fix (#476)

- 0.51.0

  - revert "WebSocketApp class to make it inheritable (#442)" because of breaking the compatibility

- 0.50.0

  - fixed pong before ping (#461)
  - pass proper arguments to method callbacks (#462)

- 0.49.0

  - WebSocketApp class to make it inheritable (#442)
  - Add option to disable sending the Origin header (#459)
  - Websocket.close() meaning of "close status: XXXXX" (#414)
  - Enable multithreading protection with ping_interval (#448)
  - reset WebsocketApp.sock (#450)
  - websocket.enableTrace not working (#455)
  - AttributeError: 'module' object has no attribute 'NullHandler' (#443)
  - WebSocketBadStatusException "not enough arguments for format string" (#454)
  - handshake should deal with None in headers (#432)

- 0.48.0

  - Add NullHandler to logger to fix python 2 issue. (#400)
  - Fix the issue that websocket status message may not present (#403)
  - Socket error not raised in nested try except in python2 (#408)
  - Load system default certificates if none are given (#415)
  - Fix waiting forever on ping/pong timeout (#411)
  - socks5 via pysocks support (#417)
  - v0.47.0 breaks ability to stop stream with `run_forever` (#410)
  - _http.py: fix windows proxy error due to socktype (#427)

- 0.47.0

  - Fix socket constructor in _open_socket to use all relevant variables from getaddrinfo. (#383)
  - .send() method is very slow (#340)
  - cross-platform aync multi-client solution (#375)
  - Fix detecting timeouts with SSL in recv (#387)
  - Fix WebSocketApp does not poll for data correctly when using SSL (#384)
  - Fix Infinite ping/pong timeouts in WebSocketApp.run_forever (#395)
  - Added status message when HTTP can't be upgraded to WS (#399)

- 0.46.0

  - fixed OSError on windows (#370)
  - fixed invalid character (#379)

- 0.45.0

  - change license to LGP v2.1
  - allow reuse of WebsocketApp.run_forever (#365)
  - Update example for python3 (#360)
  - add lock to recv function (#356)
  - Parse close frame response correctly when reason present (#354)
  - Fix SSL: SSLV3_ALERT_HANDSHAKE_FAILURE on Debian Stretch (#353)
  - Wrap socket.gaierror with subclass of WebsocketException (#352)
  - Resolve a proxy issue and a connection error (#345)
  - Allow empty Host header value (#369)
  - Fix undefined variable (#347)
  - fix: getting a value with the key 'ca_certs' in sslopt dict (#326)

- 0.44.0

  -renames key in sslopt dict (#326)

- 0.43.0

  - Unknown kwarg 'ca_cert' when calling ssl wrap_socket() (#326)
  - Race condition in WebSocket ping/pong (#327)

- 0.42.0

  - Implement simple cookie jar(#292)
  - fix: when using pppoe redial will block.(#301)
  - Fix insecure_pythons list in setup.py(#304)
  - Support WEBSOCKET_CLIENT_CA_BUNDLE being directory(#307)
  - WebSocketPayloadException under high traffic and limited network connection(#306)
  - Not working --nocert parameter in wsdump.py(#315)
  - Avoid the app to block on close on certain systems (#320)
  - Fix warning is not defined. (#323)

- 0.41.0

  - move to repository to https://github.com/websocket-client/websocket-client.git
  - _send_ping warning fails due to missing reference in _logging.__all__ (#294)

- 0.40.0
  - Fix opcode -> op_code (#286)

- 0.39.0
  - Shuffled around example code (#256)
  - _send_ping graceful error handling (#262)
  - Allow closing WebSocketApp with status/reason/timeout (#265)
  - Support universal wheels (#267)
  - _url: Added subnet IP address matching in no_proxy host detection (#270)
  - fixed Incorrect encoding in continued messages python3 (#261)
  - Pass headers for websocket handshake (#271)
  - setup.py: Import `logging` before calling it. (#272)
  - Implemented close code 1014 (#273)
  - Support CA bundle specified by environment variable (#279)
  - Response header values should not be converted to lower case (#264)

- 0.38.0
  - Exclude port 443 from host http header (#248)
  - Cleanup code (#249)
  - Modify a code block directive in README (#250)
  - fixed ping/pong timeouet (#253)

- 0.37.0
  - fixed failure that `websocket.create_connection` does not accept `origin` as a parameter (#246 )

- 0.36.0
  - added support for using custom connection class (#235)
  - use Named logger (#238)
  - implement ping/pong timeout (#241)
  - Corrects the syntax highlight code (#243)
  - fixed failure to join thread before it is started (#242)

- 0.35.0
  - Prints timings in console (#217)
  - use inspect.getfullargspec with Python 3.x (#219)
  - Check that exception message is actually a string before trying for substring check (#224)
  - Use pre-initialized stream socket (#226)
  - fixed TypeError: cafile, capath and cadata cannot be all omitted (#227)

- 0.34.0

  - Change import style (#203)
  - fix attribute error on the older python. (#215)

- 0.33.0

  - fixed timeout+ssl error handling bug  on python 2.7.10 (#190)
  - add proxy support to wsdump.py (#194)
  - use wsaccel if available (#193)
  - add support for ssl cert chains to support client certs (#195)
  - fix string formatting in exception (#196)
  - fix typo in README.rst (#197)
  - introduce on_data callback to pass data type. (#198)
  - WebSocketBadStatusException for Handshake error (#199)
  - set close timeout (#192)
  - Map dict to headers list (#204)
  - support client certification (#207)
  - security improvement during handshake (#211)
  - improve logging of error from callback (#212)

- 0.32.0

  - fix http proxy bug (#189)

- 0.31.0

  - Avoid deprecated BaseException.message (#180)
  - Add travis builds (#182)
  - fixed wsdump to work with piped input (#183)
  - fixed output of wsdump.py with python3 (#185)
  - add raw mode to wsdump.py (#186)

- 0.30.0

  - fixed if client is behind proxy (#169)
  - support SNI for python 2.7.9+ and 3.2+ (#172)
  - update Host HTTP header by user. (#171)
  - fix typo for isEnabledFor (#173)
  - can set verify_mode to CERT_NONE when check_hostname is enabled.(#175)
  - make websockets iterable (#178)

- 0.29.0

  - fixed ssl socket bug

- 0.28.0

  - Fix erroneous argument shadowing(#168)

- 0.27.0

  - remove unittest2 requirements for python 2.6 (#156)
  - fixed subprotocol case during header validation (#158)
  - get response status and headers (#160)
  - fix out-of-memory due to fragmentation when receiving a very large frame(#163)
  - fix error if the payload data is nothing.(#166)
  - refactoring.

- 0.26.0

  - all WebSocketException provide message string (#152)
  - fixed tests fail when not connected to the network (#155)
  - Add command line options and handle closed socket to wsdump.py (#153)

- 0.25.0

  - fixed for Python 2.6(#151)

- 0.24.0

  - Supporting http-basic auth in WebSocketApp (#143)
  - fix failure of test.testInternalRecvStrict(#141)
  - skip utf8 validation by skip_utf8_validation argument (#137)
  - WebsocketProxyException will be raised if we got error about proxy.(#138)

- 0.23.0

  - Remove spurious print statement. (#135)

- 0.22.0

  - Fix not thread-safe of Websocket.close() (#120)
  - Try to get proxy info from environment if not explicitly provided (#124)
  - support proxy basic authentication. (#125)
  - Fix NoneType exception at WebsocketApp.send (#126)
  - not use proxy for localhost (#132)

- 0.21.0

  - Check for socket before attempting to close (#115)
  - Enable turning off SSL verification in wsdump.py(#116)
  - Enable to set subprotocol(#118)
  - Better support for Autobahn test suite (http://autobahn.ws/testsuite) (#117)

- v0.20.0

  - fix typo.

- v0.19.0

  - suppress close event message(#107)
  - detect socket connection state(#109)
  - support for code and reason in on_close callback(#111)
  - continuation frame handling seems suspicious(#113)

- v0.18.0

  -  allow override of match_hostname usage on ssl (#105)

- v0.17.0

  - can't set timeout on a standing websocket connection (#102)
  - fixed local variable 'error' referenced before assignment (#102, #98)

- v0.16.0

  - lock some method for multithread. (#92)
  - disable cert verification. (#89)

- v0.15.0

  - fixed exception when send a large message (#84)

- v0.14.1

  - fixed to work on Python2.6 (#83)

- v0.14.0

  - Support python 3(#73)
  - Support IPv6(#77)
  - Support explicit web proxy(#57)
  - specify cookie in connect method option(#82)

- v0.13.0

  - MemoryError when receiving large amount of data (~60 MB) at once(ISSUE#59)
  - Controlling fragmentation(ISSUE#55)
  - server certificate validation(ISSUE#56)
  - PyPI tarball is missing test_websocket.py(ISSUE#65)
  - Payload length encoding bug(ISSUE#58)
  - disable Nagle algorithm by default(ISSUE#41)
  - Better event loop in WebSocketApp(ISSUE#63)
  - Skip tests that require Internet access by default(ISSUE#66)

- v0.12.0

  - support keep alive for WebSocketApp(ISSUE#34)
  - fix some SSL bugs(ISSUE#35, #36)
  - fix "Timing out leaves websocket library in bad state"(ISSUE#37)
  - fix "WebSocketApp.run_with_no_err() silently eats all exceptions"(ISSUE#38)
  - WebSocketTimeoutException will be raised for ws/wss timeout(ISSUE#40)
  - improve wsdump message(ISSUE#42)
  - support fragmentation message(ISSUE#43)
  - fix some bugs

- v0.11.0

  - Only log non-normal close status(ISSUE#31)
  - Fix default Origin isn't URI(ISSUE#32)
  - fileno support(ISSUE#33)

- v0.10.0

  - allow to set HTTP Header to WebSocketApp(ISSUE#27)
  - fix typo in pydoc(ISSUE#28)
  - Passing a socketopt flag to the websocket constructor(ISSUE#29)
  - websocket.send fails with long data(ISSUE#30)


- v0.9.0

  - allow to set opcode in WebSocketApp.send(ISSUE#25)
  - allow to modify Origin(ISSUE#26)

- v0.8.0

  - many bug fix
  - some performance improvement

- v0.7.0

  - fixed problem to read long data.(ISSUE#12)
  - fix buffer size boundary violation

- v0.6.0

  - Patches: UUID4, self.keep_running, mask_key (ISSUE#11)
  - add wsdump.py tool

- v0.5.2

  - fix Echo App Demo Throw Error: 'NoneType' object has no attribute 'opcode  (ISSUE#10)

- v0.5.1

  - delete invalid print statement.

- v0.5.0

  - support hybi-13 protocol.

- v0.4.1

  - fix incorrect custom header order(ISSUE#1)
