Twisted Challenges¶
Challenge 1: Identity Server and Client¶
This challenge tests your knowledge on the concepts of Transport
, Protocol
and ProtocolFactory
in Twisted.
In this challenge, we have a server and a client that are based the Echo server/client in Twisted official documentation. Instead of sending the request back and forth between the peers, the server responds with a string of the client’s IP and port (identity).
Q1: Echo Client’s IP and Port as Response
- Make proper changes to implement the following:
- Client Accepts user inputs from
stdin
and sends the inputs with <enter> key - Server responds with a message saying
You are from <ip> on port <port>, saying "bla bla bla"
- Then, server immediately loses the connection after the response
- Client Accepts user inputs from
Q2: Display Connection History
- Based on Q1, make further changes to implement:
- Record a history of IP and port of connected clients.
- When client sends a message
show log
, respond a minified json structured as below
[
{
"ip": "1.2.3.4",
"port": 60000
},
... ,
... ,
... ,
{
"ip": "1.2.3.5",
"port": 60001
}
]
Sample Answer:
Challenge 2: Deferred
101¶
This challenge tests the basics of Deferred
objects.
In this challenge, we have a simple synchronous HTTP client that needs refactoring. Your challenge is to change this code with Twisted to implement the features below.
Q1: Fetch the webpage
- Read function
synchronousCall
- Implement a function called
chainedCall
as an asynchronous version withDeferred
- Pass the test case
testChainedCall
Q2: Wrap your call chains with inlineCallbacks
- Based on the previous question, wrap the function
chainedCall
withinlineCallbacks
- Pass the test case
testInlineCallback
Sample Answer:
Challenge 3: Message Relay¶
This challenge tests your knowledge on chained calls with callback
and errBack
.
In this challenge, we have 3 persons relaying a message. Each person can either pass(callback) or blame(errback) to the next person. The behaviour of each person’s pass/blame are pre-defined as functions in code.
Q1: Add code in function q1
below to stop Person 3 blaming
Q2: Make the message pass through Person 2 without Person 1 blaming
Sample Answer
Challenge 4: Heartbeat¶
This challenge tests your knowledge on loopingCall
.
The existing code is to send out heartbeat signal of “*” every 3 seconds to each session after connection. Note: this is not a broadcast which sends the “*” to all clients at the same time.
To test your heartbeat server, use netcat
or telnet
, connect to 127.0.0.1
to port 5000
.
Sample Answer
Challenge 5: Who Got “Yes” First¶
This challenge tests your knowledge on DeferredList
, Failure
and your comprehensive applied knowledge of Twisted.
There is a web JSON API return randomly-picked answer of either yes or no. The challenge code is a client that sends 3 requests to the API.
Q1: Add code to function getAll
to retrieve all responses and then print the collected results with pprint
(which is provided)
Q2: Change code to function _filterAnswer
and function _handleUnexpectedAnswer
to get the first answer “yes” and stop waiting for all other requests. Do not interrupt if there is no answer “yes” in any response in which case (None, 0)
will be printed.
When you are making your change, please make sure the following is satisfied:
_filterAnswer
filters out “yes” to the callback chain while it raises anUnexpectedAnswerError
to error-back chain if it’s a “No”._handleUnexpectedAnswer
handles all failures from_filerAnswer
. It catches and stops the complaint due toUnexpectedAnswerError
and puts theDeferred
object back to callback chain. But it still raises any other types of failures.
Q3: Add code to function _displayUnexpectedAnswer
to print the filtered-out response(s) of “No” using print
.
Sample Answer
Challenge 6: Concurrency Limit¶
This challenge tests your knowledge on DeferredSemaphore
.
There is a script that gets the file sizes of gcc releases. Please add code function download
to limit concurrent requests sent by Deferred objects by maxRun
.
Sample Answer
Challenge 7: Cancel on Timeout¶
This challenge tests your knowledge on cancellation and timeout.
The existing code needs a line of code to set a timeout of 2 seconds before cancel the deferred if timeout is reached. On timeout, please use logTimeout
when it is timed out.
Sample Answer
Challenge 8: Chain Them Up¶
This challenge tests your knowledge on chaining deferreds.
The original code implements a callback chain. Please refactor the two lines of addCallbacks
as an oneliner with chainDeferred
.
Sample Answer
Challenge 9: Work with Synchronous Functions¶
This challenge tests your knowledge on integrating synchronous functions.
The original code implements a Deferred
object from a function. please reactor the function to return a Deffered.
Sample Answer