diff options
Diffstat (limited to 'vendor/Twisted-10.0.0/twisted/web/google.py')
-rw-r--r-- | vendor/Twisted-10.0.0/twisted/web/google.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/vendor/Twisted-10.0.0/twisted/web/google.py b/vendor/Twisted-10.0.0/twisted/web/google.py new file mode 100644 index 0000000000..a0b8e8f073 --- /dev/null +++ b/vendor/Twisted-10.0.0/twisted/web/google.py @@ -0,0 +1,75 @@ +# Copyright (c) 2001-2004 Twisted Matrix Laboratories. +# See LICENSE for details. + +# +"""\"I'm Feeling Lucky\" with U{Google<http://google.com>}. +""" +import urllib +from twisted.internet import protocol, reactor, defer +from twisted.web import http + +class GoogleChecker(http.HTTPClient): + + def connectionMade(self): + self.sendCommand('GET', self.factory.url) + self.sendHeader('Host', self.factory.host) + self.sendHeader('User-Agent', self.factory.agent) + self.endHeaders() + + def handleHeader(self, key, value): + key = key.lower() + if key == 'location': + self.factory.gotLocation(value) + + def handleStatus(self, version, status, message): + if status != '302': + self.factory.noLocation(ValueError("bad status")) + + def handleEndHeaders(self): + self.factory.noLocation(ValueError("no location")) + + def handleResponsePart(self, part): + pass + + def handleResponseEnd(self): + pass + + def connectionLost(self, reason): + self.factory.noLocation(reason) + + +class GoogleCheckerFactory(protocol.ClientFactory): + + protocol = GoogleChecker + + def __init__(self, words): + self.url = ('/search?q=%s&btnI=%s' % + (urllib.quote_plus(' '.join(words)), + urllib.quote_plus("I'm Feeling Lucky"))) + self.agent="Twisted/GoogleChecker" + self.host = "www.google.com" + self.deferred = defer.Deferred() + + def clientConnectionFailed(self, _, reason): + self.noLocation(reason) + + def gotLocation(self, location): + if self.deferred: + self.deferred.callback(location) + self.deferred = None + + def noLocation(self, error): + if self.deferred: + self.deferred.errback(error) + self.deferred = None + + +def checkGoogle(words): + """Check google for a match. + + @returns: a Deferred which will callback with a URL or errback with a + Failure. + """ + factory = GoogleCheckerFactory(words) + reactor.connectTCP('www.google.com', 80, factory) + return factory.deferred |