1Ticket numbers in this file can be looked up by visiting
2http://twistedmatrix.com/trac/ticket/<number>
3
4.. towncrier release notes start
5
6Twisted 22.1.0 (2022-02-03)
7===========================
8
9Features
10--------
11
12- Python 3.10 is now a supported platform (#10224)
13- Type annotations have been added to the twisted.python.fakepwd module. (#10287)
14
15
16Bugfixes
17--------
18
19- twisted.internet.defer.inlineCallbacks has an improved type annotation, to avoid typing errors when it is used on a function which returns a non-None result. (#10231)
20- ``twisted.internet.base.DelayedCall.__repr__`` and ``twisted.internet.task.LoopingCall.__repr__`` had the changes from #10155 reverted to accept non-function callables.  (#10235)
21- Revert the removal of .whl building that was done as part of #10177. (#10236)
22- The type annotation of the host parameter to twisted.internet.interfaces.IReactorTCP.connectTCP has been corrected from bytes to str. (#10251)
23- Deprecated ``twisted.python.threading.ThreadPool.currentThread()`` in favor of ``threading.current_thread()``.
24  Switched ``twisted.python.threading.ThreadPool.currentThread()`` and ``twisted.python.threadable.getThreadID()`` to use `threading.current_thread()`` to avoid the deprecation warnings introduced for ``threading.currentThread()`` in Python 3.10. (#10273)
25
26
27Improved Documentation
28----------------------
29
30- twisted.internet.utils.runWithWarningsSupressed behavior of waiting on deferreds has been documented. (#10238)
31- Sync API docs templates with pydoctor 21.9.0 release, using new theming capabilities. (#10267)
32
33
34Misc
35----
36
37- #1681, #9944, #10198, #10218, #10219, #10228, #10229, #10234, #10239, #10240, #10245, #10246, #10248, #10250, #10255, #10277, #10288, #10292
38
39
40Conch
41-----
42
43Bugfixes
44--------
45
46- SSHTransportBase.ssh_KEXINIT now uses the remote peer preferred MAC list for negotiation. In previous versions  it was only using the local preferred MAC list. (#10241)
47
48
49Features
50~~~~~~~~
51
52- twisted.conch.ssh now supports SSH extension negotiation (RFC 8308). (#10266)
53
54
55Bugfixes
56~~~~~~~~
57
58- twisted.conch now uses constant-time comparisons for MACs. (#8199)
59- twisted.conch.ssh.filetransfer.FileTransferServer will now return an ENOENT error status if an SFTP client tries to close an unrecognized file handle. (#10293)
60
61
62Web
63---
64
65Bugfixes
66~~~~~~~~
67
68- twisted.web.client.RedirectAgent and twisted.web.client.BrowserLikeRedirectAgent now properly remove sensitive headers when redirecting to a different origin. (#10294)
69
70
71Improved Documentation
72----------------------
73
74- Add type annotations for twisted.web.client.readBody. (#10269)
75
76
77Deprecations and Removals
78~~~~~~~~~~~~~~~~~~~~~~~~~
79
80- twisted.web.client.getPage, twisted.web.client.downladPage, and the associated implementation classes (HTTPPageGetter, HTTPPageDownloader, HTTPClientFactory, HTTPDownloader) have been removed because they do not segregate cookies by domain. They were deprecated in Twisted 16.7.0 in favor of twisted.web.client.Agent. GHSA-92x2-jw7w-xvvx. (#10295)
81
82
83Mail
84----
85
86No significant changes.
87
88
89Words
90-----
91
92No significant changes.
93
94
95Names
96-----
97
98No significant changes.
99
100
101Trial
102-----
103
104Bugfixes
105~~~~~~~~
106
107- trial.runner.filenameToModule now sets the correct module.__name__ and sys.modules key (#10230)
108
109
110Twisted 21.7.0 (2021-07-26)
111===========================
112
113
114Features
115--------
116
117- Python 3.10b3 is now supported (#10224)
118- Type hinting was added to twisted.internet.defer, making this is the first release
119  of Twisted where you might reasonably be able to use mypy without your own custom
120  stub files (#10017)
121
122
123Bugfixes
124--------
125
126- The changes to ``DelayedCall.__repr__`` and ``LoopingCall.__repr__`` from
127  21.7.0.rc1 were reverted as the wrong assumption that ``__qualname__`` is
128  available on all the supported Python versions.
129  (#10235)
130- The automated release process was updated to generate and release wheel files
131  to PyPI (#10236)
132- twisted.internet.defer.inlineCallbacks has an improved type annotation, to avoid typing errors when it is used on a function which returns a non-None result. (#10231)
133- trial.runner.filenameToModule now sets the correct ``module.__name__`` and ``sys.modules`` key (#10230)
134- twisted.internet.process can now pause and resume producing in python 3 (#9933)
135- When installing Twisted it now requires a minimum Python 3.6.7 version to match the version used with automated testing. This is the minimum Python version that we know that Twisted works with. (#10098)
136- twisted.internet.asyncioreactor.AsyncioSelectorReactor will no longer raise a TypeError like "SelectorEventLoop required, instead got: <uvloop.Loop ...>" (broken since 21.2.0). (#10106)
137- twisted.web.template.flatten and flattenString will no longer raise RecursionError if a large number of synchronous Deferreds are included in a document. (#10125)
138- Fix type hint for http.Request.uri (from str to bytes). (#10139)
139- twisted.web.http_headers.getRawHeaders and twisted.web.http_headers.getAllRawHeaders are now typed to return immutable sequences of header values instead of lists.
140  twisted.web.http_headers.getRawHeaders is now typed to return a non-optional value if a non-None default value is given. (#10142)
141- Fixed type hint for addr argument to twisted.internet.interfaces.buildProtocol. (#10147)
142- twisted.trial._dist.worker.LocalWorker.connectionMade now always writes the
143  log file using UTF-8 encoding.
144  In previous versions it was using the system default encoding.
145  This was causing encoding errors as the distributed trial workers are sending
146  Unicode data and the system default encoding might not always be Unicode compatible.
147  For example, it can be CP1252 on Windows. (#10157)
148- twisted.words.protocols.irc.ctcpExtract was updated to work with PYPY 3.7.4. (#10189)
149- twisted.conch.ssh.transport.SSHServerTransport and twisted.conch.ssh.transport.SSHClientTransport no longer use the hardcoded
150  SHA1 digest for non-group key exchanges. (#10203)
151- haproxy transport wrapper now returns hosts of type str for getPeer() and getHost(), as specified by IPv4Address and IPv6Address documentation. Previously it was returning bytes for the host. (#10211)
152
153
154Improved Documentation
155----------------------
156
157- Remove dead link in twisted.internet._dumbwin32proc module docstring (#9520)
158- Sync API docs templates with pydoctor 21.2.2 release. (#10105)
159- Twisted IRC channels are now hosted by Libera.Chat. (#10213)
160
161
162Deprecations and Removals
163-------------------------
164
165- Python 3.5 is no longer supported. (#9958)
166
167
168Misc
169----
170
171- #9816, #9915, #10068, #10085, #10094, #10102, #10107, #10108, #10109, #10110, #10112, #10119, #10120, #10121, #10122, #10123, #10140, #10143, #10145, #10150, #10151, #10155, #10159, #10168, #10169, #10171, #10172, #10173, #10174, #10179, #10194, #10201, #10212, #10215, #10217, #11017
172
173
174Conch
175-----
176
177Misc
178~~~~
179
180- #10097
181
182
183Web
184---
185
186Features
187~~~~~~~~
188
189- twisted.web.template.renderElement() now accepts any IRequest implementer instead of only twisted.web.server.Request.
190  Add type hints to twisted.web.template. (#10184)
191
192
193Bugfixes
194~~~~~~~~
195
196- The server-side HTTP/1.1 chunking implementation no longer performs quadratic work when input arrives in small chunks, preventing CPU exhaustion. (#3795)
197- twisted.web.http's chunked encoding support now rejects chunk sizes that are invalid because they look like negative hexadecimal integers. (#10130)
198- The type hint of twisted.web.server.Request.postpath is now correctly listed as Optional[List[bytes]]. This was incorrect in Twisted v21.2.0. (#10136)
199- The server-side HTTP/1.1 chunking implementation now rejects invalid chunk boundaries, preventing unbounded buffering. (#10137)
200- The server-side HTTP/1.1 chunking implementation now limits the length of the chunk size line (which includes chunk extensions) to twisted.web.http.maxChunkSizeLineLength — 1 KiB — so that it may not consume an unbounded amount of memory. (#10144)
201- Calling twisted.web.server.Site now registers its expiration timeout using the reactor associated with its twisted.web.server.Site. Site now a reactor attribute via its superclass, twisted.web.http.HTTPFactory. (#10177)
202
203
204Misc
205~~~~
206
207- #9659, #10100, #10154, #10186
208
209
210Mail
211----
212
213No significant changes.
214
215
216Words
217-----
218
219No significant changes.
220
221
222Names
223-----
224
225No significant changes.
226
227
228Twisted 21.2.0 (2021-02-28)
229===========================
230
231Features
232--------
233
234- The enableSessions argument to twisted.internet.ssl.CertificateOptions now
235  actually enables/disables OpenSSL's session cache.  Also, due to
236  session-related bugs, it defaults to False. (#9583)
237- twisted.internet.defer.inlineCallbacks and ensureDeferred will now associate a contextvars.Context with the coroutines they run, meaning that ContextVar objects will maintain their value within the same coroutine, similarly to asyncio Tasks. This functionality requires Python 3.7+, or the contextvars PyPI backport to be installed for Python 3.5-3.6. (#9719, #9826)
238- twisted.internet.defer.Deferred.fromCoroutine has been added. This is similar to the existing ensureDeferred function, but is named more consistently inside Twisted and does not pass through Deferreds. (#9825)
239- trial now allows the @unittest.skipIf decorator to specify that an entire test class should be skipped. (#9829)
240- The twisted.python.deprecate.deprecatedKeywordParameter decorator can be used to mark a keyword paramater of a function or method as deprecated. (#9844)
241- Projects using Twisted can now perform type checking against a Twisted
242  installation, for example using mypy. (#9908)
243- twisted.python.util.InsensitiveDict now fully implements MutableMapping. (#9919)
244- Python 3.8 is now tested and supported. (#9955)
245- Support a coroutine function in twisted.internet.task.react (#9974)
246- PyPy 3.7 is now tested and supported. (#10093)
247
248
249Bugfixes
250--------
251
252- twisted.web.twcgi.CGIProcessProtocol.processEnded(...) now handles an already-finished request, for example when request.connectionLost(...) was called previously. (#9468)
253- Twisted's dependency on PyHamcrest has been moved from the base package to the new "test" extra. Consequently the test extra must be installed for Twisted's test suite to pass. (#9509)
254- Fixed serialization of timedelta, date, and time objects in twisted.spread. (#9716)
255- twisted.internet.asyncioreactor.AsyncioSelectorReactor now raises an exception if instantiated with an event loop which is not compatible with asyncio.SelectorEventLoop. This fixes the AsyncioSelectorReactor in Python 3.8+ on Windows, where in bp-34687 the default Windows asyncio event loop was changed to ProactorEventLoop.  Applications that use AsyncioSelectorReactor on Windows with Python 3.8+ must call asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) before instantiating and running AsyncioSelectorReactor. (#9766)
256- twisted.internet.process.registerReapProcessHandler and ._BaseProcess.reapProcess will no longer raise a TypeError when processing a None PID (#9775)
257- INotify will close its file descriptor if a directory is automatically removed by twisted from the watchlist because it's deleted, avoiding orphaned filedescriptors. (#9777)
258- DelayedCall.reset() is now working properly with asyncioreactor (#9780)
259- AsyncioSelectorReactor.seconds() now correctly returns an epoch time. (#9787)
260- The _connDone parameter has been removed from twisted.internet.abstract.FileDescriptor.loseConnection()'s signature in order to match the signature in the base class twisted.internet._newtls.ConnectionMixin loseConnection(). (#9849)
261- The Gtk3 reactor now runs on Wayland-only sessions (#9904)
262- Descriptive error messages from twisted.internet.error are now present when running with 'python -OO'. (#9918)
263- Comparator methods such as __eq__() now always return NotImplemented for uncomparable types. (#9919)
264- When installing Twisted it now requires a minimum Python 3.5.4 version to match the version used with automated testing. This is the minimum Python version that we know that Twisted works with. (#10098)
265
266
267Improved Documentation
268----------------------
269
270- The narrative docs now contains the associated Twisted version and the date
271  when they were generated. (#3945)
272- The "Writing a twistd plugin" howto now explains how to deploy twistd plugins using Python packaging and pip (#9243)
273-  (#9868, #9873, #9874)
274- Fix a typo in "Introduction to Deferreds" document. (#9948)
275- The Twisted Coding Standard has been changed to refer to The Black code style for guidelines regarding whitespace and line lengths. (#9957)
276- Exempt ``__repr__``, ``__slots__`` and other ``@attrs.define`` related changes from compatibility policy. (#9982)
277- Fix many docstring mistakes flagged by new sanity checks in pydoctor. (#10021)
278- Fix a few dozen broken links to API documentation pages. (#10057)
279
280
281Deprecations and Removals
282-------------------------
283
284- twisted.cred.credentials.UsernameHashedPassword is now deprecated because it doesn't hash the password, causing it to return the wrong result. (#8368)
285- twisted.news is now removed from the codebase. (This module was never installed on Python 3.) (#9782)
286- Support for Python 2.7 has been removed. Twisted now supports only Python versions 3.5/3.6/3.7. (#9790)
287- twisted.pair.ethernet.IEthernetProtocol.addProto()'s interface was changed to match the existing implementations in the Twisted source code. (#9877)
288- twisted.python.filepath.FilePath.statinfo was deprecated in Twisted 15.0.0 and has now been removed. (#9881)
289- The parameters to twisted.internet.base.ReactorBase.addSystemEventTrigger(), twisted.internet.base.ReactorBase.callWhenRunning(), twisted.internet.base.ReactorBase.callLater(), twisted.internet.task.Clock.callLater() have been renamed to match the parameters defined in the following interfaces: twisted.internet.interfaces.IReactorCore, twisted.internet.interfaces.IReactorTime. (#9897)
290- Functions and types in twisted.python.compat that existed to support the transition from Python 2 to 3 have been deprecated. (#9922)
291- twisted.logger.LoggingFile.softspace has been deprecated. (#10042)
292- twisted.python.win32.WindowsError and FakeWindowsError have been deprecated. (#10053)
293- twisted.mail.pop3client has been renamed to twisted.mail._pop3client, since it has always been a private implementation module. (#10054)
294
295
296Misc
297----
298
299- #5356, #6460, #6903, #6986, #7945, #9306, #9512, #9531, #9622, #9652, #9718, #9744, #9768, #9773, #9776, #9778, #9781, #9784, #9785, #9788, #9789, #9791, #9793, #9795, #9796, #9797, #9798, #9800, #9802, #9803, #9808, #9809, #9810, #9811, #9812, #9820, #9823, #9827, #9833, #9837, #9840, #9842, #9846, #9847, #9848, #9850, #9851, #9852, #9854, #9855, #9856, #9857, #9858, #9861, #9862, #9863, #9864, #9865, #9866, #9867, #9869, #9870, #9871, #9872, #9876, #9878, #9879, #9880, #9882, #9883, #9884, #9886, #9889, #9890, #9891, #9892, #9895, #9896, #9898, #9899, #9902, #9903, #9916, #9917, #9921, #9924, #9927, #9928, #9936, #9953, #9954, #9956, #9959, #9960, #9969, #9970, #9971, #9975, #9976, #9977, #9978, #9979, #9980, #9981, #9983, #9985, #9986, #9987, #9988, #9989, #9991, #9992, #9995, #9999, #10000, #10002, #10009, #10010, #10011, #10014, #10015, #10018, #10025, #10027, #10029, #10032, #10033, #10034, #10036, #10038, #10043, #10044, #10046, #10054, #10059, #10060, #10061, #10063, #10064, #10065, #10069, #10080, #10090
300
301
302Conch
303-----
304
305Features
306~~~~~~~~
307
308- twisted.conch.ssh now supports Ed25519 keys (requires OpenSSL >= 1.1.1b). (#8966)
309- twisted.conch.ssh.session.SSHSession can now accept environment variables sent by the client, if the SSH avatar implements the new ISessionSetEnv interface. (#9315)
310- twisted.conch.ssh.keys.Key.fromString and twisted.conch.ssh.keys.Key.toString now normalize Unicode passphrases as required by NIST 800-63B. (#9736)
311- twisted.conch.telnet now implements EOR (End of Record) command (RFC 885) (#9875)
312
313
314Bugfixes
315~~~~~~~~
316
317- t.c.ssh.filetransfer.FileTransferClient now errbacks any outstanding requests if the connection is lost before a reply is received. (#9571)
318- t.c.ssh.filetransfer.FileTransferClient immediately errbacks any attempt to send a request on a closed channel. (#9572)
319- twisted.conch.ssh.session.SSHSession now accepts environment variables also for multiplexed SSH session. (#10016)
320
321
322Improved Documentation
323~~~~~~~~~~~~~~~~~~~~~~
324
325- construct and assign portal and checkers consistently in ssh server example (#9578)
326
327
328Misc
329~~~~
330
331- #6446, #9571, #9831, #9913
332
333
334Web
335---
336
337Bugfixes
338~~~~~~~~
339
340- twisted.web.http.Request.getRequestHostname now supports IPv6 literal hostnames
341  in HTTP host headers. (#6014)
342- Fixed unexpected exception by handling subclass of TaskFinished when FileBodyProducer's task stopped twice. (#6528)
343- Importing twisted.web.client no longer has the side effect of initializing the reactor. (#9774)
344- Ensure that all calls to connectionLost use a Failure instance in the HTTP 2 code. (#9817)
345- twisted.web.util.ParentRedirect has been fixed and documented. It was broken by a security fix in Twisted 19.2.0. (#9835)
346- xmlrpc's Proxy class now verifies HTTPS certificates against the system bundle. (#9836)
347- twisted.web.twcgi can now handle url parameters in python 3 (#9887)
348- defer reactor import in twisted.web.xmlrpc (#9931)
349- twisted.web.RedirectAgent now supports 308 redirects (#9940)
350- Fixed an error where twisted.web.http.requestReceived() tries to encode a NoneType returned by cgi.parse_multipart when a multipart body does not contain a "content-disposition" definition. (#10084)
351
352
353Improved Documentation
354~~~~~~~~~~~~~~~~~~~~~~
355
356- xmlrpc's QueryFactory class is now public, more explanation for xmlrpc's queryFactory, and new xmlrpc-debug.py example script for debugging raw XML-RPC traffic. (#9350)
357- twisted.web.client.ContentDecoderAgent's documentation has been corrected and improved. (#9742)
358
359
360Misc
361~~~~
362
363- #6446, #9758, #9801, #9831, #9834, #9841
364
365
366Mail
367----
368
369Bugfixes
370~~~~~~~~
371
372- twisted.mail.smtp.ESMTPSender no longer forces TLSv1.0 when used without explicit context factory. (#9740)
373
374
375Misc
376~~~~
377
378- #6446, #9831, #9832, #9900, #9910
379
380
381Words
382-----
383
384Misc
385~~~~
386
387- #9901
388
389
390Names
391-----
392
393Features
394~~~~~~~~
395
396- twisted.names.hosts.Resolver and twisted.names.hosts.searchFileForAll() now ignore malformed lines in hosts files like /etc/hosts (#9752)
397- New interface IEncodableRecord combines IEncodable and IRecord, which is useful when using type annotations. (#9920)
398
399
400Bugfixes
401~~~~~~~~
402
403- twistd -n dns --pyzone example-domain.com will no longer throw an exception on startup with Python 3. (#9783)
404- twist dns --pyzone example-domain.com now works on Python 3. (#9786)
405
406
407Misc
408~~~~
409
410- #9749
411
412
413Twisted 20.3.0 (2020-03-13)
414===========================
415
416Bugfixes
417--------
418
419- twisted.protocols.amp.BoxDispatcher.callRemote and callRemoteString will no longer return failing Deferreds for requiresAnswer=False commands when the transport they're operating on has been disconnected. (#9756)
420
421
422Improved Documentation
423----------------------
424
425- Added a missing hyphen to a reference to the ``--debug`` option of ``pdb`` in the Trial how-to. (#9690)
426- The documentation of the twisted.cred.checkers module has been extended and corrected. (#9724)
427
428
429Deprecations and Removals
430-------------------------
431
432- twisted.news is deprecated. (#9405)
433
434
435Misc
436----
437
438- #9634, #9701, #9707, #9710, #9715, #9726, #9727, #9728, #9729, #9735, #9737, #9757
439
440
441Conch
442-----
443
444Features
445~~~~~~~~
446
447- twisted.conch.ssh now supports the curve25519-sha256 key exchange algorithm (requires OpenSSL >= 1.1.0). (#6814)
448- twisted.conch.ssh.keys can now write private keys in the new "openssh-key-v1" format, introduced in OpenSSH 6.5 and made the default in OpenSSH 7.8.  ckeygen has a corresponding new --private-key-subtype=v1 option. (#9683)
449
450
451Bugfixes
452~~~~~~~~
453
454- twisted.conch.keys.Key.privateBlob now returns the correct blob format for ECDSA (i.e. the same as that implemented by OpenSSH). (#9682)
455
456
457Misc
458~~~~
459
460- #9760
461
462
463Web
464---
465
466Bugfixes
467~~~~~~~~
468
469- Fixed return type of twisted.web.http.Request.getUser and twisted.web.http.Request.getPassword to binary if no authorization header was found or an exception was thrown (#9596)
470- twisted.web.http.HTTPChannel now rejects requests (with status code 400 and a drop) that have malformed headers of the form "Foo : value" or ": value". (#9646)
471- twisted.web.http.Request now correctly parses multipart-encoded form data submitted as a chunked request on Python 3.7+. (#9678)
472- twisted.web.client.BrowserLikePolicyForHTTPS is now listed in __all__, since it's a user-facing class that anyone could import and extend. (#9769)
473- twisted.web.http was subject to several request smuggling attacks. Requests with multiple Content-Length headers were allowed (CVE-2020-10108, thanks to Jake Miller from Bishop Fox and ZeddYu Lu for reporting this) and now fail with a 400; requests with a Content-Length header and a Transfer-Encoding header honored the first header (CVE-2020-10109, thanks to Jake Miller from Bishop Fox for reporting this) and now fail with a 400; requests whose Transfer-Encoding header had a value other than "chunked" and "identity" (thanks to ZeddYu Lu) were allowed and now fail with a 400. (#9770)
474
475
476Mail
477----
478
479Misc
480~~~~
481
482- #9733
483
484
485Words
486-----
487
488Bugfixes
489~~~~~~~~
490
491- Fixed parsing of streams with Python 3.8 when there are spaces in namespaces or namespaced attributes in twisted.words.xish.domish.ExpatElementStream (#9730)
492
493
494Names
495-----
496
497Bugfixes
498~~~~~~~~
499
500- twisted.names.secondary.SecondaryAuthority now accepts str for its domain parameter, so twist dns --secondary now functions on Python 3. (#9496)
501
502
503Twisted 19.10.0 (2019-11-03)
504============================
505
506Features
507--------
508
509- twisted.trial.successResultOf, twisted.trial.failureResultOf, and
510  twisted.trial.assertNoResult accept coroutines as well as Deferreds. (#9006)
511
512
513Bugfixes
514--------
515
516- Fixed circular import in twisted.trial.reporter, introduced in Twisted 16.0.0. (#8267)
517- The POP3 server implemented by twisted.mail.pop3 now accepts passwords that contain spaces. (#9100)
518- Incoming HTTP/2 connections will now not time out if they persist for longer than one minute. (#9653)
519- The serial extra now requires pywin32 on Windows enabling use of twisted.internet.serialport without specifying the windows_platform extra. (#9700)
520
521
522Misc
523----
524
525- #8506, #9677, #9684, #9687, #9688
526
527
528Conch
529-----
530
531Bugfixes
532~~~~~~~~
533
534- twisted.conch.ssh.keys now correctly writes the "iqmp" parameter in serialized RSA private keys as q^-1 mod p rather than p^-1 mod q. (#9681)
535
536
537Misc
538~~~~
539
540- #9689
541
542
543Web
544---
545
546Features
547~~~~~~~~
548
549- twisted.web.server.Request will now use twisted.web.server.Site.getContentFile, if it exists, to get a file into which to write request content.  If getContentFile is not provided by the site, it will fall back to the previous behavior of using io.BytesIO for small requests and tempfile.TemporaryFile for large ones. (#9655)
550
551
552Bugfixes
553~~~~~~~~
554
555- twisted.web.client.FileBodyProducer will now stop producing when the Deferred returned by FileBodyProducer.startProducing is cancelled. (#9547)
556- The HTTP/2 server implementation now enforces TCP flow control on control frame messages and times out clients that send invalid data without reading responses.  This closes CVE-2019-9512 (Ping Flood), CVE-2019-9514 (Reset Flood), and CVE-2019-9515 (Settings Flood).  Thanks to Jonathan Looney and Piotr Sikora. (#9694)
557
558
559Mail
560----
561
562No significant changes.
563
564
565Words
566-----
567
568No significant changes.
569
570
571Names
572-----
573
574No significant changes.
575
576
577Twisted 19.7.0 (2019-07-28)
578===========================
579
580Features
581--------
582
583- The callable argument to twisted.internet.task.deferLater() is no longer required. (#9577)
584- Twisted's minimum Cryptography requirement is now 2.5. (#9592)
585- twisted.internet.utils.getProcessOutputAndValue now accepts `stdinBytes` to write to the child process's standard input. (#9607)
586- Add new twisted.logger.capturedLogs context manager for capturing observed log events in tests. (#9617)
587- twisted.internet.base.PluggableResolverMixin, which implements the pluggable resolver interfaces for easier re-use in other reactors, has been factored out of ReactorBase. (#9632)
588- The PyPI page for Twisted has been enhanced to include more information and useful links. (#9648)
589
590
591Bugfixes
592--------
593
594- twisted.internet.endpoints is now importable on Windows when pywin32 is not installed. (#6032)
595- twisted.conch.ssh now generates correct keys when using hmac-sha2-512 with SHA1 based KEX algorithms. (#8258)
596- twisted.internet.iocpreactor.abstract.FileHandle no longer duplicates/looses outgoing data when .write() is called in rapid succession with large payloads (#9446)
597- twisted.application.backoffPolicy will not fail on connection attempts > 1750 with default settings. (#9476)
598- Trial on Python 3 will now properly re-raise ImportErrors that occur during the import of a module, rather than saying the module doesn't exist. (#9628)
599- twisted.internet.process does not fail on import when the process has more than 1024 file descriptors opened. (#9636)
600- Add the stackLevel keyword argument to twisted.logger.STDLibLogObserver._findCaller to fix an incompatibility with Python 3.8. (#9668)
601
602
603Improved Documentation
604----------------------
605
606- Fix the incorrect docstring for twisted.python.components.Componentized.addComponent which stated that the function returned a list of interfaces, even though the function doesn't actually do so. (#9637)
607
608
609Deprecations and Removals
610-------------------------
611
612- twisted.test.proto_helpers has moved to twisted.internet.testing. twisted.test.proto_helpers has been deprecated. (#6435)
613- twisted.protocols.mice, deprecated since Twisted 16.0, has been removed. (#9602)
614- twisted.conch.insults.client and twisted.conch.insults.colors, deprecated since Twisted 10.1, have been removed. (#9603)
615- The __version__ attribute of Twisted submodules that were previously packaged separately, deprecated since Twisted 16.0, has been removed. (#9604)
616- Python 3.4 is no longer supported. (#9613)
617- twisted.python.compat.OrderedDict, an alias for collections.OrderedDict and deprecated since Twisted 15.5, has been removed. (#9639)
618
619
620Misc
621----
622
623- #9217, #9445, #9454, #9605, #9614, #9615, #9619, #9625, #9633, #9640, #9674
624
625
626Conch
627-----
628
629Bugfixes
630~~~~~~~~
631
632- t.c.ssh.connection.SSHConnection now fails channels that are in the process of opening when the connection is lost. (#2782)
633
634
635Misc
636~~~~
637
638- #9610
639
640
641Web
642---
643
644Features
645~~~~~~~~
646
647- twisted.web.tap, the module that is run by `twist web`, now accepts --display-tracebacks to render tracebacks on uncaught exceptions. (#9656)
648
649
650Bugfixes
651~~~~~~~~
652
653- twisted.web.http.Request.write after the channel is disconnected will no longer raise AttributeError. (#9410)
654- twisted.web.client.Agent.request() and twisted.web.client.ProxyAgent.request() now produce TypeError when the method argument is not bytes, rather than failing to generate the request. (#9643)
655- twisted.web.http.HTTPChannel no longer raises TypeError internally when receiving a line-folded HTTP header on Python 3. (#9644)
656- All HTTP clients in twisted.web.client now raise a ValueError when called with a method and/or URL that contain invalid characters.  This mitigates CVE-2019-12387.  Thanks to Alex Brasetvik for reporting this vulnerability. (#9647)
657- twisted.web.server.Site's instance variable displayTracebacks is now set to False by default. (#9656)
658
659
660Improved Documentation
661~~~~~~~~~~~~~~~~~~~~~~
662
663- twisted.web.iweb.IRequest's "prepath" and "postpath" attributes, which have existed for a long time, are now documented. (#5533)
664- The documented type of t.w.iweb.IRequest's "method" and "uri" attributes on Python 3 has been corrected to match the implementation. (#9091)
665- t.w.iweb.IRequest's "args" attribute is now correctly documented to be bytes. (#9458)
666- The API documentation of twisted.web.iweb.IRequest and twisted.web.http.Request has been updated and extended to match the implementation. (#9593)
667
668
669Deprecations and Removals
670~~~~~~~~~~~~~~~~~~~~~~~~~
671
672- Passing a path argument to twisted.web.resource.Resource.putChild which is not of type bytes is now deprecated.  In the future, passing a non-bytes argument to putChild will return an error. (#9135)
673- Passing --notracebacks/-n to twisted.web.tap, the module that is run by `twist web`, is now deprecated due to traceback rendering being disabled by default. (#9656)
674
675
676Misc
677~~~~
678
679- #9597
680
681
682Mail
683----
684
685No significant changes.
686
687
688Words
689-----
690
691Features
692~~~~~~~~
693
694- twisted.words.protocols.jabber.xmlstream.TLSInitiatingInitializer and twisted.words.protocols.jabber.client.XMPPClientFactory now take an optional configurationForTLS for customizing certificate options for StartTLS. (#9561)
695
696
697Bugfixes
698~~~~~~~~
699
700- twisted.words.protocols.jabber.xmlstream.TLSInitiatingInitializer now properly verifies the server's certificate against platform CAs and the stream's domain, mitigating CVE-2019-12855. (#9561)
701
702
703Names
704-----
705
706Bugfixes
707~~~~~~~~
708
709- twisted.names.client.Resolver will no longer infinite loop if it cannot bind a UDP port to use for resolving. (#9620)
710
711
712Twisted 19.2.0 (2019-04-07)
713===========================
714
715This is the final release that will support Python 3.4.
716
717Features
718--------
719
720- twisted.internet.ssl.CertificateOptions now uses 32 random bytes instead of an MD5 hash for the ssl session identifier context. (#9463)
721- DeferredLock and DeferredSemaphore can be used as asynchronous context
722  managers on Python 3.5+. (#9546)
723- t.i.b.BaseConnector has custom __repr__ (#9548)
724- twisted.internet.ssl.optionsForClientTLS now supports validating IP addresses from the certificate subjectAltName (#9585)
725- Twisted's minimum Cryptography requirement is now 2.5. (#9592)
726
727
728Bugfixes
729--------
730
731- twisted.web.proxy.ReverseProxyResource fixed documentation and example snippet (#9192)
732- twisted.python.failure.Failure.getTracebackObject now returns traceback objects whose frames can be passed into traceback.print_stack for better debugging of where the exception came from. (#9305)
733- twisted.internet.ssl.KeyPair.generate: No longer generate 1024-bit RSA keys by default. Anyone who generated a key with this method using the default value should move to replace it immediately. (#9453)
734- The message of twisted.internet.error.ConnectionAborted is no longer truncated. (#9522)
735- twisted.enterprise.adbapi.ConnectionPool.connect now logs only the dbapiName and not the connection arguments, which may contain credentials (#9544)
736- twisted.python.runtime.Platform.supportsINotify no longer considers the result of isDocker for its own result. (#9579)
737
738
739Improved Documentation
740----------------------
741
742- The documentation for the the twisted.internet.interfaces.IConsumer, IProducer, and IPullProducer interfaces is more detailed. (#2546)
743- The errback example in the docstring of twisted.logger.Logger.failure has been corrected. (#9334)
744- The sample code in the "Twisted Web In 60 Seconds" tutorial runs on Python 3. (#9559)
745
746
747Misc
748----
749
750- #8921, #9071, #9125, #9428, #9536, #9540, #9580
751
752
753Conch
754-----
755
756Features
757~~~~~~~~
758
759- twisted.conch.ssh.keys can now read private keys in the new "openssh-key-v1" format, introduced in OpenSSH 6.5 and made the default in OpenSSH 7.8. (#9515)
760
761
762Bugfixes
763~~~~~~~~
764
765- Conch now uses pyca/cryptography for Diffie-Hellman key generation and agreement. (#8831)
766
767
768Misc
769~~~~
770
771- #9584
772
773
774Web
775---
776
777Features
778~~~~~~~~
779
780- twisted.web.client.HostnameCachingHTTPSPolicy was added as a new contextFactory option.  The policy caches a specified number of twisted.internet.interfaces.IOpenSSLClientConnectionCreator instances to to avoid the cost of instantiating a connection creator for multiple requests to the same host. (#9138)
781
782
783Bugfixes
784~~~~~~~~
785
786- twisted.web.http.Request.cookies, twisted.web.http.HTTPChannel.writeHeaders, and twisted.web.http_headers.Headers were all vulnerable to header injection attacks.  They now replace linear whitespace ('\r', '\n', and '\r\n') with a single space.  twisted.web.http.Reqeuest.cookies also replaces semicolons (';') with a single space. (#9420)
787- twisted.web.client.Request and twisted.web.client.HTTPClient were both vulnerable to header injection attacks.  They now replace linear whitespace ('\r', '\n', and '\r\n') with a single space. (#9421)
788
789
790Mail
791----
792
793No significant changes.
794
795
796Words
797-----
798
799No significant changes.
800
801
802Names
803-----
804
805Features
806~~~~~~~~
807
808- twisted.names.dns now has IRecord implementations for the SSHFP and TSIG record types. (#9373)
809
810
811Twisted 18.9.0 (2018-10-10)
812===========================
813
814Features
815--------
816
817- twisted.internet._sslverify.ClientTLSOptions no longer raises IDNAError when given an IPv6 address as a hostname in a HTTPS URL. (#9433)
818- The repr() of a twisted.internet.base.DelayedCall now encodes the same information as its str(), exposing details of its scheduling and target callable. (#9481)
819- Python 3.7 is now supported. (#9502)
820
821
822Bugfixes
823--------
824
825- twisted.logger.LogBeginner's default critical observer now prints tracebacks for new and legacy log system events through the use of the new eventAsText API.  This API also does not raise an error for non-ascii encoded data in Python2, it attempts as well as possible to format the traceback. (#7927)
826- Syntax error under Python 3.7 fixed for twisted.conch.manhole and
827  twisted.main.imap4. (#9384)
828- `trial -j` reports tracebacks on test failures under Python 3. (#9436)
829- Properly format multi-byte and non-ascii encoded data in a traceback. (#9456)
830- twisted.python.rebuild now functions on Python 3.7. (#9492)
831- HTTP/2 server connections will no longer time out active downloads that take too long. (#9529)
832
833
834Improved Documentation
835----------------------
836
837- Several minor formatting problems in the API documentation have been corrected. (#9461)
838- The documentation of twisted.internet.defer.Deferred.fromFuture() has been updated to reflect upstream changes. (#9539)
839
840
841Deprecations and Removals
842-------------------------
843
844- async keyword argument is deprecated in twisted.conch.manhole
845  (ManholeInterpreter.write and Manhole.add) and in
846  twisted.main.imap4.IMAP4Server.sendUntaggedResponse,
847  isAsync keyword argument is introduced instead. (#9384)
848
849
850Misc
851----
852
853- #9379, #9485, #9489, #9499, #9501, #9511, #9514, #9523, #9524, #9525, #9538
854
855
856Conch
857-----
858
859Bugfixes
860~~~~~~~~
861
862- twisted.conch.keys.Key.public returns the same twisted.conch.keys.Key instance when it is already a public key instead of failing with an exception. (#9441)
863- RSA private keys are no longer corrupted during loading, allowing OpenSSL's fast-path to operate for RSA signing. (#9518)
864
865
866Improved Documentation
867~~~~~~~~~~~~~~~~~~~~~~
868
869- The documentation for IConchUser.gotGlobalRequest() is more accurate. (#9413)
870
871
872Deprecations and Removals
873~~~~~~~~~~~~~~~~~~~~~~~~~
874
875- twisted.conch.ssh.filetransfer.ClientDirectory's use as an iterator has been deprecated. (#9527)
876
877
878Web
879---
880
881Bugfixes
882~~~~~~~~
883
884- twisted.web.server.Request.getSession now returns a new session if the
885  previous session has expired. (#9288)
886
887
888Misc
889~~~~
890
891- #9479, #9480, #9482, #9491
892
893
894Mail
895----
896
897No significant changes.
898
899
900Words
901-----
902
903No significant changes.
904
905
906Names
907-----
908
909No significant changes.
910
911
912Twisted 18.7.0 (2018-07-10)
913===========================
914
915Features
916--------
917
918- Cancelling a Deferred returned by twisted.internet.defer.inlineCallbacks now cancels the Deferred it is waiting on. (#4632)
919- twisted.application.internet.ClientService now accepts a function to initialize or validate a connection before it is returned by the whenConnected method as the prepareConnection argument. (#8375)
920- Traceback generated for twisted.internet.defer.inlineCallbacks now includes the full stack of inlineCallbacks generators between catcher and raiser (before it only contained raiser's stack). (#9176)
921- Add optional cwd argument to twisted.runner.procmon.ProcMon.addProcess (#9287)
922- twisted.python.failure.Failure tracebacks generated by coroutines scheduled with twisted.internet.defer.ensureDeferred - i.e. any Deferred-awaiting coroutine - now contain fewer extraneous frames from the trampoline implementation, and correctly indicate the source of exceptions raised in other call stacks - i.e. the function that raised the exception.  In other words: if you 'await' a function that raises an exception, you'll be able to see where the error came from. (#9459)
923
924
925Bugfixes
926--------
927
928- On UNIX-like platforms, Twisted attempts to recover from EMFILE when accepting connections on TCP and UNIX ports by shedding incoming clients. (#5368)
929- The documentation of IReactorTime.getDelayedCalls() has been corrected to indicate that the method returns a list, not a tuple. (#9418)
930- "python -m twisted web --help" now refers to "--listen" instead of the non-existing "--http" (#9434)
931- twisted.python.htmlizer.TokenPrinter now explicitly works on bytestrings. (#9442)
932- twisted.enterprise.adbapi.ConnectionPool.runWithConnection and runInteraction now use the reactor that is passed to ConnectionPool's constructor. (#9467)
933
934
935Improved Documentation
936----------------------
937
938- The Twisted Coding Standard now contains examples of how to mark up a feature as added in the next Twisted release. (#9460)
939
940
941Deprecations and Removals
942-------------------------
943
944- Deprecate direct introspection of ProcMon's processes: processes should not be directly accessed or pickled. (#9287)
945- twisted.internet.address.IPv4Address._bwHack and twisted.internet.address.UNIXAddress._bwHack, as well as the parameters to the constructors, deprecated since Twisted 11.0, have been removed. (#9450)
946
947
948Misc
949----
950
951- #7495, #9399, #9406, #9411, #9425, #9439, #9449, #9450, #9452
952
953
954Conch
955-----
956
957Features
958~~~~~~~~
959
960- twisted.conch.ssh.transport.SSHTransportBase now includes Twisted's version in the software version string it sends to the server, allowing servers to apply compatibility workarounds for bugs in particular client versions. (#9424)
961
962
963Bugfixes
964~~~~~~~~
965
966- If the command run by twisted.conch.endpoints.SSHCommandClientEndpoint exits because of a delivered signal, the client protocol's connectionLost is now called with a ProcessTerminated exception instead of a ConnectionDone exception. (#9412)
967- twisted.conch.ssh.transport.SSHTransportBase now correctly handles MSG_DEBUG with a false alwaysDisplay field on Python 2 (broken since 8.0.0). (#9422)
968- twisted.conch.manhole.lastColorizedLine now does not throw a UnicodeDecodeError on non-ASCII input. (#9442)
969
970
971Web
972---
973
974Features
975~~~~~~~~
976
977- Added support for SameSite cookies in ``http.Request.addCookie``. (#9387)
978
979
980Bugfixes
981~~~~~~~~
982
983- twisted.web.server.GzipEncoderFactory would sometimes fail to gzip requests if the Accept-Encoding header contained whitespace between the comma-separated acceptable encodings. It now trims whitespace before checking if gzip is an acceptable encoding. (#9086)
984- twisted.web.static.File renders directory listings on Python 2, including those with text paths. (#9438)
985- twisted.python.http.Request now correcly parses multipart bodies on Python 3.7. (#9448)
986- twisted.web.http.combinedLogFormatter (used by t.w.http.Server and t.w.server.Site) no longer produces DeprecationWarning about Request.getClientIP. (#9470)
987
988
989Misc
990~~~~
991
992- #9432, #9466, #9479, #9480
993
994
995Mail
996----
997
998No significant changes.
999
1000
1001Words
1002-----
1003
1004No significant changes.
1005
1006
1007Names
1008-----
1009
1010Misc
1011~~~~
1012
1013- #9398
1014
1015
1016Twisted 18.4.0 (2018-04-13)
1017===========================
1018
1019Features
1020--------
1021
1022- The --port/--https arguments to web plugin are now deprecated, in favor of
1023  --listen. The --listen argument can be given multiple times to listen on
1024  multiple ports. (#6670)
1025- Twisted now requires zope.interface 4.4.2 or higher across all platforms and
1026  Python versions. (#8149)
1027- The osx_platform setuptools extra has been renamed to macos_platform, with
1028  the former name being a compatibility alias. (#8848)
1029- Zsh completions are now provided for the twist command. (#9338)
1030- twisted.internet.endpoints.HostnameEndpoint now has a __repr__ method which
1031  includes the host and port to which the endpoint connects. (#9341)
1032
1033
1034Bugfixes
1035--------
1036
1037- twistd now uses the UID's default GID to initialize groups when --uid is
1038  given but --gid is not. This prevents an unhandled TypeError from being
1039  raised when os.initgroups() is called. (#4442)
1040- twisted.protocols.basic.LineReceiver checks received lines' lengths against
1041  its MAX_LENGTH only after receiving a complete delimiter. A line ending in a
1042  multi-byte delimiter like '\r\n' might be split by the network, with the
1043  first part arriving before the rest; previously, LineReceiver erroneously
1044  disconnected if the first part, e.g. 'zzzz....\r' exceeded MAX_LENGTH.
1045  LineReceiver now checks received data against MAX_LENGTH plus the delimiter's
1046  length, allowing short reads to complete a line. (#6556)
1047- twisted.protocols.basic.LineOnlyReceiver disconnects the transport after
1048  receiving a line that exceeds MAX_LENGTH, like LineReceiver. (#6557)
1049- twisted.web.http.Request.getClientIP now returns the host part of the
1050  client's address when connected over IPv6. (#7704)
1051- twisted.application.service.IService is now documented as requiring the
1052  'running', 'name' and 'parent' attributes (the documentation previously
1053  implied they were required, but was unclear). (#7922)
1054- twisted.web.wsgi.WSGIResource no longer raises an exception when a client
1055  connects over IPv6. (#8241)
1056- When using TLS enable automatic ECDH curve selection on OpenSSL 1.0.2+
1057  instead of only supporting P-256 (#9210)
1058- twisted.trial._dist.worker and twisted.trial._dist.workertrial consistently
1059  pass bytes, not unicode to AMP. This fixes "trial -j" on Python 3. (#9264)
1060- twisted.trial.runner now uses the 'importlib' module instead of the 'imp'
1061  module on Python 3+. This eliminates DeprecationWarnings caused by importing
1062  'imp' on Python 3. (#9275)
1063- twisted.web.client.HTTP11ClientProtocol now closes the connection when the
1064  server is sending a header line which is longer than he line limit of
1065  twisted.protocols.basic.LineReceiver.MAX_LENGTH. (#9295)
1066- twisted.python.failure now handles long stacktraces better; in particular it
1067  will log tracebacks for stack overflow errors. (#9301)
1068- The "--_shell-completion" argument to twistd now works on Python 3. (#9303)
1069- twisted.python.failure.Failure now raises the wrapped exception in Python3,
1070  and self (Failure) n Python2 when trap() is called without a matching
1071  exception (#9307)
1072- Writing large amounts of data no longer implies repeated, expensive copying
1073  under Python 3. Python 3's write speeds are now as fast as Python 2's.
1074  (#9324)
1075- twisted.protocols.postfix now properly encodes errors which are unicode
1076  strings to bytes. (#9335)
1077- twisted.protocols.policies.ProtocolWrapper and
1078  twisted.protocols.tls.TLSMemoryBIOProtocol no longer create circular
1079  references that keep protocol instances in memory after connection is closed.
1080  (#9374)
1081- twisted.conch.ssh.transport.SSHTransportBase no longer strips trailing spaces
1082  from the SSH version string of the connected peer. (#9377)
1083- `trial -j` no longer crashes on Python 2 on test failure messages containing
1084  non-ASCII bytes. (#9378)
1085- RSA keys replaced with 2048bit ones in twisted.conch.test.keydata in order to
1086  be compatible with OpenSSH 7.6. (#9388)
1087- AsyncioSelectorReactor uses the global policy's event loop. asyncio libraries
1088  that retrieve the running event loop with get_event_loop() will now receive
1089  the one used by AsyncioSelectorReactor. (#9390)
1090
1091
1092Improved Documentation
1093----------------------
1094
1095- public attributes of `twisted.logger.Logger` are now documented as
1096  attributes. (#8157)
1097- List indentation formatting errors have been corrected throughout the
1098  documentation. (#9256)
1099
1100
1101Deprecations and Removals
1102-------------------------
1103
1104- twisted.protocols.basic.LineOnlyReceiver.lineLengthExceeded no longer returns
1105  twisted.internet.error.ConnectionLost. It instead directly disconnects the
1106  transport and returns None. (#6557)
1107- twisted.python.win32.getProgramsMenuPath and
1108  twisted.python.win32.getProgramFilesPath were deprecated in Twisted 15.3.0
1109  and have now been removed. (#9312)
1110- Python 3.3 is no longer supported. (#9352)
1111
1112
1113Misc
1114----
1115
1116- #7033, #8887, #9204, #9289, #9291, #9292, #9293, #9302, #9336, #9355, #9356,
1117  #9364, #9375, #9381, #9382, #9389, #9391, #9393, #9394, #9396
1118
1119
1120Conch
1121-----
1122
1123Bugfixes
1124~~~~~~~~
1125
1126- twisted.plugins.cred_unix now properly converts a username and password from
1127  bytes to str on Python 3. In addition, passwords which are encrypted with
1128  SHA512 and SH256 are properly verified. This fixes running a conch server
1129  with: "twistd -n conch -d /etc/ssh/ --auth=unix". (#9130)
1130- In twisted.conch.scripts.conch, on Python 3 do not write bytes directly to
1131  sys.stderr. On Python 3, this fixes remote SSH execution of a command which
1132  fails. (#9344)
1133
1134
1135Deprecations and Removals
1136~~~~~~~~~~~~~~~~~~~~~~~~~
1137
1138- twisted.conch.ssh.filetransfer.FileTransferClient.wasAFile attribute has been
1139  removed as it serves no purpose. (#9362)
1140- Removed deprecated support for PyCrypto key objects in conch (#9368)
1141
1142
1143Web
1144---
1145
1146Features
1147~~~~~~~~
1148
1149- The new twisted.iweb.IRequest.getClientAddress returns the IAddress provider
1150  representing the client's address. Callers should check the type of the
1151  returned value before using it. (#7707)
1152- Eliminate use of twisted.python.log in twisted.web modules. (#9280)
1153
1154
1155Bugfixes
1156~~~~~~~~
1157
1158- Scripts ending with .rpy, .epy, and .cgi now execute properly in Twisted Web
1159  on Python 3. (#9271)
1160- twisted.web.http.Request and twisted.web.server.Request are once again
1161  hashable on Python 2, fixing a regression introduced in Twisted 17.5.0.
1162  (#9314)
1163
1164
1165Improved Documentation
1166~~~~~~~~~~~~~~~~~~~~~~
1167
1168- Correct reactor docstrings for twisted.web.client.Agent and
1169  twisted.web.client._StandardEndpointFactory to communicate interface
1170  requirements since 17.1. (#9274)
1171- The examples for the "Twisted Web in 60 Seconds" tutorial have been fixed to
1172  work on Python 3. (#9285)
1173
1174
1175Deprecations and Removals
1176~~~~~~~~~~~~~~~~~~~~~~~~~
1177
1178- twisted.iweb.IRequest.getClientIP is deprecated. Use
1179  twisted.iweb.IRequest.getClientAddress instead (see #7707). (#7705)
1180- twisted.web.iweb.IRequest.getClient and its implementations (deprecated in
1181  #2552) have been removed. (#9395)
1182
1183
1184Mail
1185----
1186
1187Bugfixes
1188~~~~~~~~
1189
1190- twistd.mail.scripts.mailmail has been ported to Python 3. (#8487)
1191- twisted.mail.bounce now works on Python 3. (#9260)
1192- twisted.mail.pop3 and twisted.mail.pop3client now work on Python 3. (#9269)
1193- SMTP authentication in twisted.mail.smtp now works better on Python 3, due to
1194  improved improved bytes vs unicode handling. (#9299)
1195
1196
1197Misc
1198~~~~
1199
1200- #9310
1201
1202
1203Words
1204-----
1205
1206No significant changes.
1207
1208
1209Names
1210-----
1211
1212No significant changes.
1213
1214
1215Twisted 17.9.0 (2017-09-23)
1216===========================
1217
1218This is the last Twisted release where Python 3.3 is supported, on any
1219platform.
1220
1221Features
1222--------
1223
1224- twisted.python.failure.Failure is now a new-style class which subclasses
1225  BaseException. (#5519)
1226- twisted.internet.posixbase.PosixReactorBase.adoptStreamPort and
1227  twisted.internet.posixbase.PosixReactorBase.adoptStreamConnection now support
1228  AF_UNIX SOCK_STREAM sockets. (#5573)
1229-  (#8940)
1230- t.protocol.policies.TimeoutMixin.setTimeout and
1231  t.protocol.policies.TimeoutProtocol.cancelTimeout (used in
1232  t.protocol.policies.TimeoutFactory) no longer raise a
1233  t.internet.error.AlreadyCancelled exception when calling them for an already
1234  cancelled timeout. (#9131)
1235- twisted.web.template.flatten now supports coroutines that yield Deferreds.
1236  (#9199)
1237- twisted.web.client.HTTPConnectionPool passes the repr() of the endpoint to
1238  the client protocol factory, and the protocol factory adds that to its own
1239  repr(). This makes logs more useful. (#9235)
1240- Python 3.6 is now supported (#9240)
1241
1242
1243Bugfixes
1244--------
1245
1246- twisted.python.logfile.BaseLogFile and subclasses now always open the file in
1247  binary mode, and will process text as UTF-8. (#6938)
1248- The `ssl:` endpoint now accepts `certKey` PEM files without trailing
1249  newlines. (#7530)
1250- Logger.__init__ sets the namespace to "<unknown>" instead of raising KeyError
1251  when unable to determine the namespace from the calling context. (#7930)
1252- twisted.internet._win32serialport updated to support pySerial 3.x and dropped
1253  pySerial 2.x support. (#8159)
1254- twisted.python.rebuild now works on Python 3. (#8213)
1255- twisted.web.server.Request.notifyFinish will now once again promptly notify
1256  applications of client disconnection (assuming that the client doesn't send a
1257  large amount of pipelined request data) rather than waiting for the timeout;
1258  this fixes a bug introduced in Twisted 16.3.0. (#8692)
1259- twisted.web.guard.HTTPAuthSessionWrapper configured with
1260  DigestCredentialFactory now works on both Python 2 and 3. (#9127)
1261- Detect when we’re being run using “-m twisted” or “-m twisted.trial” and use
1262  it to build an accurate usage message. (#9133)
1263- twisted.protocols.tls.TLSMemoryBIOProtocol now allows unregisterProducer to
1264  be called when no producer is registered, bringing it in line with other
1265  transports. (#9156)
1266- twisted.web web servers no longer print tracebacks when they timeout clients
1267  that do not respond to TLS CLOSE_NOTIFY messages. (#9157)
1268- twisted.mail.imap4 now works on Python 3. (#9161)
1269- twisted.python.shortcut now works on Python 3 in Windows. (#9170)
1270- Fix traceback forwarding with inlineCallbacks on python 3. (#9175)
1271- twisted.mail.imap4.MessageSet now treats * as larger than every message ID,
1272  leading to more consistent and robust behavior. (#9177)
1273- The following plugins can now be used on Python 3 with twistd: dns, inetd,
1274  portforward, procmon, socks, and words. (#9184)
1275- twisted.internet._win32serialport now uses serial.serialutil.to_bytes() to
1276  provide bytes in Python 3. (#9186)
1277- twisted.internet.reactor.spawnProcess() now does not fail on Python 3 in
1278  Windows if passed a bytes-encoded path argument. (#9200)
1279- twisted.protocols.ident now works on Python 3. (#9221)
1280- Ignore PyPy's implementation differences in base object class. (#9225)
1281- twisted.python.test.test_setup now passes with setuptools 36.2.1 (#9231)
1282- twisted.internet._win32serialport SerialPort._clearCommError() no longer
1283  raises AttributeError (#9252)
1284- twisted.trial.unittest.SynchronousTestCase and
1285  twisted.trial.unittest.TestCase now always run their tearDown methods, even
1286  when a test method fails with an exception. They also flush all errors logged
1287  by a test method before running another, ensuring the logged errors are
1288  associated with their originating test method. (#9267)
1289
1290
1291Improved Documentation
1292----------------------
1293
1294- Trial's documentation now directly mentions the preferred way of running
1295  Trial, via "python -m twisted.trial". (#9052)
1296- twisted.internet.endpoints.HostnameEndpoint and
1297  twisted.internet.endpoints.TCP4Client endpoint documentation updated to
1298  correctly reflect that the timeout argument takes a float as well as an int.
1299  (#9151)
1300- Badges at top of README now correctly render as links to respective result
1301  pages on GitHub. (#9216)
1302- The example code for the trial tutorial is now compatible with Python3 and
1303  the current version of Twisted. (#9223)
1304
1305
1306Deprecations and Removals
1307-------------------------
1308
1309- twisted.protocols.dict is deprecated. (#9141)
1310- gpsfix.py has been removed from the examples. It uses twisted.protocols.gps
1311  which was removed in Twisted 16.5.0. (#9253)
1312- oscardemo.py, which illustrates the use of twisted.words.protocols.oscar, as
1313  been removed. twisted.words.protocols.oscar was removed in Twisted 17.5.0.
1314  (#9255)
1315
1316
1317Misc
1318----
1319
1320- #5949, #8566, #8650, #8944, #9159, #9160, #9162, #9196, #9219, #9228, #9229,
1321  #9230, #9247, #9248, #9249, #9251, #9254, #9262, #9276, #9308
1322
1323
1324Conch
1325-----
1326
1327Bugfixes
1328~~~~~~~~
1329
1330- twisted.conch.ssh.userauth.SSHUserAuthServer now gracefully handles
1331  unsupported authentication key types. (#9139)
1332- twisted.conch.client.default verifyHostKey now opens /dev/tty with no buffer
1333  to be compatible with Python 3. This lets the conch cli work with Python 3.
1334  (#9265)
1335
1336
1337Deprecations and Removals
1338~~~~~~~~~~~~~~~~~~~~~~~~~
1339
1340- twisted.conch.ssh._cryptography_backports has been removed in favor of using
1341  int_to_bytes() and int_from_bytes() from cryptography.utils. (#9263)
1342
1343
1344Misc
1345~~~~
1346
1347- #9158, #9272
1348
1349
1350Web
1351---
1352
1353Features
1354~~~~~~~~
1355
1356- twisted.web.static.File.contentTypes is now documented. (#5739)
1357- twisted.web.server.Request and any Twisted web server using it now support
1358  automatic fast responses to HTTP/1.1 and HTTP/2 OPTIONS * requests, and
1359  reject any other verb using the * URL form. (#9190)
1360- --add-header "HeaderName: Value" can be passed to twist web in order to set
1361  extra headers on all responses (#9241)
1362
1363
1364Bugfixes
1365~~~~~~~~
1366
1367- twisted.web.client.HTTPClientFactory(...).gotHeaders(...) now handles a wrong
1368  Set-Cookie header without a traceback. (#9136)
1369- twisted.python.web.http.HTTPFactory now always opens logFile in binary mode
1370  and writes access logs in UTF-8, to avoid encoding issues and newline
1371  differences on Windows. (#9143)
1372- The code examples in "Using the Twisted Web Client" now work on Python 3.
1373  (#9172)
1374- twisted.web.server.Request and all web servers that use it now no longer send
1375  a default Content-Type header on responses that do not have a body (i.e. that
1376  set Content-Length: 0 or that send a 204 status code). (#9191)
1377- twisted.web.http.Request and all subclasses now correctly fire Deferreds
1378  returned from notifyFinish with errbacks when errors are encountered in
1379  HTTP/2 streams. (#9208)
1380- twisted.web.microdom, twisted.web.domhelpers, and twisted.web.sux now work on
1381  Python 3. (#9222)
1382
1383
1384Mail
1385----
1386
1387Bugfixes
1388~~~~~~~~
1389
1390- Sending a list of recipients with twisted.smtp.SenderFactory has been fixed.
1391  This fixes a problem found when running buildbot. (#9180)
1392- twisted.mail.imap4.IMAP4Server parses empty string literals even when they
1393  are the last argument to a command, such as LOGIN. (#9207)
1394
1395
1396Words
1397-----
1398
1399Bugfixes
1400~~~~~~~~
1401
1402- twisted.words.tap has been ported to Python 3 (#9169)
1403
1404
1405Misc
1406~~~~
1407
1408- #9246
1409
1410
1411Names
1412-----
1413
1414Bugfixes
1415~~~~~~~~
1416
1417- Queries for unknown record types no longer incorrectly result in a server
1418  error. (#9095)
1419- Failed TCP connections for AFXR queries no longer raise an AttributeError.
1420  (#9174)
1421
1422
1423Twisted 17.5.0 (2017-06-04)
1424===========================
1425
1426Bugfixes
1427--------
1428
1429- spawnProcess no longer opens an unwanted console on Windows (#5726)
1430- The transition to the hyperlink package adds IPv6 support to
1431  twisted.python.url.URL. This is now deprecated and new code should use
1432  hyperlink directly (see #9126). (#8069)
1433- twisted.logger now buffers only 200 events by default (reduced from 65536)
1434  while waiting for observers to be configured. (#8164)
1435- The transition of twisted.python.url to using the hyperlink package enables a
1436  URL.click() with no arguments (or 0-length string argument) to resolve dot
1437  segments in the path. (#8184)
1438- twisted.protocols.finger now works on Python 3. (#8230)
1439- TLS-related tests now pass when run with OpenSSL 1.1.0. This makes tests pass
1440  again on macOS and Windows, as cryptography 1.8 and later include OpenSSL
1441  1.1.0. (#8898)
1442- UNIX socket endpoints now process all messages from recvmsg's ancillary data
1443  via twisted.internet.unix.Server.doRead/twisted.internet.unix.Client.doRead,
1444  while discarding and logging ones that don't contain file descriptors.
1445  (#8912)
1446- twisted.internet.endpoints.HostnameEndpoint and twisted.web.client.Agent work
1447  again with reactors that do not provide IReactorPluggableNameResolver. This
1448  undoes the changes that broke downstream users such as treq.testing. Note
1449  that passing reactors that do not provide IReactorPluggableNameResolver to
1450  either is deprecated. (#9032)
1451- A Python 3 Perspective Broker server which receives a remote call with
1452  keyword arguments from a Python 2 client will now decode any keys which are
1453  binary to strings instead of crashing. This fixes interoperability between
1454  Python 2 Buildbot clients and Python 3 Buildbot servers. (#9047)
1455- twisted.internet._threadedselect now works on both Python 2 and 3. (#9053)
1456- twisted.internet.interfaces.IResolverSimple implementers will now always be
1457  passed bytes, properly IDNA encoded if required, on Python 2. On Python 3,
1458  they will now be passed correctly IDNA-encoded Unicode forms of the domain,
1459  taking advantage of the idna library from PyPI if possible. This is to avoid
1460  Python's standard library (which has an out of date idna module) from mis-
1461  encoding domain names when non-ASCII Unicode is passed to it. (#9137)
1462
1463
1464Improved Documentation
1465----------------------
1466
1467- The examples in Twisted howto "Using the Twisted Application Framework",
1468  section "Customizing twistd logging" have been updated to use latest logging
1469  modules and syntax (#9084)
1470
1471
1472Features
1473--------
1474
1475- twisted.internet.defer.Deferred.asFuture and
1476  twisted.internet.defer.Deferred.fromFuture were added, allowing for easy
1477  transitions between asyncio coroutines (which await Futures) and twisted
1478  coroutines (which await Deferreds). (#8748)
1479- twisted.application.internet.ClientService.whenConnected now accepts an
1480  argument "failAfterFailures". If you set this to 1, the Deferred returned by
1481  whenConnected will errback when the connection attempt fails, rather than
1482  retrying forever. This lets you react (probably by stopping the
1483  ClientService) to connection errors that are likely to be persistent, such as
1484  using the wrong hostname, or not being connected to the internet at all.
1485  (#9116)
1486- twisted.protocols.tls.TLSMemoryBIOProtocol and anything that uses it
1487  indirectly including the TLS client and server endpoints now enables TLS 1.3
1488  cipher suites. (#9128)
1489
1490
1491Misc
1492----
1493
1494- #8133, #8995, #8997, #9003, #9015, #9021, #9026, #9027, #9049, #9057, #9062,
1495  #9065, #9069, #9070, #9072, #9074, #9075, #9111, #9117, #9140, #9144, #9145
1496
1497
1498Deprecations and Removals
1499-------------------------
1500
1501- twisted.runner.inetdconf.InvalidRPCServicesConfError,
1502  twisted.runner.inetdconf.RPCServicesConf, twisted.runner.inetdtap.RPCServer,
1503  and twisted.runner.portmap, deprecated since 16.2.0, have been removed.
1504  (#8464)
1505- twisted.python.url and twisted.python._url were modified to rely on
1506  hyperlink, a new package based on the Twisted URL implementation. Hyperlink
1507  adds support for IPv6 (fixing #8069), correct username/password encoding,
1508  better scheme/netloc inference, improved URL.click() behavior (fixing #8184),
1509  and more. For full docs see hyperlink.readthedocs.io and the CHANGELOG in the
1510  hyperlink GitHub repo. (#9126)
1511
1512
1513Conch
1514-----
1515
1516Bugfixes
1517~~~~~~~~
1518
1519- History-aware terminal protocols like twisted.conch.manhole.Manhole no longer
1520  raise a TypeError when a user visits a partial line they added to the command
1521  line history by pressing up arrow before return. (#9031)
1522- The telnet_echo.tac example had conflicting port callouts between runtime and
1523  documentation. File was altered to run on documented port, 6023. (#9055)
1524
1525
1526Deprecations and Removals
1527~~~~~~~~~~~~~~~~~~~~~~~~~
1528
1529- Remove diffie-hellman-group1-sha1 from twisted.conch. See https://weakdh.org/
1530  (#9019)
1531- Removed small and obscure elliptic curves from conch. The only curves conch
1532  supports now are the ones also supported by OpenSSH. (#9088)
1533
1534
1535Mail
1536----
1537
1538Bugfixes
1539~~~~~~~~
1540
1541- twisted.mail.smtp has been ported to Python 3. (#8770)
1542
1543
1544Names
1545-----
1546
1547Bugfixes
1548~~~~~~~~
1549
1550- RRHeader now converts its ttl argument to an integer, raising a TypeError if
1551  it cannot. (#8340)
1552
1553
1554Web
1555---
1556
1557Bugfixes
1558~~~~~~~~
1559
1560- twisted.web.cgi now works on Python 3 (#8009)
1561- twisted.web.distrib now works on Python 3 (#8010)
1562- twisted.web.http.HTTPFactory now propagates its reactor's callLater method to
1563  the HTTPChannel object, rather than having callLater grab the global reactor.
1564  This prevents the possibility of HTTPFactory logging using one reactor, but
1565  HTTPChannel running timeouts on another. (#8904)
1566
1567
1568Improved Documentation
1569~~~~~~~~~~~~~~~~~~~~~~
1570
1571- twisted.web.template.flattenString docstring now correctly references
1572  io.BytesIO (rather than NativeStringIO). (#9028)
1573
1574
1575Features
1576~~~~~~~~
1577
1578- twisted.web.client now exposes the RequestGenerationFailed exception type.
1579  (#5310)
1580- twisted.web.client.Agent will now parse responses that begin with a status
1581  line that is missing a phrase. (#7673)
1582- twisted.web.http.HTTPChannel and twisted.web._http2.H2Connection have been
1583  enhanced so that after they time out they wait a small amount of time to
1584  allow the connection to close gracefully and, if it does not, they forcibly
1585  close it to avoid allowing malicious clients to forcibly keep the connection
1586  open. (#8902)
1587
1588
1589Misc
1590~~~~
1591
1592- #8981, #9018, #9067, #9090, #9092, #9093, #9096
1593
1594
1595Words
1596-----
1597
1598Deprecations and Removals
1599~~~~~~~~~~~~~~~~~~~~~~~~~
1600
1601- twisted.words.protocols.oscar, which is client code for Oscar/ICQ, was
1602  deprecated in 16.2.0 and has now been removed. (#9024)
1603
1604
1605Twisted Core 17.1.0 (2017-02-04)
1606================================
1607
1608Features
1609--------
1610 - Added a new interface,
1611   twisted.internet.interfaces.IHostnameResolver, which is an
1612   improvement to twisted.internet.interfaces.IResolverSimple that
1613   supports resolving multiple addresses as well as resolving IPv6
1614   addresses.  This is a native, asynchronous, Twisted analogue to
1615   getaddrinfo. (#4362)
1616 - twisted.web.client.Agent now uses HostnameEndpoint internally; as a
1617   consequence, it now supports IPv6, as well as making connections
1618   faster and more reliably to hosts that have more than one DNS name.
1619   (#6712)
1620 - twisted.internet.ssl.CertificateOptions now has the new constructor
1621   argument 'raiseMinimumTo', allowing you to increase the minimum TLS
1622   version to this version or Twisted's default, whichever is higher.
1623   The additional new constructor arguments 'lowerMaximumSecurityTo'
1624   and 'insecurelyLowerMinimumTo' allow finer grained control over
1625   negotiated versions that don't honour Twisted's defaults, for
1626   working around broken peers, at the cost of reducing the security
1627   of the TLS it will negotiate. (#6800)
1628 - twisted.internet.ssl.CertificateOptions now sets the OpenSSL
1629   context's mode to MODE_RELEASE_BUFFERS, which will free the
1630   read/write buffers on idle TLS connections to save memory. (#8247)
1631 - trial --help-reactors will only list reactors which can be
1632   imported.  (#8745)
1633 - twisted.internet.endpoints.HostnameEndpoint now uses the passed
1634   reactor's implementation of
1635   twisted.internet.interfaces.IReactorPluggableResolver to resolve
1636   hostnames rather than its own deferToThread/getaddrinfo wrapper;
1637   this makes its hostname resolution pluggable via a public API.
1638   (#8922)
1639 - twisted.internet.reactor.spawnProcess now does not emit a
1640   deprecation warning on Unicode arguments. It will encode Unicode
1641   arguments down to bytes using the filesystem encoding on UNIX and
1642   Python 2 on Windows, and pass Unicode through unchanged on Python 3
1643   on Windows. (#8941)
1644 - twisted.trial._dist.test.test_distreporter now works on Python 3.
1645   (#8943)
1646
1647Bugfixes
1648--------
1649 - trial --help-reactors will now display iocp and win32er reactors
1650   with Python 3. (#8745)
1651 - twisted.logger._flatten.flattenEvent now handles log_format being
1652   None instead of assuming the value is always a string. (#8860)
1653 - twisted.protocol.ftp is now Python 3 compatible (#8865)
1654 - twisted.names.client.Resolver can now resolve names with IPv6 DNS
1655   servers. (#8877)
1656 - twisted.application.internet.ClientService now waits for existing
1657   connections to disconnect before trying to connect again when
1658   restarting. (#8899)
1659 - twisted.internet.unix.Server.doRead and
1660   twisted.internet.unix.Client.doRead no longer fail if recvmsg's
1661   ancillary data contains more than one file descriptor. (#8911)
1662 - twist on Python 3 now correctly prints the help text when given no
1663   plugin to run. (#8918)
1664 - twisted.python.sendmsg.sendmsg no longer segfaults on Linux +
1665   Python 2. (#8969)
1666 - IHandshakeListener providers connected via SSL4ClientEndpoint will
1667   now have their handshakeCompleted methods called. (#8973)
1668 - The twist script now respects the --reactor option. (#8983)
1669 - Fix crash when using SynchronousTestCase with Warning object which
1670   does not store a string as its first argument (like
1671   libmysqlclient). (#9005)
1672 - twisted.python.compat.execfile() does not open files with the
1673   deprecated 'U' flag on Python 3. (#9012)
1674
1675Deprecations and Removals
1676-------------------------
1677 - twisted.internet.ssl.CertificateOption's 'method' constructor
1678   argument is now deprecated, in favour of the new 'raiseMinimumTo',
1679   'lowerMaximumSecurityTo', and 'insecurelyLowerMinimumTo' arguments.
1680   (#6800)
1681 - twisted.protocols.telnet (not to be confused with the supported
1682   twisted.conch.telnet), deprecated since Twisted 2.5, has been
1683   removed. (#8925)
1684 - twisted.application.strports.parse, as well as the deprecated
1685   default arguments in strports.service/listen, deprecated since
1686   Twisted 10.2, has been removed. (#8926)
1687 - twisted.web.client.getPage and twisted.web.client.downloadPage have
1688   been deprecated in favour of https://pypi.org/project/treq and
1689   twisted.web.client.Agent. (#8960)
1690 - twisted.internet.defer.timeout is deprecated in favor of
1691   twisted.internet.defer.Deferred.addTimeout (#8971)
1692
1693Other
1694-----
1695 - #7879, #8583, #8764, #8809, #8859, #8906, #8910, #8913, #8916,
1696   #8934, #8945, #8949, #8950, #8952, #8953, #8959, #8962, #8963,
1697   #8967, #8975, #8976, #8993, #9013
1698
1699
1700Twisted Conch 17.1.0 (2017-02-04)
1701=================================
1702
1703Features
1704--------
1705 - twisted.conch.manhole now works on Python 3. (#8327)
1706 - Twisted Conch now supports ECDH key exchanges. (#8730)
1707 - Add support in twisted.conch.ssh for hmac-sha2-384 (#8784)
1708 - conch and cftp scripts now work on Python 3. (#8791)
1709 - twisted.conch.ssh supports ECDH key exchange. (#8811)
1710
1711Bugfixes
1712--------
1713 - twisted.conch.ssh.keys.Key.fromString now supports OpenSSL private
1714   keys with Windows line endings (\r\n) again (broken since 16.6.0).
1715   (#8928)
1716
1717Improved Documentation
1718----------------------
1719 - The documentation for
1720   twisted.conch.endpoints.SSHCommandClientEndpoint.existingConnection
1721   now describes where the value for the connection parameter might
1722   come from. (#8892)
1723
1724Other
1725-----
1726 - #8890, #8894, #8957, #8958, #8968
1727
1728
1729Twisted Mail 17.1.0 (2017-02-04)
1730================================
1731
1732Deprecations and Removals
1733-------------------------
1734 - twisted.mail.tap (the twist plugin for mail) no longer accepts the
1735   --pop3s option or implicit port numbers to --pop3 and --smtp. This
1736   functionality has been deprecated since 11.0. (#8920)
1737
1738
1739Twisted Names 17.1.0 (2017-02-04)
1740=================================
1741
1742Bugfixes
1743--------
1744 - twisted.names.authority.BindAuthority has been ported to Python 3.
1745   (#8880)
1746
1747
1748Twisted News 17.1.0 (2017-02-04)
1749================================
1750
1751No significant changes have been made for this release.
1752
1753
1754Twisted Pair 17.1.0 (2017-02-04)
1755================================
1756
1757No significant changes have been made for this release.
1758
1759
1760Twisted Runner 17.1.0 (2017-02-04)
1761==================================
1762
1763Bugfixes
1764--------
1765 - On Python 3, procmon now handles process output without exceptions
1766   (#8919)
1767
1768
1769Twisted Web 17.1.0 (2017-02-04)
1770===============================
1771
1772Features
1773--------
1774 - twisted.web.client.Agent now sets ``Content-Length: 0`` for PUT and
1775   POST requests made without a body producer. (#8984)
1776
1777Bugfixes
1778--------
1779 - twisted.web.http.HTTPFactory now times connections out after one
1780   minute of no data from the client being received, before the
1781   request is complete, rather than twelve hours. (#3746)
1782 - twisted.web.http.HTTPChannel, the server class for Twisted's
1783   HTTP/1.1 server, now exerts backpressure against clients that do
1784   not read responses. This means that if a client stops reading from
1785   a socket for long enough, Twisted will stop reading further
1786   requests from that client until it consumes some responses. (#8868)
1787 - twisted.web.http_headers.Headers.getRawHeaders no longer attempts
1788   to decode the default value when called with a unicode header name.
1789   (#8974)
1790 - twisted.web.http.HTTPChannel is less likely to leak file
1791   descriptors when timing out clients using HTTPS connections. In
1792   some cases it is still possible to leak a file descriptor when
1793   timing out HTTP clients: further patches will address this issue.
1794   (#8992)
1795
1796Other
1797-----
1798 - #7744, #8909, #8935
1799
1800
1801Twisted Words 17.1.0 (2017-02-04)
1802=================================
1803
1804No significant changes have been made for this release.
1805
1806
1807Twisted Core 16.6.0 (2016-11-17)
1808================================
1809
1810Features
1811--------
1812 - The twist script can now be run by invoking python -m twisted.
1813   (#8657)
1814 - twisted.protocols.sip has been ported to Python 3. (#8669)
1815 - twisted.persisted.dirdbm has been ported to Python 3. (#8888)
1816
1817Bugfixes
1818--------
1819 - twisted.internet.defer.Deferred now implements send, not __send__,
1820   which means that it is now a conforming generator. (#8861)
1821 - The IOCP reactor no longer transmits the contents of uninitialized
1822   memory when writing large amounts of data. (#8870)
1823 - Deferreds awaited/yielded from in a
1824   twisted.internet.defer.ensureDeferred wrapped coroutine will now
1825   properly raise exceptions. Additionally, it more closely models
1826   asyncio.ensure_future and will pass through Deferreds. (#8878)
1827 - Deferreds that are paused or chained on other Deferreds will now
1828   return a result when yielded/awaited in a twisted.internet.defer
1829   .ensureDeferred-wrapped coroutine, instead of returning the
1830   Deferred it was chained to. (#8890)
1831
1832Improved Documentation
1833----------------------
1834 - twisted.test.proto_helpers is now explicitly covered by the
1835   compatibility policy. (#8857)
1836
1837Other
1838-----
1839 - #8281, #8823, #8862
1840
1841
1842Twisted Conch 16.6.0 (2016-11-17)
1843=================================
1844
1845Features
1846--------
1847 - twisted.conch.ssh.keys supports ECDSA keys (#8798)
1848 - scripts/ckeygen can now generate ecdsa keys. (#8828)
1849 - ckeygen has been ported to Python 3 (#8855)
1850
1851Deprecations and Removals
1852-------------------------
1853 - twisted.conch.ssh no longer uses gmpy, if available. gmpy is
1854   unmaintained, does not have binary wheels for any platforms, and an
1855   alternative for higher performance is available in the form of
1856   PyPy. (#8079)
1857
1858
1859Twisted Mail 16.6.0 (2016-11-17)
1860================================
1861
1862No significant changes have been made for this release.
1863
1864
1865Twisted Names 16.6.0 (2016-11-17)
1866=================================
1867
1868No significant changes have been made for this release.
1869
1870
1871Twisted News 16.6.0 (2016-11-17)
1872================================
1873
1874No significant changes have been made for this release.
1875
1876
1877Twisted Pair 16.6.0 (2016-11-17)
1878================================
1879
1880No significant changes have been made for this release.
1881
1882
1883Twisted Runner 16.6.0 (2016-11-17)
1884==================================
1885
1886No significant changes have been made for this release.
1887
1888
1889Twisted Web 16.6.0 (2016-11-17)
1890===============================
1891
1892Features
1893--------
1894 - twisted.web.server.Site's HTTP/2 server support now emits vastly
1895   fewer WINDOW_UPDATE frames than previously. (#8681)
1896
1897Bugfixes
1898--------
1899 - twisted.web.Agent now tolerates receiving unexpected status codes
1900   in the 100 range by discarding them, which is what RFC 7231
1901   recommends doing. (#8885)
1902 - twisted.web._http.H2Stream's getHost and getPeer implementations
1903   now actually return the host and peer instead of None. (#8893)
1904
1905
1906Twisted Words 16.6.0 (2016-11-17)
1907=================================
1908
1909Features
1910--------
1911 - twisted.words.protocols.irc has been ported to Python 3 (#6320)
1912
1913
1914Twisted Core 16.5.0 (2016-10-28)
1915================================
1916
1917Features
1918--------
1919 - Added twisted.internet.defer.Deferred.addTimeout method to enable
1920   timeouts of deferreds. (#5786)
1921 - Perspective Broker (the twisted.spread package) has been ported to
1922   Python 3 (#7598)
1923 - 'yield from' can now be used on Deferreds inside generators, when
1924   the generator is wrapped with
1925   twisted.internet.defer.ensureDeferred. (#8087)
1926 - twisted.internet.asyncioreactor has been added, which is a Twisted
1927   reactor on top of Python 3.4+'s native asyncio reactor. It can be
1928   selected by passing "--reactor=asyncio" to Twisted tools (twistd,
1929   Trial, etc) on platforms that support it (Python 3.4+). (#8367)
1930 - twisted.python.zippath now works on Windows with Python 3. (#8747)
1931 - twisted.internet.cfreactor is ported to Python 3 and supported on
1932   2.7 and 3.5+. (#8838)
1933
1934Bugfixes
1935--------
1936 - twisted.internet.test.test_iocp and twisted.internet.test.test_tcp
1937   have been fixed to work under Python 3 with the Windows IOCP
1938   reactor (#8631)
1939 - Arguments to processes on Windows are now passed mbcs-encoded
1940   arguments.  This prevents process-related tests from hanging on
1941   Windows with Python 3. (#8735)
1942 - Client and server TLS connections made via the client TLS endpoint
1943   and the server SSL endpoint, as well as any other code that uses
1944   twisted.internet.ssl.CertificateOptions, no longer accept 3DES-
1945   based cipher suites by default, to defend against SWEET32. (#8781)
1946 - twisted.logger.jsonFileLogObserver no longer emits non-JSON
1947   tracebacks into its file; additionally,
1948   twisted.logger.formatEventAsClassicLogText now includes traceback
1949   information for the log event it formats. (#8858)
1950 - twisted.python.version now exports a version of Incremental that is
1951   16.10.1 or higher, making t.p.v.Version package name comparisons
1952   case-insensitive. (#8863)
1953 - twisted.python.reflect.safe_str encodes unicode as ascii with
1954   backslashreplace error handling on Python 2. (#8864)
1955
1956Improved Documentation
1957----------------------
1958 - The twisted.internet.interfaces.IProtocol.dataReceived() method
1959   takes one parameter of type bytes.  This has been clarified in the
1960   doc string. (#8763)
1961
1962Deprecations and Removals
1963-------------------------
1964 - twisted.python.constants is deprecated in preference to constantly
1965   on PyPI, which is the same code rolled into its own package.
1966   (#7351)
1967 - twisted.python.dist3 has been made private API. (#8761)
1968 - When the source code is checked out, bin/trial is no longer in the
1969   tree.  Developers working on the Twisted source code itself should
1970   either (1) run all tests under tox, or (2) run 'python setup.py
1971   develop' to install trial before running any tests. (#8765)
1972 - twisted.protocols.gps, deprecated since Twisted 15.2, has been
1973   removed. (#8787)
1974
1975Other
1976-----
1977 - #4926, #7868, #8209, #8214, #8271, #8308, #8324, #8348, #8367,
1978   #8377, #8378, #8379, #8380, #8381, #8383, #8385, #8387, #8388,
1979   #8389, #8391, #8392, #8393, #8394, #8397, #8406, #8410, #8412,
1980   #8413, #8414, #8421, #8425, #8426, #8430, #8432, #8434, #8435,
1981   #8437, #8438, #8439, #8444, #8451, #8452, #8453, #8454, #8456,
1982   #8457, #8459, #8462, #8463, #8465, #8468, #8469, #8479, #8482,
1983   #8483, #8486, #8490, #8493, #8494, #8496, #8497, #8498, #8499,
1984   #8501, #8503, #8504, #8507, #8508, #8510, #8513, #8514, #8515,
1985   #8516, #8517, #8520, #8521, #8522, #8523, #8524, #8527, #8528,
1986   #8529, #8531, #8532, #8534, #8536, #8537, #8538, #8543, #8544,
1987   #8548, #8552, #8553, #8554, #8555, #8557, #8560, #8563, #8565,
1988   #8568, #8569, #8572, #8573, #8574, #8580, #8581, #8582, #8586,
1989   #8589, #8590, #8592, #8593, #8598, #8603, #8604, #8606, #8609,
1990   #8615, #8616, #8617, #8618, #8619, #8621, #8622, #8624, #8627,
1991   #8628, #8630, #8632, #8634, #8640, #8644, #8645, #8646, #8647,
1992   #8662, #8664, #8666, #8668, #8671, #8672, #8677, #8678, #8684,
1993   #8691, #8702, #8705, #8706, #8716, #8719, #8724, #8725, #8727,
1994   #8734, #8741, #8749, #8752, #8754, #8755, #8756, #8757, #8758,
1995   #8767, #8773, #8776, #8779, #8780, #8785, #8788, #8789, #8790,
1996   #8792, #8793, #8799, #8808, #8817, #8839, #8845, #8852
1997
1998
1999Twisted Conch 16.5.0 (2016-10-28)
2000=================================
2001
2002Features
2003--------
2004 - SSH key fingerprints can be generated using base64 encoded SHA256
2005   hashes. (#8701)
2006
2007Bugfixes
2008--------
2009 - SSHUserAuthServer does not crash on keyboard interactive
2010   authentication when running on Python 3 (#8771)
2011 - twisted.conch.insults.insults.ServerProtocol no longer corrupts a
2012   client's display when attempting to set the cursor position, and
2013   its ECMA-48 terminal manipulation works on Python 3. (#8803)
2014
2015Other
2016-----
2017 - #8495, #8511, #8715, #8851
2018
2019
2020Twisted Mail 16.5.0 (2016-10-28)
2021================================
2022
2023Deprecations and Removals
2024-------------------------
2025 - twisted.mail.protocols.DomainSMTP and DomainESMTP, deprecated since
2026   2003, have been removed. (#8772)
2027
2028Other
2029-----
2030 - #6289, #8525, #8786, #8830
2031
2032
2033Twisted Names 16.5.0 (2016-10-28)
2034=================================
2035
2036No significant changes have been made for this release.
2037
2038Other
2039-----
2040 - #8625, #8663
2041
2042
2043Twisted News 16.5.0 (2016-10-28)
2044================================
2045
2046No significant changes have been made for this release.
2047
2048
2049Twisted Pair 16.5.0 (2016-10-28)
2050================================
2051
2052Features
2053--------
2054 - twisted.pair has been ported to Python 3 (#8744)
2055
2056
2057Twisted Runner 16.5.0 (2016-10-28)
2058==================================
2059
2060No significant changes have been made for this release.
2061
2062
2063Twisted Web 16.5.0 (2016-10-28)
2064===============================
2065
2066Bugfixes
2067--------
2068 - twisted.web.client.HTTPConnectionPool and anything that uses it,
2069   like twisted.web.client.Agent, have had their logic for resuming
2070   transports changed so that transports are resumed after state
2071   machine transitions are complete, rather than before. This change
2072   allows the HTTP client infrastructure to work with alternative HTTP
2073   implementations such as HTTP/2 which may be able to deliver a
2074   complete response synchronously when producing is resumed. (#8720)
2075
2076Other
2077-----
2078 - #8519, #8530, #8629, #8707, #8777, #8778, #8844
2079
2080
2081Twisted Words 16.5.0 (2016-10-28)
2082=================================
2083
2084No significant changes have been made for this release.
2085
2086Other
2087-----
2088 - #8360, #8460
2089
2090
2091Twisted Core 16.4.1 (2016-09-07)
2092================================
2093
2094Features
2095--------
2096 - Client and server TLS connections made via the client TLS endpoint
2097   and the server SSL endpoint, as well as any other code that uses
2098   twisted.internet.ssl.CertificateOptions, now support ChaCha20
2099   ciphers when available from the OpenSSL on the system. (#8760)
2100
2101Bugfixes
2102--------
2103 - Client and server TLS connections made via the client TLS endpoint
2104   and the server SSL endpoint, as well as any other code that uses
2105   twisted.internet.ssl.CertificateOptions, no longer accept 3DES-
2106   based cipher suites by default, to defend against SWEET32. (#8781)
2107
2108
2109Twisted Conch 16.4.1 (2016-09-07)
2110=================================
2111
2112No significant changes have been made for this release.
2113
2114
2115Twisted Mail 16.4.1 (2016-09-07)
2116================================
2117
2118No significant changes have been made for this release.
2119
2120
2121Twisted Names 16.4.1 (2016-09-07)
2122=================================
2123
2124No significant changes have been made for this release.
2125
2126
2127Twisted News 16.4.1 (2016-09-07)
2128================================
2129
2130No significant changes have been made for this release.
2131
2132
2133Twisted Pair 16.4.1 (2016-09-07)
2134================================
2135
2136No significant changes have been made for this release.
2137
2138
2139Twisted Runner 16.4.1 (2016-09-07)
2140==================================
2141
2142No significant changes have been made for this release.
2143
2144
2145Twisted Web 16.4.1 (2016-09-07)
2146===============================
2147
2148No significant changes have been made for this release.
2149
2150
2151Twisted Words 16.4.1 (2016-09-07)
2152=================================
2153
2154No significant changes have been made for this release.
2155
2156
2157Twisted Core 16.4.0 (2016-08-25)
2158================================
2159
2160Features
2161--------
2162 - Add twisted.application.twist, meant to eventually replace twistd
2163   with a simpler interface.  Add twisted.application.runner API,
2164   currently private, which twist is built on. (#5705)
2165 - The new interface IHandshakeListener that can be implemented by any
2166   Protocol provides a callback that is called when the TLS handshake
2167   has been completed, allowing Protocols to make decisions about the
2168   TLS configuration before application data is sent. (#6024)
2169 - twisted.python.syslog has been ported to Python 3. (#7957)
2170 - twisted.internet.defer.ensureDeferred has been added, similar to
2171   asyncio's ensure_future. Wrapping a coroutine (the result of a
2172   function defined using async def, available only on Python 3.5+)
2173   with it allows you to use the "await" keyword with Deferreds inside
2174   the coroutine, similar to "yield" when using inlineCallbacks.
2175   (#8088)
2176 - twisted.internet.inotify have been ported to Python 3 (#8211)
2177 - twisted.enterprise has been ported to Python 3. The third-party
2178   pysqlite2 package has not been ported to Python 3, so any database
2179   connector based on pysqlite2 cannot be used. Instead the sqlite3
2180   module included with Python 3 should be used. (#8303)
2181 - Scripts such as cftp, ckeygen, conch, mailmail, pyhtmlizer,
2182   tkconch, twistd and trial have been updated to be setuptools
2183   console scripts.  (#8491)
2184 - twisted.pair.raw and twisted.pair.rawudp have been ported to Python
2185   3 (#8545)
2186 - twisted.internet.baseprocess has been ported to Python 3. (#8546)
2187 - twisted.python.dist has been ported to Python 3 (#8556)
2188 - twisted.internet.interfaces.IOpenSSLContextFactory has been added,
2189   which defines the interface provided both by the old-style
2190   twisted.internet.ssl.ContextFactory class and the newer
2191   twisted.interface.ssl.CertificateOptions class. This is a precursor
2192   to formally deprecating the former class in favour of the latter.
2193   (#8597)
2194 - twisted.python.zipstream has been ported to Python 3 (#8607)
2195 - Zip file entries returned by ChunkingZipFile.readfile() are now
2196   context managers. (#8641)
2197 - twisted.protocols.socks has been ported to Python 3 (#8665)
2198 - twisted.spread.banana has been ported to Python 3 (#8667)
2199 - Trial can now be invoked via "python -m twisted.trial". (#8712)
2200 - twisted.protocols.postfix has been ported to Python 3 (#8713)
2201 - twisted.protocols.wire and twisted.protocols.portforwarding have
2202   been ported to Python 3 (#8717)
2203 - twisted.protocols.stateful has been ported to Python 3 (#8718)
2204 - twisted.protocols.memcache is now compatible with Python 3. (#8726)
2205 - twisted.protocols.dict has been ported to Python 3 (#8732)
2206
2207Bugfixes
2208--------
2209 - pip install -e ".[dev]" now works on Python 3, but it will not
2210   install twistedchecker or pydoctor, which have not yet been ported.
2211   (#7807)
2212 - twistd can now properly daemonize on Linux/Unix when run under
2213   Python3 and will not hang indefinitely. (#8155)
2214 - tox can now be used to run Twisted's tests on Windows (#8578)
2215 - twisted.python.filepath.setContent() and
2216   twisted.python.filepath.moveTo() now work on Windows with Python 3
2217   (#8610)
2218 - twisted.internet.win32eventreactor works on Python 3 in Windows
2219   (#8626)
2220 - The TLS payload buffer size was reduced in
2221   twisted.protocols.tls.TLSMemoryBIOProtocol.  This fixes writing of
2222   very long strings using the TLSv1_1 method from the OpenSSL
2223   library. (#8693)
2224 - twisted.logger._flatten.flattenEvent() now does not crash if passed
2225   a unicode string. (#8699)
2226 - twisted.application.strports.service (and thus twistd) no longer
2227   swallow asynchronous exceptions from IStreamServerEndpoint.listen.
2228   (#8710)
2229 - _twistd_unix now reports the name and encoded message of an
2230   exception raised during daemonization on Python 2 and 3. (#8731)
2231 - twisted.protocols.amp now handles floats on Python 3. Previously,
2232   sending a float would raise a ValueError. (#8746)
2233
2234Improved Documentation
2235----------------------
2236 - Some broken links to xprogramming in the unit test documentation
2237   have been fixed. (#8579)
2238 - The Twisted Tutorial "The Evolution of Finger" has been updated to
2239   use endpoints throughout. (#8588)
2240 - Updated the mail examples to use endpoints and better TLS. (#8595)
2241 - Changed the Twisted Web howto to use endpoints and modern TLS.
2242   (#8596)
2243 - Updated bug report URL in man pages. (#8600)
2244 - In twisted.internet.udp.Port, write() takes a parameter of type
2245   bytes.  This is clarified in the docstring. (#8635)
2246 - twisted.internet.interfaces.ITransport.write() and
2247   twisted.internet.interfaces.ITransport.writeSequence() take bytes
2248   parameters. (#8636)
2249 - twisted.python.filepath.AbstractFilePath.getContent() returns
2250   bytes.  The docstring was updated to clarify this. (#8637)
2251 - Updated release notes to reflect that 15.4 is the last version that
2252   supported Python 2.6, not 15.5. (#8651)
2253 - A missing space in defer.rst resulted in badly rendered output. The
2254   space was added. (#8723)
2255
2256Deprecations and Removals
2257-------------------------
2258 - Dropped support for pyOpenSSL versions less than 16.0.0. (#8441)
2259
2260Other
2261-----
2262 - #4926, #7868, #8209, #8271, #8276, #8308, #8324, #8348, #8367,
2263   #8377, #8378, #8379, #8380, #8381, #8383, #8385, #8386, #8387,
2264   #8388, #8389, #8391, #8392, #8393, #8394, #8397, #8406, #8410,
2265   #8412, #8413, #8414, #8421, #8425, #8426, #8428, #8429, #8430,
2266   #8432, #8434, #8435, #8437, #8438, #8439, #8444, #8451, #8452,
2267   #8453, #8454, #8456, #8457, #8459, #8462, #8463, #8465, #8468,
2268   #8469, #8479, #8482, #8483, #8486, #8490, #8493, #8494, #8496,
2269   #8497, #8498, #8499, #8501, #8503, #8504, #8507, #8508, #8510,
2270   #8513, #8514, #8515, #8516, #8517, #8520, #8521, #8522, #8523,
2271   #8524, #8527, #8528, #8529, #8531, #8532, #8534, #8536, #8537,
2272   #8538, #8540, #8541, #8543, #8548, #8552, #8553, #8554, #8555,
2273   #8557, #8560, #8563, #8565, #8568, #8569, #8572, #8573, #8574,
2274   #8577, #8580, #8581, #8582, #8584, #8586, #8589, #8590, #8592,
2275   #8593, #8598, #8603, #8604, #8606, #8609, #8615, #8616, #8617,
2276   #8618, #8619, #8621, #8624, #8627, #8628, #8630, #8632, #8634,
2277   #8640, #8644, #8645, #8646, #8647, #8648, #8662, #8664, #8666,
2278   #8668, #8671, #8672, #8684, #8691, #8702, #8703, #8705, #8706,
2279   #8716, #8719, #8724, #8725, #8727, #8733, #8734, #8741
2280
2281
2282Twisted Conch 16.4.0 (2016-08-25)
2283=================================
2284
2285Features
2286--------
2287 - twisted.conch.ssh.address is now ported to Python 3. (#8495)
2288 - twisted.conch.ssh.transport is now ported to Python 3. (#8638)
2289 - twisted.conch.ssh.channel is now ported to Python 3. (#8649)
2290 - twisted.conch.ssh.userauth is now ported to Python 3. (#8654)
2291 - twisted.conch.ssh.connection is now ported to Python 3. (#8660)
2292 - twisted.conch.ssh.session is now ported to Python 3. (#8661)
2293 - twisted.conch.ssh.filetransfer is now ported to Python 3. (#8675)
2294 - twisted.conch.ssh.agent is now ported to Python 3. (#8686)
2295 - twisted.conch.ssh is now ported to Python 3. (#8690)
2296 - twisted.conch.openssh_compat.* is now ported to Python 3. (#8694)
2297 - twisted.conch.client.knownhosts is now ported to Python 3. (#8697)
2298 - twisted.conch.insults.insults has been ported to Python 3 (#8698)
2299 - twisted.conch.client.default is now ported to Python 3. (#8700)
2300 - twisted.conch.recvline has been ported to Python 3 (#8709)
2301 - twisted.conch.endpoints is now ported to Python 3. (#8722)
2302
2303Bugfixes
2304--------
2305 - The SSHService is now a bytestring (#8653)
2306 - The name field in SShChannel is now a bytestring (#8683)
2307
2308Improved Documentation
2309----------------------
2310 - Fixed syntax errors in cftp man page. (#8601)
2311
2312Other
2313-----
2314 - #8495, #8511, #8715
2315
2316
2317Twisted Mail 16.4.0 (2016-08-25)
2318================================
2319
2320Deprecations and Removals
2321-------------------------
2322 - twisted.mail.mail.DomainWithDefaultDict.has_key is now deprecated
2323   in favor of the `in` keyword. (#8361)
2324 - twisted.mail.protocols.SSLContextFactory, deprecated since Twisted
2325   12.0, has been removed. (#8591)
2326
2327Other
2328-----
2329 - #8525
2330
2331
2332Twisted Names 16.4.0 (2016-08-25)
2333=================================
2334
2335Features
2336--------
2337 - twisted.names.srvconnect is now ported to Python 3. (#8262)
2338 - twisted.names.resolve and twisted.names.tap have been ported to
2339   Python 3 (#8550)
2340
2341Other
2342-----
2343 - #8625, #8663
2344
2345
2346Twisted News 16.4.0 (2016-08-25)
2347================================
2348
2349No significant changes have been made for this release.
2350
2351
2352Twisted Pair 16.4.0 (2016-08-25)
2353================================
2354
2355No significant changes have been made for this release.
2356
2357
2358Twisted Runner 16.4.0 (2016-08-25)
2359==================================
2360
2361Features
2362--------
2363 - twisted.runner has been ported to Python 3. (#8739)
2364
2365
2366Twisted Web 16.4.0 (2016-08-25)
2367===============================
2368
2369Features
2370--------
2371 - Twisted web HTTP/2 servers now time out HTTP/2 connections in the
2372   same manner as HTTP/1.1 connections. (#8480)
2373
2374Bugfixes
2375--------
2376 - A bug in twisted.web.server.Site.makeSession which may lead to
2377   predictable session IDs was fixed.  Session IDs are now generated
2378   securely using `os.urandom`. (#3460)
2379 - twisted.web.server.Request.getSession will now, for a request sent
2380   over HTTPS, set a "Secure" cookie, preventing the secure session
2381   from being sent over plain-text HTTP. (#3461)
2382 - If called multiple times, twisted.web.http.Request.setLastModified
2383   now correctly observes the greatest supplied value. (#3807)
2384 - The HTTP server now correctly times connections out. (broken in
2385   16.2) (#8481)
2386 - Twisted's HTTP/2 support no longer throws priority exceptions when
2387   WINDOW_UDPATE frames are received after a response has been
2388   completed. (#8558)
2389 - twisted.web.twcgi.CGIScript will now not pass the "Proxy" header to
2390   CGI scripts, as a mitigation to CVE-2016-1000111. (#8623)
2391 - Twisted Web's HTTP/2 server can now tolerate streams being reset by
2392   the client midway through a data upload without throwing
2393   exceptions. (#8682)
2394 - twisted.web.http.Request now swallows header writes on reset HTTP/2
2395   streams, rather than erroring out. (#8685)
2396 - twisted.web's HTTP/2 server now tolerates receiving WINDOW_UPDATE
2397   frames for streams for which it has no outstanding data to send.
2398   (#8695)
2399 - twisted.web.http.HTTPChannel now resumes producing on finished,
2400   non-persistent connections. This prevents HTTP/1 servers using TLS
2401   from leaking a CLOSE_WAIT socket per request. (#8766)
2402
2403Other
2404-----
2405 - #8519, #8530, #8629, #8707
2406
2407
2408Twisted Words 16.4.0 (2016-08-25)
2409=================================
2410
2411Features
2412--------
2413 - twisted.words.xish is now ported to Python 3 (#8337)
2414 - twisted.words.protocols.jabber is now ported to Python 3 (#8423)
2415 - twisted.words.protocols.irc.ERR_TOOMANYMATCHES was introduced
2416   according to the RFC 2812 errata. (#8585)
2417
2418Bugfixes
2419--------
2420 - twisted.words.protocols.irc.RPL_ADMINLOC was removed and replaced
2421   with twisted.words.protocols.irc.RPL_ADMINLOC1 and
2422   twisted.words.protocols.irc.RPL_ADMINLOC2 to match the admin
2423   commands defined in RFC 2812. (#8585)
2424 - twisted.words.protocols.jabber.sasl_mechanisms has been fixed for
2425   Python 3.3 (#8738)
2426
2427Improved Documentation
2428----------------------
2429 - The XMPP client example now works on Python 3. (#8509)
2430
2431Other
2432-----
2433 - #8360, #8460
2434
2435
2436Twisted Core 16.3.0 (2016-07-05)
2437================================
2438
2439Features
2440--------
2441 - Defined a new interface, IProtocolNegotiationFactory, that can be
2442   implemented by IOpenSSLClientConnectionCreator or
2443   IOpenSSLServerConnectionCreator factories to allow them to offer
2444   protocols for negotiation using ALPN or NPN during the TLS
2445   handshake. (#8188)
2446 - twisted.trial.unittest.SynchronousTestCase.assertRegex is now
2447   available to provide Python 2.7 and Python 3 compatibility. (#8372)
2448
2449Improved Documentation
2450----------------------
2451 - Development documentation has been updated to refer to Git instead
2452   of SVN. (#8335)
2453
2454Deprecations and Removals
2455-------------------------
2456 - twisted.python.reflect's deprecated functions have been removed.
2457   This includes funcinfo (deprecated since Twisted 2.5), allYourBase
2458   and accumulateBases (deprecated since Twisted 11.0), getcurrent and
2459   isinst (deprecated since Twisted 14.0). (#8293)
2460 - twisted.scripts.tap2deb and twisted.scripts.tap2rpm (along with the
2461   associated executables), deprecated since Twisted 15.2, have now
2462   been removed. (#8326)
2463 - twisted.spread.ui has been removed. (#8329)
2464 - twisted.manhole -- not to be confused with manhole in Conch -- has
2465   been removed. This includes the semi-functional Glade reactor, the
2466   manhole application, and the manhole-old twistd plugin. (#8330)
2467 - twisted.protocols.sip.DigestAuthorizer, BasicAuthorizer, and
2468   related functions have been removed. (#8445)
2469
2470Other
2471-----
2472 - #7229, #7826, #8290, #8323, #8331, #8336, #8341, #8344, #8345,
2473   #8347, #8351, #8363, #8365, #8366, #8374, #8382, #8384, #8390,
2474   #8395, #8396, #8398, #8399, #8400, #8401, #8403, #8404, #8405,
2475   #8407, #8408, #8409, #8415, #8416, #8417, #8418, #8419, #8420,
2476   #8427, #8433, #8436, #8461
2477
2478
2479Twisted Conch 16.3.0 (2016-07-05)
2480=================================
2481
2482No significant changes have been made for this release.
2483
2484
2485Twisted Mail 16.3.0 (2016-07-05)
2486================================
2487
2488No significant changes have been made for this release.
2489
2490
2491Twisted Names 16.3.0 (2016-07-05)
2492=================================
2493
2494Bugfixes
2495--------
2496 - twisted.names.client.Resolver as well as all resolvers inheriting
2497   from twisted.names.common.ResolverBase can now understand DNS
2498   answers that come back in a different case than the query. Example:
2499   querying for www.google.com and the answer comes back with an A
2500   record for www.google.COM will now work. (#8343)
2501
2502
2503Twisted News 16.3.0 (2016-07-05)
2504================================
2505
2506No significant changes have been made for this release.
2507
2508
2509Twisted Pair 16.3.0 (2016-07-05)
2510================================
2511
2512No significant changes have been made for this release.
2513
2514
2515Twisted Runner 16.3.0 (2016-07-05)
2516==================================
2517
2518No significant changes have been made for this release.
2519
2520
2521Twisted Web 16.3.0 (2016-07-05)
2522===============================
2523
2524Features
2525--------
2526 - twisted.web.http.HTTPChannel now implements ITransport. Along with
2527   this change, twisted.web.http.Request now directs all its writes to
2528   the HTTPChannel, rather than to the backing transport. This change
2529   is required for future HTTP/2 work. (#8191)
2530 - twisted.web.http.HTTPChannel now has a HTTP/2 implementation which
2531   will be used if the transport has negotiated using it through
2532   ALPN/NPN (see #8188). (#8194)
2533
2534Bugfixes
2535--------
2536 - twisted.web.client.Agent and twisted.web.client.ProxyAgent now add
2537   brackets to IPv6 literal addresses in the host header they send.
2538   (#8369)
2539 - The HTTP server now correctly times connections out. (broken in
2540   16.2) (#8481)
2541
2542Deprecations and Removals
2543-------------------------
2544 - twisted.web would previously dispatch pipelined requests
2545   simultaneously and queue the responses. This behaviour did not
2546   enforce any of the guarantees required by RFC 7230 or make it
2547   possible for users to enforce those requirements. For this reason,
2548   the parallel dispatch of requests has been removed. Pipelined
2549   requests are now processed serially. (#8320)
2550
2551
2552Twisted Words 16.3.0 (2016-07-05)
2553=================================
2554
2555No significant changes have been made for this release.
2556
2557
2558Twisted Core 16.2.0 (2016-05-18)
2559================================
2560
2561Features
2562--------
2563 - twisted.protocols.haproxy.proxyEndpoint provides an endpoint that
2564   wraps any other stream server endpoint with the PROXY protocol that
2565   retains information about the original client connection handled by
2566   the proxy; this wrapper is also exposed via the string description
2567   prefix 'haproxy'; for example 'twistd web --port haproxy:tcp:8765'.
2568   (#8203)
2569 - twisted.application.app.AppLogger (used by twistd) now uses the new
2570   logging system. (#8235)
2571
2572Bugfixes
2573--------
2574 - twisted.application-using applications (trial, twistd, etc) now
2575   work with the --reactor option on Python 3. (#8299)
2576 - Failures are now logged by STDLibLogObserver. (#8316)
2577
2578Improved Documentation
2579----------------------
2580 - Deprecation documentation was extended to include a quick check
2581   list for developers. (#5645)
2582 - The Twisted Deprecation Policy is now documented in the Twisted
2583   Development Policy. (#8082)
2584 - The documentation examples for UDP now work on Python 3. (#8280)
2585
2586Deprecations and Removals
2587-------------------------
2588 - Passing a factory that produces log observers that do not implement
2589   twisted.logger.ILogObserver or twisted.python.log.ILogObserver to
2590   twisted.application.app.AppLogger has been deprecated. This is
2591   primarily used by twistd's --logger option. Please use factories
2592   that produce log observers implementing twisted.logger.ILogObserver
2593   or the legacy twisted.python.log.ILogObserver. (#8235)
2594 - twisted.internet.qtreactor, a stub that imported the external
2595   qtreactor, has been removed. (#8288)
2596
2597Other
2598-----
2599 - #6266, #8231, #8244, #8256, #8266, #8269, #8275, #8277, #8286,
2600   #8291, #8292, #8304, #8315
2601
2602
2603Twisted Conch 16.2.0 (2016-05-18)
2604=================================
2605
2606No significant changes have been made for this release.
2607
2608Other
2609-----
2610 - #8279
2611
2612
2613Twisted Mail 16.2.0 (2016-05-18)
2614================================
2615
2616No significant changes have been made for this release.
2617
2618
2619Twisted Names 16.2.0 (2016-05-18)
2620=================================
2621
2622Features
2623--------
2624 - twisted.names.server is now ported to Python 3 (#8195)
2625 - twisted.names.authority and twisted.names.secondary have been
2626   ported to Python 3 (#8259)
2627
2628
2629Twisted News 16.2.0 (2016-05-18)
2630================================
2631
2632No significant changes have been made for this release.
2633
2634
2635Twisted Pair 16.2.0 (2016-05-18)
2636================================
2637
2638No significant changes have been made for this release.
2639
2640
2641Twisted Runner 16.2.0 (2016-05-18)
2642==================================
2643
2644Deprecations and Removals
2645-------------------------
2646 - twisted.runner.inetdtap and twisted.runner.inetdconf RPC support
2647   was deprecated as it was broken for a long time. (#8123)
2648
2649
2650Twisted Web 16.2.0 (2016-05-18)
2651===============================
2652
2653Features
2654--------
2655 - twisted.web.http.HTTPFactory's constructor now accepts a reactor
2656   argument, for explicit reactor selection. (#8246)
2657
2658Bugfixes
2659--------
2660 - twisted.web.http.HTTPChannel.headerReceived now respond with 400
2661   and disconnect when a malformed header is received. (#8101)
2662 - twisted.web.http.Request once again has a reference to the
2663   HTTPFactory which created it, the absence of which was preventing
2664   log messages from being created.  (#8272)
2665 - twisted.web.http.HTTPChannel no longer processes requests that have
2666   invalid headers as the final header in their header block. (#8317)
2667 - twisted.web.client.HTTPClientFactory (and the getPage and
2668   downloadPage APIs) now timeouts correctly on TLS connections where
2669   the remote party is not responding on the connection. (#8318)
2670
2671Other
2672-----
2673 - #8300
2674
2675
2676Twisted Words 16.2.0 (2016-05-18)
2677=================================
2678
2679Deprecations and Removals
2680-------------------------
2681 - twisted.words.protocols.msn, deprecated since Twisted 15.1, has
2682   been removed. (#8253)
2683 - twisted.words.protocols.oscar is deprecated. (#8260)
2684
2685
2686Twisted Core 16.1.1 (2016-04-08)
2687================================
2688
2689No significant changes have been made for this release.
2690
2691
2692Twisted Conch 16.1.1 (2016-04-08)
2693=================================
2694
2695No significant changes have been made for this release.
2696
2697
2698Twisted Mail 16.1.1 (2016-04-08)
2699================================
2700
2701No significant changes have been made for this release.
2702
2703
2704Twisted Names 16.1.1 (2016-04-08)
2705=================================
2706
2707No significant changes have been made for this release.
2708
2709
2710Twisted News 16.1.1 (2016-04-08)
2711================================
2712
2713No significant changes have been made for this release.
2714
2715
2716Twisted Pair 16.1.1 (2016-04-08)
2717================================
2718
2719No significant changes have been made for this release.
2720
2721
2722Twisted Runner 16.1.1 (2016-04-08)
2723==================================
2724
2725No significant changes have been made for this release.
2726
2727
2728Twisted Web 16.1.1 (2016-04-08)
2729===============================
2730
2731Bugfixes
2732--------
2733 - twisted.web.http.Request once again has a reference to the
2734   HTTPFactory which created it, the absence of which was preventing
2735   log messages from being created.  (#8272)
2736
2737
2738Twisted Words 16.1.1 (2016-04-08)
2739=================================
2740
2741No significant changes have been made for this release.
2742
2743
2744Twisted Core 16.1.0 (2016-04-04)
2745================================
2746
2747Features
2748--------
2749 - twisted.application.internet.ClientService, a service that
2750   maintains a persistent outgoing endpoint-based connection; a
2751   replacement for ReconnectingClientFactory that uses modern APIs.
2752   (#4735)
2753 - Twisted now uses setuptools' sdist to build tarballs. (#7985)
2754
2755Bugfixes
2756--------
2757 - Twisted is now compatible with OpenSSL 1.0.2f. (#8189)
2758
2759Other
2760-----
2761 - #4543, #8124, #8193, #8210, #8220, #8223, #8226, #8242
2762
2763
2764Twisted Conch 16.1.0 (2016-04-04)
2765=================================
2766
2767Features
2768--------
2769 - twisted.conch.checkers is now ported to Python 3. (#8225)
2770 - twisted.conch.telnet is now ported to Python 3. (#8228)
2771 - twisted.conch.manhole_ssh.ConchFactory (used by `twistd manhole`)
2772   no longer uses a hardcoded SSH server key, and will generate a
2773   persistent one, saving it in your user appdir. If you use
2774   ConchFactory, you will now need to provide your own SSH server key.
2775   (#8229)
2776
2777Other
2778-----
2779 - #8237, #8240
2780
2781
2782Twisted Mail 16.1.0 (2016-04-04)
2783================================
2784
2785No significant changes have been made for this release.
2786
2787
2788Twisted Names 16.1.0 (2016-04-04)
2789=================================
2790
2791No significant changes have been made for this release.
2792
2793
2794Twisted News 16.1.0 (2016-04-04)
2795================================
2796
2797No significant changes have been made for this release.
2798
2799
2800Twisted Pair 16.1.0 (2016-04-04)
2801================================
2802
2803No significant changes have been made for this release.
2804
2805
2806Twisted Runner 16.1.0 (2016-04-04)
2807==================================
2808
2809No significant changes have been made for this release.
2810
2811
2812Twisted Web 16.1.0 (2016-04-04)
2813===============================
2814
2815Features
2816--------
2817 - twisted.web.http.Request.addCookie now supports both unicode and
2818   bytes arguments, with unicode arguments being encoded to UTF-8.
2819   (#8067)
2820
2821Bugfixes
2822--------
2823 - twisted.web.util.DeferredResource no longer causes spurious
2824   "Unhandled error in Deferred" log messages. (#8192)
2825 - twisted.web.server.site.makeSession now generates an uid of type
2826   bytes on both Python 2 and 3. (#8215)
2827
2828Other
2829-----
2830 - #8238
2831
2832
2833Twisted Words 16.1.0 (2016-04-04)
2834=================================
2835
2836No significant changes have been made for this release.
2837
2838
2839Twisted Core 16.0.0 (2016-03-10)
2840================================
2841
2842Features
2843--------
2844 - todo parameter for IReporter.addExpectedSuccess and
2845   IReporter.addUnexpectedSuccess is no longer required. If not
2846   provided, a sensible default will be used instead. (#4811)
2847 - A new string endpoint type, "tls:", allows for properly-verified
2848   TLS (unlike "ssl:", always matching hostname resolution with
2849   certificate hostname verification) with faster IPv4/IPv6
2850   connections.  This comes with an accompanying function,
2851   twisted.internet.endpoints.wrapClientTLS, which can wrap an
2852   arbitrary client endpoint with client TLS. (#5642)
2853 - twisted.python.filepath.makedirs accepts an ignoreExistingDirectory
2854   flag which ignore the OSError raised by os.makedirs if requested
2855   directory already exists. (#5704)
2856 - twisted.protocols.amp has been ported to Python 3. (#6833)
2857 - twisted.internet.ssl.trustRootFromCertificates returns an object
2858   suitable for use as trustRoot= to
2859   twisted.internet.ssl.optionsForClientTLS that trusts multiple
2860   certificates. (#7671)
2861 - twisted.python.roots is now ported to Python 3. (#8131)
2862 - twisted.cred.strports has been ported to Python 3. (#8216)
2863
2864Bugfixes
2865--------
2866 - Expected failures from standard library unittest no longer fail
2867   with Trial reporters. (#4811)
2868 - twisted.internet.endpoints.HostnameEndpoint.connect no longer fails
2869   with an AlreadyCalledError when the Deferred it returns is
2870   cancelled after all outgoing connection attempts have been made but
2871   none have yet succeeded or failed. (#8014)
2872 - twisted.internet.task.LoopingCall.withCount when run with internal
2873   of 0, now calls the countCallable with 1, regardless of the time
2874   passed between calls. (#8125)
2875 - twisted.internet.endpoints.serverFromString, when parsing a SSL
2876   strports definition, now gives the correct error message when an
2877   empty chain file is given. (#8222)
2878
2879Improved Documentation
2880----------------------
2881 - The Twisted Project has adopted the Contributor Covenant as its
2882   Code of Conduct. (#8173)
2883
2884Deprecations and Removals
2885-------------------------
2886 - twisted.internet.task.LoopingCall.deferred is now deprecated. Use
2887   the deferred returned by twisted.internet.task.LoopingCall.start()
2888   (#8116)
2889 - twisted.internet.gtkreactor, the GTK+ 1 reactor deprecated since
2890   Twisted 10.1, has been removed. This does not affect the GTK2,
2891   GLib, GTK3, or GObject-Introspection reactors. (#8145)
2892 - twisted.protocols.mice, containing a Logitech MouseMan serial
2893   driver, has been deprecated. (#8148)
2894 - The __version__ attribute of former subprojects (conch, mail,
2895   names, news, pair, runner, web, and words) is deprecated in
2896   preference to the central twisted.__version__. (#8219)
2897
2898Other
2899-----
2900 - #6842, #6978, #7668, #7791, #7881, #7943, #7944, #8050, #8104,
2901   #8115, #8119, #8122, #8139, #8144, #8154, #8162, #8180, #8187,
2902   #8220
2903
2904
2905Twisted Conch 16.0.0 (2016-03-10)
2906=================================
2907
2908Features
2909--------
2910 - twisted.conch now uses cryptography instead of PyCrypto for its
2911   underlying crypto operations. (#7413)
2912 - twisted.conch.ssh.keys is now ported to Python 3. (#7998)
2913
2914Bugfixes
2915--------
2916 - twisted.conch.ssh.channel.SSHChannel's getPeer and getHost methods
2917   now return an object which provides IAddress instead of an old-
2918   style tuple address. (#5999)
2919 - twisted.conch.endpoint.SSHCommandClientEndpoint, when
2920   authentication is delegated to an SSH agent, no longer leaves the
2921   agent connection opened when connection to the server is lost.
2922   (#8138)
2923
2924Other
2925-----
2926 - #7037, #7715, #8200, #8208
2927
2928
2929Twisted Mail 16.0.0 (2016-03-10)
2930================================
2931
2932No significant changes have been made for this release.
2933
2934
2935Twisted Names 16.0.0 (2016-03-10)
2936=================================
2937
2938No significant changes have been made for this release.
2939
2940
2941Twisted News 16.0.0 (2016-03-10)
2942================================
2943
2944No significant changes have been made for this release.
2945
2946
2947Twisted Pair 16.0.0 (2016-03-10)
2948================================
2949
2950No significant changes have been made for this release.
2951
2952
2953Twisted Runner 16.0.0 (2016-03-10)
2954==================================
2955
2956No significant changes have been made for this release.
2957
2958
2959Twisted Web 16.0.0 (2016-03-10)
2960===============================
2961
2962Features
2963--------
2964 - twisted.web.http_headers._DictHeaders now correctly handles
2965   updating via keyword arguments in Python 3 (therefore
2966   twisted.web.http_headers is now fully ported to Python 3). (#6082)
2967 - twisted.web.wsgi has been ported to Python 3. (#7993)
2968 - twisted.web.http_headers.Headers now accepts both Unicode and
2969   bytestring keys and values, encoding to iso-8859-1 and utf8
2970   respectively. (#8129)
2971 - twisted.web.vhost ported to Python 3. (#8132)
2972
2973Bugfixes
2974--------
2975 - twisted.web.http.HTTPChannel now correctly handles non-ascii method
2976   name by returning 400. Previously non-ascii method name was causing
2977   unhandled exceptions. (#8102)
2978 - twisted.web.static.File on Python 3 now redirects paths to
2979   directories without a trailing slash, to a path with a trailing
2980   slash, as on Python 2. (#8169)
2981
2982Deprecations and Removals
2983-------------------------
2984 - twisted.web.http.Request's headers and received_headers attributes,
2985   deprecated since Twisted 13.2, have been removed. (#8136)
2986 - twisted.web.static.addSlash is deprecated. (#8169)
2987
2988Other
2989-----
2990 - #8140, #8182
2991
2992
2993Twisted Words 16.0.0 (2016-03-10)
2994=================================
2995
2996No significant changes have been made for this release.
2997
2998
2999Twisted Core 15.5.0 (2015-11-28)
3000================================
3001
3002Python 3.5 (on POSIX) support has been added.
3003
3004This release introduces changes that are required for Conch's SSH
3005implementation to work with OpenSSH 6.9+ servers.
3006
3007Features
3008--------
3009 - twisted.python.url is a new abstraction for URLs, supporting RFC
3010   3987 IRIs. (#5388)
3011 - twisted.python.logfile is now ported to Python 3. (#6749)
3012 - twisted.python.zippath has been ported to Python 3. (#6917)
3013 - twisted.internet.ssl.CertificateOptions and
3014   twisted.internet.ssl.optionsForClientTLS now take a
3015   acceptableProtocols parameter that enables negotiation of the next
3016   protocol to speak after the TLS handshake has completed. This field
3017   advertises protocols over both NPN and ALPN. Also added new
3018   INegotiated interface for TLS interfaces that support protocol
3019   negotiation. This interface adds a negotiatedProtocol property that
3020   reports what protocol, if any, was negotiated in the TLS handshake.
3021   (#7860)
3022 - twisted.python.urlpath.URLPath now operates correctly on Python 3,
3023   using bytes instead of strings, and introduces the fromBytes
3024   constructor to assist with creating them cross-version. (#7994)
3025 - twisted.application.strports is now ported to Python 3. (#8011)
3026 - twistd (the Twisted Daemon) is now ported to Python 3. (#8012)
3027 - Python 3.5 is now supported on POSIX platforms. (#8042)
3028 - twisted.internet.serialport is now ported on Python 3. (#8099)
3029
3030Bugfixes
3031--------
3032 - twisted.logger.formatEvent now can format an event if it was
3033   flattened (twisted.logger.eventAsJSON does this) and has text after
3034   the last replacement field. (#8003)
3035 - twisted.cred.checkers.FilePasswordDB now logs an error if the
3036   credentials db file does not exist, no longer raises an unhandled
3037   error. (#8028)
3038 - twisted.python.threadpool.ThreadPool now properly starts enough
3039   threads to do any work scheduled before ThreadPool.start() is
3040   called, such as when work is scheduled in the reactor via
3041   reactor.callInThread() before reactor.run(). (#8090)
3042
3043Improved Documentation
3044----------------------
3045 - Twisted Development test standard documentation now contain
3046   information about avoiding test data files. (#6535)
3047 - The documentation for twisted.internet.defer.DeferredSemaphore now
3048   describes the actual usage for limit and tokens instance
3049   attributes. (#8024)
3050
3051Deprecations and Removals
3052-------------------------
3053 - twisted.python._initgroups, a C extension, has been removed and
3054   stdlib support is now always used instead. (#5861)
3055 - Python 2.6 is no longer supported. (#8017)
3056 - twisted.python.util.OrderedDict is now deprecated, and uses of it
3057   in Twisted are replaced with collections.OrderedDict. (#8051)
3058 - twisted.persisted.sob.load, twisted.persisted.sob.loadValueFromFile
3059   and twisted.persisted.sob.Persistent.save() are now deprecated when
3060   used with a passphrase. The encyption used by these methods are
3061   weak. (#8081)
3062 - twisted.internet.interfaces.IStreamClientEndpointStringParser has
3063   been removed and Twisted will no longer use parsers implementing
3064   this interface. (#8094)
3065
3066Other
3067-----
3068 - #5976, #6628, #6894, #6980, #7228, #7693, #7731, #7997, #8046,
3069   #8054, #8056, #8060, #8063, #8064, #8068, #8072, #8091, #8095,
3070   #8096, #8098, #8106
3071
3072
3073Twisted Conch 15.5.0 (2015-11-18)
3074=================================
3075
3076Features
3077--------
3078 - twisted.conch.ssh now supports the diffie-hellman-group-exchange-
3079   sha256 key exchange algorithm. (#7672)
3080 - twisted.conch.ssh now supports the diffie-hellman-group14-sha1 key
3081   exchange algorithm. (#7717)
3082 - twisted.conch.ssh.transport.SSHClientTransport now supports Diffie-
3083   Hellman key exchange using MSG_KEX_DH_GEX_REQUEST as described in
3084   RFC 4419. (#8100)
3085 - twisted.conch.ssh now supports the hmac-sha2-256 and hmac-sha2-512
3086   MAC algorithms. (#8108)
3087
3088Deprecations and Removals
3089-------------------------
3090 - twisted.conch.ssh.keys.objectType is now deprecated. Use
3091   twisted.conch.ssh.keys.Key.sshType. (#8080)
3092 - twisted.conch.ssh.transport.SSHClientTransport no longer supports
3093   Diffie-Hellman key exchange using MSG_KEX_DH_GEX_REQUEST_OLD for
3094   pre RFC 4419 servers. (#8100)
3095
3096
3097Twisted Mail 15.5.0 (2015-11-18)
3098================================
3099
3100No significant changes have been made for this release.
3101
3102
3103Twisted Names 15.5.0 (2015-11-18)
3104=================================
3105
3106No significant changes have been made for this release.
3107
3108
3109Twisted News 15.5.0 (2015-11-18)
3110================================
3111
3112No significant changes have been made for this release.
3113
3114
3115Twisted Pair 15.5.0 (2015-11-18)
3116================================
3117
3118No significant changes have been made for this release.
3119
3120
3121Twisted Runner 15.5.0 (2015-11-18)
3122==================================
3123
3124No significant changes have been made for this release.
3125
3126
3127Twisted Web 15.5.0 (2015-11-18)
3128================================
3129
3130Features
3131--------
3132 - twisted.web.http.Request.addCookie now supports the httpOnly
3133   attribute which when set on cookies prevents the browser exposing
3134   it through channels other than HTTP and HTTPS requests (i.e. they
3135   will not be accessible through JavaScript). (#5911)
3136 - twisted.web.client.downloadPage is now ported to Python 3. (#6197)
3137 - twisted.web.client.Agent is now ported to Python 3. (#7407)
3138 - twisted.web.tap (ran when calling `twistd web`) has now been ported
3139   to Python 3. Not all features are enabled -- CGI, WSGI, and
3140   distributed web serving will be enabled in their respective tickets
3141   as they are ported. (#8008)
3142
3143Bugfixes
3144--------
3145 - twisted.web.client.URI now supports IPv6 addresses. Previously this
3146   would mistake the colons used as IPv6 address group separators as
3147   the start of a port specification. (#7650)
3148 - twisted.web.util's failure template has been moved inline to work
3149   around Python 3 distribution issues. (#8047)
3150 - twisted.web.http.Request on Python 3 now handles multipart/form-
3151   data requests correctly. (#8052)
3152
3153Other
3154-----
3155 - #8016, #8070
3156
3157
3158Twisted Words 15.5.0 (2015-11-18)
3159=================================
3160
3161Features
3162--------
3163 - twisted.words.protocol.irc.IRC now has a sendCommand() method which
3164   can send messages with tags. (#6667)
3165
3166Other
3167-----
3168 - #8015, #8097
3169
3170
3171Twisted Core 15.4.0 (2015-09-04)
3172================================
3173
3174This is the last Twisted release where Python 2.6 is supported, on any
3175platform.
3176
3177Features
3178--------
3179 - Trial has been ported to Python 3. (#5965)
3180 - Twisted now requires setuptools for installation. (#7177)
3181 - twisted.internet.endpoints.clientFromString is now ported to Python
3182   3. (#7973)
3183 - twisted.internet._sslverify now uses SHA256 instead of MD5 for
3184   certificate request signing by default. (#7979)
3185 - twisted.internet.endpoints.serverFromString is now ported to Python
3186   3. (#7982)
3187 - twisted.positioning is now ported to Python 3. (#7987)
3188 - twisted.python.failure.Failure's __repr__ now includes the
3189   exception message. (#8004)
3190
3191Bugfixes
3192--------
3193 - fixed a bug which could lead to a hang at shutdown in
3194   twisted.python.threadpool. (#2673)
3195 - twisted.internet.kqreactor on Python 3 now supports EINTR
3196   (Control-C) gracefully. (#7887)
3197 - Fix a bug introduced in 15.3.0; pickling a lambda function after
3198   importing twisted.persisted.styles raises PicklingError rather than
3199   AttributeError. (#7989)
3200
3201Other
3202-----
3203 - #7902, #7980, #7990, #7992
3204
3205
3206Twisted Conch 15.4.0 (2015-09-04)
3207=================================
3208
3209No significant changes have been made for this release.
3210
3211Other
3212-----
3213 - #7977
3214
3215
3216Twisted Mail 15.4.0 (2015-09-04)
3217================================
3218
3219No significant changes have been made for this release.
3220
3221
3222Twisted Names 15.4.0 (2015-09-04)
3223=================================
3224
3225No significant changes have been made for this release.
3226
3227
3228Twisted News 15.4.0 (2015-09-04)
3229================================
3230
3231No significant changes have been made for this release.
3232
3233
3234Twisted Pair 15.4.0 (2015-09-04)
3235================================
3236
3237No significant changes have been made for this release.
3238
3239
3240Twisted Runner 15.4.0 (2015-09-04)
3241==================================
3242
3243No significant changes have been made for this release.
3244
3245
3246Twisted Web 15.4.0 (2015-09-04)
3247===============================
3248
3249Features
3250--------
3251 - twisted.web.proxy is now ported to Python 3. (#7939)
3252 - twisted.web.guard is now ported to Python 3. (#7974)
3253
3254Bugfixes
3255--------
3256 - twisted.web.http.Request.setResponseCode now only allows bytes
3257   messages. (#7981)
3258 - twisted.web.server.Request.processingFailed will now correctly
3259   write out the traceback on Python 3. (#7996)
3260
3261
3262Twisted Words 15.4.0 (2015-09-04)
3263=================================
3264
3265No significant changes have been made for this release.
3266
3267
3268Twisted Core 15.3.0 (2015-08-04)
3269================================
3270
3271Features
3272--------
3273 - twisted.application.app is now ported to Python 3 (#6914)
3274 - twisted.plugin now supports Python 3 (#7182)
3275 - twisted.cred.checkers is now ported to Python 3. (#7834)
3276 - twisted.internet.unix is now ported to Python 3. (#7874)
3277 - twisted.python.sendmsg has now been ported to Python 3, using the
3278   stdlib sendmsg/recvmsg functionality when available. (#7884)
3279 - twisted.internet.protocol.Factory now uses the new logging system
3280   (twisted.logger) for all its logging statements. (#7897)
3281 - twisted.internet.stdio is now ported to Python 3. (#7899)
3282 - The isDocker method has been introduced on
3283   twisted.python.runtime.Platform to detect if the running Python is
3284   inside a Docker container. Additionally, Platform.supportsINotify()
3285   now returns False if isDocker() is True, because of many Docker
3286   storage layers having broken INotify. (#7968)
3287
3288Bugfixes
3289--------
3290 - twisted.logger.LogBeginner.beginLoggingTo now outputs the correct
3291   warning when it is called more than once. (#7916)
3292
3293Deprecations and Removals
3294-------------------------
3295 - twisted.cred.pamauth (providing PAM support) has been removed due
3296   to it being unusable in current supported Python versions. (#3728)
3297 - twisted.application.app.HotshotRunner (twistd's hotshot profiler
3298   module) is removed and twistd now uses cProfile by default. (#5137)
3299 - twisted.python.win32.getProgramsMenuPath and
3300   twisted.python.win32.getProgramFilesPath are now deprecated.
3301   (#7883)
3302 - twisted.lore has now been removed, in preference to Sphinx. (#7892)
3303 - Deprecated zsh tab-complete files are now removed in preference to
3304   twisted.python.usage's tab-complete functionality. (#7898)
3305 - twisted.python.hashlib, deprecated since 13.1, has now been
3306   removed. (#7905)
3307 - twisted.trial.runner.DryRunVisitor, deprecated in Twisted 13.0, has
3308   now been removed. (#7919)
3309 - twisted.trial.util.getPythonContainers, deprecated since Twisted
3310   12.3, is now removed. (#7920)
3311 - Twisted no longer supports being packaged as subprojects. (#7964)
3312
3313Other
3314-----
3315 - #6136, #7035, #7803, #7817, #7827, #7844, #7876, #7906, #7908,
3316   #7915, #7931, #7940, #7967, #7983
3317
3318
3319Twisted Conch 15.3.0 (2015-08-04)
3320=================================
3321
3322Bugfixes
3323--------
3324 - The Conch Unix server now sets the HOME environment variable when
3325   executing commands. (#7936)
3326
3327Other
3328-----
3329 - #7937
3330
3331
3332Twisted Mail 15.3.0 (2015-08-04)
3333================================
3334
3335No significant changes have been made for this release.
3336
3337
3338Twisted Names 15.3.0 (2015-08-04)
3339=================================
3340
3341No significant changes have been made for this release.
3342
3343
3344Twisted News 15.3.0 (2015-08-04)
3345================================
3346
3347No significant changes have been made for this release.
3348
3349
3350Twisted Pair 15.3.0 (2015-08-04)
3351================================
3352
3353No significant changes have been made for this release.
3354
3355
3356Twisted Runner 15.3.0 (2015-08-04)
3357==================================
3358
3359No significant changes have been made for this release.
3360
3361
3362Twisted Web 15.3.0 (2015-08-04)
3363===============================
3364
3365Features
3366--------
3367 - twisted.web.xmlrpc is now ported to Python 3. (#7795)
3368 - twisted.web.template and twisted.web.util are now ported to Python
3369   3. (#7811)
3370 - twisted.web.error is now ported to Python 3. (#7845)
3371
3372Deprecations and Removals
3373-------------------------
3374 - twisted.web.html is now deprecated in favor of
3375   twisted.web.template. (#4948)
3376
3377Other
3378-----
3379 - #7895, #7942, #7949, #7952, #7975
3380
3381
3382Twisted Words 15.3.0 (2015-08-04)
3383=================================
3384
3385No significant changes have been made for this release.
3386
3387
3388Twisted Core 15.2.1 (2015-05-23)
3389================================
3390
3391Bugfixes
3392--------
3393 - twisted.logger now marks the `isError` key correctly on legacy
3394   events generated by writes to stderr. (#7903)
3395
3396Improved Documentation
3397----------------------
3398 - twisted.logger's documentation is now correctly listed in the table
3399   of contents. (#7904)
3400
3401
3402Twisted Conch 15.2.1 (2015-05-23)
3403=================================
3404
3405No significant changes have been made for this release.
3406
3407
3408Twisted Lore 15.2.1 (2015-05-23)
3409================================
3410
3411No significant changes have been made for this release.
3412
3413
3414Twisted Mail 15.2.1 (2015-05-23)
3415================================
3416
3417No significant changes have been made for this release.
3418
3419
3420Twisted Names 15.2.1 (2015-05-23)
3421=================================
3422
3423No significant changes have been made for this release.
3424
3425
3426Twisted News 15.2.1 (2015-05-23)
3427================================
3428
3429No significant changes have been made for this release.
3430
3431
3432Twisted Pair 15.2.1 (2015-05-23)
3433================================
3434
3435No significant changes have been made for this release.
3436
3437
3438Twisted Runner 15.2.1 (2015-05-23)
3439==================================
3440
3441No significant changes have been made for this release.
3442
3443
3444Twisted Web 15.2.1 (2015-05-23)
3445===============================
3446
3447No significant changes have been made for this release.
3448
3449
3450Twisted Words 15.2.1 (2015-05-23)
3451=================================
3452
3453No significant changes have been made for this release.
3454
3455
3456Twisted Core 15.2.0 (2015-05-18)
3457================================
3458
3459Features
3460--------
3461 - twisted.internet.process has now been ported to Python 3. (#5987)
3462 - twisted.cred.credentials is now ported to Python 3. (#6176)
3463 - twisted.trial.unittest.TestCase's assertEqual, assertTrue, and
3464   assertFalse methods now pass through the standard library's more
3465   informative failure messages. (#6306)
3466 - The new package twisted.logger provides a new, fully tested, and
3467   feature-rich logging framework. The old module twisted.python.log
3468   is now implemented using the new framework. The new logger HOWTO
3469   documents the new framework. (#6750)
3470 - twisted.python.modules is now ported to Python 3. (#7804)
3471 - twisted.python.filepath.FilePath now supports Unicode (text) paths.
3472   Like the os module, instantiating it with a Unicode path will
3473   return a Unicode-mode FilePath, instantiating with a bytes path
3474   will return a bytes-mode FilePath. (#7805)
3475 - twisted.internet.kqreactor is now ported to Python 3 (#7823)
3476 - twisted.internet.endpoints.ProcessEndpoint is now ported to Python
3477   3. (#7824)
3478 - twisted.python.filepath.FilePath now has asBytesMode and asTextMode
3479   methods which return a FilePath in the requested mode. (#7830)
3480 - twisted.python.components.proxyForInterface now creates method
3481   proxies that can be used with functools.wraps. (#7832)
3482 - The tls optional dependency will now also install the idna package
3483   to validate idna2008 names. (#7853)
3484
3485Bugfixes
3486--------
3487 - Don't raise an exception if `DefaultLogObserver.emit()` gets an
3488   event with a message that raises when `repr()` is called on it.
3489   Specifically: use `textFromEventDict()` instead of a separate (and
3490   inferior) message rendering implementation. (#6569)
3491 - twisted.cred.credentials.DigestedCredentials incorrectly handled
3492   md5-sess hashing according to the RFC, which has now been fixed.
3493   (#7835)
3494 - Fixed an issue with twisted.internet.task.LoopingCall.withCount
3495   where sometimes the passed callable would be invoked with "0" when
3496   we got close to tricky floating point boundary conditions. (#7836)
3497 - twisted.internet.defer now properly works with the new logging
3498   system. (#7851)
3499 - Change `messages` key to `log_io` for events generated by
3500   `LoggingFile`. (#7852)
3501 - twisted.logger had literal characters in docstrings that are now
3502   quoted. (#7854)
3503 - twisted.logger now correctly formats a log event with a key named
3504   `message` when passed to a legacy log observer. (#7855)
3505 - twisted.internet.endpoints.HostnameEndpoint now uses getaddrinfo
3506   properly on Python 3.4 and above. (#7886)
3507
3508Improved Documentation
3509----------------------
3510 - Fix a typo in narrative documentation for logger (#7875)
3511
3512Deprecations and Removals
3513-------------------------
3514 - tkunzip and tapconvert in twisted.scripts were deprecated in 11.0
3515   and 12.1 respectively, and are now removed. (#6747)
3516 - twisted.protocols.gps is deprecated in preference to
3517   twisted.positioning. (#6810)
3518 - twisted.scripts.tap2deb and twisted.scripts.tap2rpm are now
3519   deprecated. (#7682)
3520 - twisted.trial.reporter.TestResult and
3521   twisted.trial.reporter.Reporter contained deprecated methods (since
3522   8.0) which have now been removed. (#7815)
3523
3524Other
3525-----
3526 - #6027, #7287, #7701, #7727, #7758, #7776, #7786, #7812, #7819,
3527   #7831, #7838, #7865, #7866, #7869, #7872, #7877, #7878, #7885
3528
3529
3530Twisted Conch 15.2.0 (2015-05-18)
3531=================================
3532
3533Features
3534--------
3535 - twisted.conch.ssh.forwarding now supports local->remote forwarding
3536   of IPv6 (#7751)
3537
3538
3539Twisted Lore 15.2.0 (2015-05-18)
3540================================
3541
3542No significant changes have been made for this release.
3543
3544
3545Twisted Mail 15.2.0 (2015-05-18)
3546================================
3547
3548Features
3549--------
3550 - twisted.mail.smtp.sendmail now uses ESMTP. It will
3551   opportunistically enable encryption and allow the use of
3552   authentication. (#7257)
3553
3554
3555Twisted Names 15.2.0 (2015-05-18)
3556=================================
3557
3558No significant changes have been made for this release.
3559
3560
3561Twisted News 15.2.0 (2015-05-18)
3562================================
3563
3564No significant changes have been made for this release.
3565
3566
3567Twisted Pair 15.2.0 (2015-05-18)
3568================================
3569
3570No significant changes have been made for this release.
3571
3572
3573Twisted Runner 15.2.0 (2015-05-18)
3574==================================
3575
3576No significant changes have been made for this release.
3577
3578
3579Twisted Web 15.2.0 (2015-05-18)
3580===============================
3581
3582Features
3583--------
3584 - twisted.web.static is now ported to Python 3. (#6177)
3585 - twisted.web.server.Site accepts requestFactory as constructor
3586   argument. (#7016)
3587
3588Deprecations and Removals
3589-------------------------
3590 - twisted.web.util had some HTML generation functions deprecated
3591   since 12.1 that have now been removed. (#7828)
3592
3593Other
3594-----
3595 - #6927, #7797, #7802, #7846
3596
3597
3598Twisted Words 15.2.0 (2015-05-18)
3599=================================
3600
3601Bugfixes
3602--------
3603 - The resumeOffset argument to
3604   twisted.words.protocol.irc.DccFileReceive now works as it is
3605   documented. (#7775)
3606
3607
3608Twisted Core 15.1.0 (2015-04-02)
3609================================
3610
3611Features
3612--------
3613 - Optional dependencies can be installed using the extra_requires
3614   facility provided by setuptools. (#3696)
3615
3616Improved Documentation
3617----------------------
3618 - Twisted Trial's basics documentation now has a link to the
3619   documentation about how Trial finds tests. (#4526)
3620
3621Deprecations and Removals
3622-------------------------
3623 - twisted.application.internet.UDPClient, deprecated since Twisted
3624   13.1.0, has been removed. (#7702)
3625
3626Other
3627-----
3628 - #6988, #7005, #7006, #7007, #7008, #7044, #7335, #7666, #7723,
3629   #7724, #7725, #7748, #7763, #7765, #7766, #7768
3630
3631
3632Twisted Conch 15.1.0 (2015-04-02)
3633=================================
3634
3635No significant changes have been made for this release.
3636
3637
3638Twisted Lore 15.1.0 (2015-04-02)
3639================================
3640
3641No significant changes have been made for this release.
3642
3643
3644Twisted Mail 15.1.0 (2015-04-02)
3645================================
3646
3647Bugfixes
3648--------
3649 - twisted.mail.smtp.ESMTPClient now does not fall back to plain SMTP
3650   if authentication or TLS is required and not able to occur. (#7258)
3651
3652Other
3653-----
3654 - #6705
3655
3656
3657Twisted Names 15.1.0 (2015-04-02)
3658=================================
3659
3660No significant changes have been made for this release.
3661
3662Other
3663-----
3664 - #7728
3665
3666
3667Twisted News 15.1.0 (2015-04-02)
3668================================
3669
3670No significant changes have been made for this release.
3671
3672
3673Twisted Pair 15.1.0 (2015-04-02)
3674================================
3675
3676No significant changes have been made for this release.
3677
3678
3679Twisted Runner 15.1.0 (2015-04-02)
3680==================================
3681
3682No significant changes have been made for this release.
3683
3684Other
3685-----
3686 - #7726
3687
3688
3689Twisted Web 15.1.0 (2015-04-02)
3690===============================
3691
3692Features
3693--------
3694 - twisted.web.static.File allows defining a custom resource for
3695   rendering forbidden pages. (#6951)
3696
3697Other
3698-----
3699 - #7000, #7485, #7750, #7762
3700
3701
3702Twisted Words 15.1.0 (2015-04-02)
3703=================================
3704
3705Deprecations and Removals
3706-------------------------
3707 - twisted.words.protocols.msn is now deprecated (#6395)
3708
3709Other
3710-----
3711 - #6494
3712
3713
3714Twisted Core 15.0.0 (2015-01-24)
3715================================
3716
3717Features
3718--------
3719 - twisted.internet.protocol.ClientFactory (and subclasses) may now
3720   return None from buildProtocol to immediately close the connection.
3721   (#710)
3722 - twisted.trial.unittest.SynchronousTestCase.assertRaises can now
3723   return a context manager. (#5339)
3724 - Implementations of
3725   twisted.internet.interfaces.IStreamClientEndpoint included in
3726   Twisted itself will now handle None being returned from the client
3727   factory's buildProtocol method by immediately closing the
3728   connection and firing the waiting Deferred with a Failure. (#6976)
3729 - inlineCallbacks now supports using the return statement with a
3730   value on Python 3 (#7624)
3731 - twisted.spread.banana.Banana.sendEncoded() now raises a more
3732   informative error message if the user tries to encode objects of
3733   unsupported type. (#7663)
3734
3735Bugfixes
3736--------
3737 - twisted.internet.interfaces.IReactorMulticast.listenMultiple works
3738   again RHEL 6's python 2.6. (#7159)
3739 - Allow much more of the code within Twisted to use ProcessEndpoint
3740   by adding IPushProducer and IConsumer interfaces to its resulting
3741   transport. (#7436)
3742 - twisted.internet.ssl.Certificate(...).getPublicKey().keyHash() now
3743   produces a stable value regardless of OpenSSL version.
3744   Unfortunately this means that it is different than the value
3745   produced by older Twisted versions. (#7651)
3746 - twisted.python.reflect.safe_str on Python 3 converts utf-8 encoded
3747   bytes to clean str instead of "b'a'" (#7660)
3748 - twisted.spread.banana.Banana now raises NotImplementedError when
3749   receiving pb messages without pb being the selected dialect (#7662)
3750 - The SSL server string endpoint parser
3751   (twisted.internet.endpoints.serverFromString) now constructs
3752   endpoints which, by default, disable the insecure SSLv3 protocol.
3753   (#7684)
3754 - The SSL client string endpoint parser
3755   (twisted.internet.endpoints.clientFromString) now constructs
3756   endpoints which, by default, disable the insecure SSLv3 protocol.
3757   (#7686)
3758
3759Improved Documentation
3760----------------------
3761 - inlineCallbacks now has introductory documentation. (#1009)
3762 - The echoclient example now uses twisted.internet.task.react.
3763   (#7083)
3764 - Twisted Trial's how-to documentation now has a link to Twisted's
3765   contribution guidelines and has been reformatted. (#7475)
3766 - Fixed a path error in the make.bat file for building Sphinx
3767   documentation, so that it is now possible to build the documentation
3768   using make.bat on Windows. (#7542)
3769
3770Deprecations and Removals
3771-------------------------
3772 - twisted.python.filepath.FilePath.statinfo was deprecated. (#4450)
3773 - twisted.internet.defer.deferredGenerator is now deprecated.
3774   twisted.internet.defer.inlineCallbacks should be used instead.
3775   (#6044)
3776 - Pickling twisted.internet.ssl.OptionSSLCertificationOptions and
3777   twisted.internet.ssl.Keypair is no longer supported. __getstate__
3778   and __setstate__ methods of these classes have been deprecated.
3779   (#6166)
3780 - twisted.spread.jelly's support for unjellying "instance" atoms is
3781   now deprecated. (#7653)
3782
3783Other
3784-----
3785 - #3404, #4711, #5730, #6042, #6626, #6947, #6953, #6989, #7032,
3786   #7038, #7039, #7097, #7098, #7142, #7143, #7154, #7155, #7156,
3787   #7157, #7158, #7160, #7161, #7162, #7164, #7165, #7176, #7234,
3788   #7252, #7329, #7333, #7355, #7369, #7370, #7419, #7529, #7531,
3789   #7534, #7537, #7538, #7620, #7621, #7633, #7636, #7637, #7638,
3790   #7640, #7641, #7642, #7643, #7665, #7667, #7713, #7719
3791
3792
3793Twisted Conch 15.0.0 (2015-01-24)
3794=================================
3795
3796Features
3797--------
3798 - The new APIs: twisted.conch.checkers.IAuthorizedKeysDB,
3799   twisted.conch.checkers.InMemorySSHKeyDB,
3800   twisted.conch.checkers.UNIXAuthorizedKeyFiles, and
3801   twisted.conch.checkers.SSHPublicKeyChecker have been added to
3802   provide functionality to check the validity of SSH public keys and
3803   specify where authorized keys are to be found. (#7144)
3804
3805Deprecations and Removals
3806-------------------------
3807 - twisted.conch.checkers.SSHPublicKeyDatabase is now deprecated in
3808   favor of a twisted.conch.checkers.SSHPublicKeyChecker instantiated
3809   with a twisted.conch.checkers.UNIXAuthorizedKeyFiles. (#7144)
3810
3811Other
3812-----
3813 - #6626, #7002, #7526, #7532, #7698
3814
3815
3816Twisted Lore 15.0.0 (2015-01-24)
3817================================
3818
3819No significant changes have been made for this release.
3820
3821
3822Twisted Mail 15.0.0 (2015-01-24)
3823================================
3824
3825No significant changes have been made for this release.
3826
3827Other
3828-----
3829 - #6999, #7708
3830
3831
3832Twisted Names 15.0.0 (2015-01-24)
3833=================================
3834
3835Bugfixes
3836--------
3837 - twisted.names.secondary.SecondaryAuthority can now answer queries
3838   again (broken since 13.2.0). (#7408)
3839
3840Other
3841-----
3842 - #7352
3843
3844
3845Twisted News 15.0.0 (2015-01-24)
3846================================
3847
3848No significant changes have been made for this release.
3849
3850Other
3851-----
3852 - #7703
3853
3854
3855Twisted Pair 15.0.0 (2015-01-24)
3856================================
3857
3858No significant changes have been made for this release.
3859
3860Other
3861-----
3862 - #7722
3863
3864
3865Twisted Runner 15.0.0 (2015-01-24)
3866==================================
3867
3868No significant changes have been made for this release.
3869
3870
3871Twisted Web 15.0.0 (2015-01-24)
3872===============================
3873
3874Features
3875--------
3876 - twisted.web.client.Agent.usingEndpointFactory allows creating an
3877   Agent that connects in non-standard ways, e.g. via a proxy or a
3878   UNIX socket. (#6634)
3879 - The Deferred returned by twisted.web.client.readBody can now be
3880   cancelled. (#6686)
3881
3882Deprecations and Removals
3883-------------------------
3884 - twisted.web.iweb.IRequest.getClient is now deprecated.  Its
3885   implementation in Twisted, twisted.web.http.Request.getClient, is
3886   also deprecated and will no longer attempt to resolve the client IP
3887   address to a hostname. (#2252)
3888
3889Other
3890-----
3891 - #7247, #7302, #7680, #7689
3892
3893
3894Twisted Words 15.0.0 (2015-01-24)
3895=================================
3896
3897No significant changes have been made for this release.
3898
3899Other
3900-----
3901 - #6994, #7163, #7622
3902