Add an API which makes it easy to start (and stop) speaking TLS over an arbitrary transport
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 6k
- Forks
- 1.2k
- Avg merge
- 2d 10h
- Merged PRs (30d)
- 10
Description
| @exarkun reported | |
|---|---|
| Trac ID | trac#5015 |
| Type | enhancement |
| Created | 2011-04-03 16:28:27Z |
For historical reasons, we have IReactorSSL and ITLSTransport. There was no way to implement this functionality except directly with the support of the reactor.
With twisted.protocols.tls, we now have an implementation that is independent of any TLS-specific support in the reactor. However, twisted.protocols.tls is very geared towards being used to replace IReactorSSL.connectSSL/listenSSL. It is possible to use it to replace ITLSTransport.startTLS, but:
- It's complicated. There is an unfortunate special case in
twisted.protocols.tlsto deal with this (the_connectWrappedargument toTLSMemoryBIOPRotocol.__init__). - The very nature of
ITLSTransportrequires direct support from the reactor. Outside code cannot (cleanly) add astartTLSmethod to an arbitrary transport.
Instead, to remove the need to have support in the reactor, it would be nice to have an API like this:
class SomeProtocol(Protocol):
def dataReceived(self, bytes):
if somecondition():
tls = TLSTransport(ctx, self.transport, self)
self.transport.switchProtocol(tls)
self.transport = tls
# Perhaps also...
self.transport.handshake()
These details might even all be wrapped up inside an even simpler helper API:
class SomeProtocol(Protocol):
def dataReceived(self, bytes):
if somecondition():
self.transport = startTLS(ctx, self.transport, self)
The details might differ, but importantly an API like this can be implemented entirely outside the reactor, except for the new switchProtocol method (proposed already in #3204).
This has other nice properties.
- Compared to the current APIs and implementation, it's easier to see how stacking works.
- Buffering is simplified because the original transport and the TLS transport are separate objects each dealing with buffering on their own.
- TLS shutdown without underlying transport shutdown is more obvious, since it just means going back to the original transport and discarding the TLS transport.
Searchable metadata
trac-id__5015 5015
type__enhancement enhancement
reporter__exarkun exarkun
priority__normal normal
milestone__
branch__
branch_author__
status__new new
resolution__None None
component__core core
keywords__
time__1301848107000000 1301848107000000
changetime__1340898077000000 1340898077000000
version__None None
owner__
cc__adiroiban
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading twisted.protocols.tls and the proposed switchProtocol work in #3204. Determine how an API can layer TLS over an arbitrary transport without reactor-specific support, including protocol switching, buffering, and shutdown. Done means the design is implemented with suitable coverage for starting and stopping TLS.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, networking
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100