~exarkun/+junk/training

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()