===========================
Features
--------
- The --port/--https arguments to web plugin are now deprecated, in favor of
--listen. The --listen argument can be given multiple times to listen on
multiple ports. (6670)
- Twisted now requires zope.interface 4.4.2 or higher across all platforms and
Python versions. (8149)
- The osx_platform setuptools extra has been renamed to macos_platform, with
the former name being a compatibility alias. (8848)
- Zsh completions are now provided for the twist command. (9338)
- twisted.internet.endpoints.HostnameEndpoint now has a __repr__ method which
includes the host and port to which the endpoint connects. (9341)
Bugfixes
--------
- twistd now uses the UID's default GID to initialize groups when --uid is
given but --gid is not. This prevents an unhandled TypeError from being
raised when os.initgroups() is called. (4442)
- twisted.protocols.basic.LineReceiver checks received lines' lengths against
its MAX_LENGTH only after receiving a complete delimiter. A line ending in a
multi-byte delimiter like '\r\n' might be split by the network, with the
first part arriving before the rest; previously, LineReceiver erroneously
disconnected if the first part, e.g. 'zzzz....\r' exceeded MAX_LENGTH.
LineReceiver now checks received data against MAX_LENGTH plus the delimiter's
length, allowing short reads to complete a line. (6556)
- twisted.protocols.basic.LineOnlyReceiver disconnects the transport after
receiving a line that exceeds MAX_LENGTH, like LineReceiver. (6557)
- twisted.web.http.Request.getClientIP now returns the host part of the
client's address when connected over IPv6. (7704)
- twisted.application.service.IService is now documented as requiring the
'running', 'name' and 'parent' attributes (the documentation previously
implied they were required, but was unclear). (7922)
- twisted.web.wsgi.WSGIResource no longer raises an exception when a client
connects over IPv6. (8241)
- When using TLS enable automatic ECDH curve selection on OpenSSL 1.0.2+
instead of only supporting P-256 (9210)
- twisted.trial._dist.worker and twisted.trial._dist.workertrial consistently
pass bytes, not unicode to AMP. This fixes "trial -j" on Python 3. (9264)
- twisted.trial.runner now uses the 'importlib' module instead of the 'imp'
module on Python 3+. This eliminates DeprecationWarnings caused by importing
'imp' on Python 3. (9275)
- twisted.web.client.HTTP11ClientProtocol now closes the connection when the
server is sending a header line which is longer than he line limit of
twisted.protocols.basic.LineReceiver.MAX_LENGTH. (9295)
- twisted.python.failure now handles long stacktraces better; in particular it
will log tracebacks for stack overflow errors. (9301)
- The "--_shell-completion" argument to twistd now works on Python 3. (9303)
- twisted.python.failure.Failure now raises the wrapped exception in Python3,
and self (Failure) n Python2 when trap() is called without a matching
exception (9307)
- Writing large amounts of data no longer implies repeated, expensive copying
under Python 3. Python 3's write speeds are now as fast as Python 2's.
(9324)
- twisted.protocols.postfix now properly encodes errors which are unicode
strings to bytes. (9335)
- twisted.protocols.policies.ProtocolWrapper and
twisted.protocols.tls.TLSMemoryBIOProtocol no longer create circular
references that keep protocol instances in memory after connection is closed.
(9374)
- twisted.conch.ssh.transport.SSHTransportBase no longer strips trailing spaces
from the SSH version string of the connected peer. (9377)
- `trial -j` no longer crashes on Python 2 on test failure messages containing
non-ASCII bytes. (9378)
- RSA keys replaced with 2048bit ones in twisted.conch.test.keydata in order to
be compatible with OpenSSH 7.6. (9388)
- AsyncioSelectorReactor uses the global policy's event loop. asyncio libraries
that retrieve the running event loop with get_event_loop() will now receive
the one used by AsyncioSelectorReactor. (9390)
Improved Documentation
----------------------
- public attributes of `twisted.logger.Logger` are now documented as
attributes. (8157)
- List indentation formatting errors have been corrected throughout the
documentation. (9256)
Deprecations and Removals
-------------------------
- twisted.protocols.basic.LineOnlyReceiver.lineLengthExceeded no longer returns
twisted.internet.error.ConnectionLost. It instead directly disconnects the
transport and returns None. (6557)
- twisted.python.win32.getProgramsMenuPath and
twisted.python.win32.getProgramFilesPath were deprecated in Twisted 15.3.0
and have now been removed. (9312)
- Python 3.3 is no longer supported. (9352)
Misc
----
- 7033, 8887, 9204, 9289, 9291, 9292, 9293, 9302, 9336, 9355, 9356,
9364, 9375, 9381, 9382, 9389, 9391, 9393, 9394, 9396
Conch
-----
Bugfixes
~~~~~~~~
- twisted.plugins.cred_unix now properly converts a username and password from
bytes to str on Python 3. In addition, passwords which are encrypted with
SHA512 and SH256 are properly verified. This fixes running a conch server
with: "twistd -n conch -d /etc/ssh/ --auth=unix". (9130)
- In twisted.conch.scripts.conch, on Python 3 do not write bytes directly to
sys.stderr. On Python 3, this fixes remote SSH execution of a command which
fails. (9344)
Deprecations and Removals
~~~~~~~~~~~~~~~~~~~~~~~~~
- twisted.conch.ssh.filetransfer.FileTransferClient.wasAFile attribute has been
removed as it serves no purpose. (9362)
- Removed deprecated support for PyCrypto key objects in conch (9368)
Web
---
Features
~~~~~~~~
- The new twisted.iweb.IRequest.getClientAddress returns the IAddress provider
representing the client's address. Callers should check the type of the
returned value before using it. (7707)
- Eliminate use of twisted.python.log in twisted.web modules. (9280)
Bugfixes
~~~~~~~~
- Scripts ending with .rpy, .epy, and .cgi now execute properly in Twisted Web
on Python 3. (9271)
- twisted.web.http.Request and twisted.web.server.Request are once again
hashable on Python 2, fixing a regression introduced in Twisted 17.5.0.
(9314)
Improved Documentation
~~~~~~~~~~~~~~~~~~~~~~
- Correct reactor docstrings for twisted.web.client.Agent and
twisted.web.client._StandardEndpointFactory to communicate interface
requirements since 17.1. (9274)
- The examples for the "Twisted Web in 60 Seconds" tutorial have been fixed to
work on Python 3. (9285)
Deprecations and Removals
~~~~~~~~~~~~~~~~~~~~~~~~~
- twisted.iweb.IRequest.getClientIP is deprecated. Use
twisted.iweb.IRequest.getClientAddress instead (see 7707). (7705)
- twisted.web.iweb.IRequest.getClient and its implementations (deprecated in
2552) have been removed. (9395)
Mail
----
Bugfixes
~~~~~~~~
- twistd.mail.scripts.mailmail has been ported to Python 3. (8487)
- twisted.mail.bounce now works on Python 3. (9260)
- twisted.mail.pop3 and twisted.mail.pop3client now work on Python 3. (9269)
- SMTP authentication in twisted.mail.smtp now works better on Python 3, due to
improved improved bytes vs unicode handling. (9299)
Misc
~~~~
- 9310
Words
-----
No significant changes.
Names
-----
No significant changes.