A simple async-http client, freezes for a long time with inaccessible sites.
For example, on the site www.evtur.ru he waits a long time, ten minutes or more.
I can’t find a way to minimize the timeout, is it possible to make a timeout in 5 seconds?
# coding=utf-8 import asyncore import string, socket import StringIO import mimetools, urlparse class AsyncHTTP(asyncore.dispatcher): # HTTP requestor def __init__(self, uri): asyncore.dispatcher.__init__(self) self.uri = uri # turn the uri into a valid request scheme, host, path, params, query, fragment = urlparse.urlparse(uri) assert scheme == "http", "only supports HTTP requests" try: host, port = string.split(host, ":", 1) port = int(port) except (TypeError, ValueError): port = 80 # default port if not path: path = "/" if params: path = path + ";" + params if query: path = path + "?" + query self.request = "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n" % (path, host) self.host = host self.port = port self.status = None self.header = None self.http_code = None self.data = "" # get things going! self.create_socket(socket.AF_INET, socket.SOCK_STREAM) #self.connect((host, port)) #return try: self.connect((host, port)) except Exception,e: self.close() self.handle_connect_expt(e) def handle_connect(self): self.send(self.request) def handle_expt(self): print "handle_expt error!" self.close() def handle_error(self): print "handle_error error!" self.close() def handle_connect_expt(self,expt): print "connection error:",expt def handle_code(self): print self.host," : ","recv http code: ",self.http_code def handle_read(self): data = self.recv(2048) #print data if not self.header: self.data = self.data + data try: i = string.index(self.data, "\r\n\r\n") except ValueError: return # continue else: # parse header fp = StringIO.StringIO(self.data[:i+4]) # status line is "HTTP/version status message" status = fp.readline() self.status = string.split(status, " ", 2) self.http_code = self.status[1] self.handle_code() # followed by a rfc822-style message header self.header = mimetools.Message(fp) # followed by a newline, and the payload (if any) data = self.data[i+4:] self.data = "" #header recived #self.close() def handle_close(self): self.close() c = AsyncHTTP('http://www.python.org') c = AsyncHTTP('http://www.evtur.ru') asyncore.loop(timeout=0.05)
source share