#!/usr/bin/env python # encoding: utf-8 # # Copyright (c) 2009 Doug Hellmann All rights reserved. # """ """ __version__ = "$Id$" #end_pymotw_header import asyncore import logging import socket from cStringIO import StringIO import urlparse class HttpClient(asyncore.dispatcher): def __init__(self, url): self.url = url self.logger = logging.getLogger(self.url) self.parsed_url = urlparse.urlparse(url) asyncore.dispatcher.__init__(self) self.write_buffer = 'GET %s HTTP/1.0\r\n\r\n' % self.url self.read_buffer = StringIO() self.create_socket(socket.AF_INET, socket.SOCK_STREAM) address = (self.parsed_url.netloc, 80) self.logger.debug('connecting to %s', address) self.connect(address) def handle_connect(self): self.logger.debug('handle_connect()') def handle_close(self): self.logger.debug('handle_close()') self.close() def writable(self): is_writable = (len(self.write_buffer) > 0) if is_writable: self.logger.debug('writable() -> %s', is_writable) return is_writable def readable(self): self.logger.debug('readable() -> True') return True def handle_write(self): sent = self.send(self.write_buffer) self.logger.debug('handle_write() -> "%s"', self.write_buffer[:sent]) self.write_buffer = self.write_buffer[sent:] def handle_read(self): data = self.recv(8192) self.logger.debug('handle_read() -> %d bytes', len(data)) self.read_buffer.write(data) if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG, format='%(name)s: %(message)s', ) clients = [ HttpClient('http://www.python.org/'), HttpClient('http://www.doughellmann.com/PyMOTW/contents.html'), ] logging.debug('LOOP STARTING') asyncore.loop() logging.debug('LOOP DONE') for c in clients: response_body = c.read_buffer.getvalue() print c.url, 'got', len(response_body), 'bytes'