1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.internet.protocol import ClientFactory
from twisted.protocols.basic import LineOnlyReceiver
def printDate(date):
print 'Server time is', date.strip()
def fetchDate(hostname):
result = Deferred()
factory = ClientFactory()
factory.protocol = lambda: DateReader(result.callback, result.errback)
reactor.connectTCP(hostname, 80, factory)
# reactor.connectTCP("localhost", 12345, factory)
return result
def handleError(error):
print "Problem retrieving date:", error.getErrorMessage()
def main():
result = fetchDate('google.com')
result.addCallback(printDate)
result.addCallback(lambda ignored: fetchDate('microsoft.com'))
result.addCallback(printDate)
result.addErrback(handleError)
result.addCallback(lambda ignored: reactor.stop())
reactor.run()
class DateReader(LineOnlyReceiver):
def __init__(self, dateHeaderReceived, noDateHeader):
self.dateHeaderReceived = dateHeaderReceived
self.noDateHeader = noDateHeader
self.sawDateHeader = False
def connectionMade(self):
self.transport.write('HEAD / HTTP/1.0\r\n\r\n')
def lineReceived(self, line):
if line.lower().startswith('date:'):
self.sawDateHeader = True
ignored, date = line.split(':', 1)
self.dateHeaderReceived(date)
self.transport.loseConnection()
def connectionLost(self, reason):
if not self.sawDateHeader:
self.noDateHeader(
Exception(
"Connection lost without receiving "
"Date header from server"))
main()
|