| Viewing file:  https_cli_async.py (3.57 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
#!/usr/bin/env python
 """Demo for client-side ssl_dispatcher usage. Note that connect()
 is blocking. (Need fix?)
 
 This isn't really a HTTPS client; it's just a toy.
 
 Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved."""
 
 import asyncore, sys, time
 from M2Crypto import Rand, SSL
 
 class https_client(SSL.ssl_dispatcher):
 
 def __init__(self, host, path, ssl_ctx):
 SSL.ssl_dispatcher.__init__(self)
 self.path = path
 self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % self.path
 self.create_socket(ssl_ctx)
 self.socket.connect((host, 19443))
 self._can_read = 1
 self._count = 0
 
 def handle_connect(self):
 pass
 
 def readable(self):
 return self._can_read
 
 def handle_read(self):
 try:
 result = self.recv()
 if result is None:
 return
 elif result == '':
 self._can_read = 0
 sys.stdout.write('%s: total: %5d\n' % (self.path, self._count,))
 sys.stdout.flush()
 self.close()
 else:
 #print result
 l = len(result)
 self._count = self._count + l
 display = (time.time(), l, self.path)
 sys.stdout.write('%14.3f: read %5d from %s\n' % display)
 sys.stdout.flush()
 except SSL.SSLError, why:
 print 'handle_read:', why
 self.close()
 raise
 
 def writable(self):
 return (len(self.buffer) > 0)
 
 def handle_write(self):
 try:
 sent = self.send(self.buffer)
 self.buffer = self.buffer[sent:]
 except SSL.SSLError, why:
 print 'handle_write:', why
 self.close()
 
 
 if __name__ == '__main__':
 Rand.load_file('../randpool.dat', -1)
 ctx = SSL.Context()
 url = ('/jdk118/api/u-names.html',
 '/postgresql/xfunc-c.html',
 '/python2.1/modindex.html')
 for u in url:
 https_client('localhost', u, ctx)
 asyncore.loop()
 Rand.save_file('../randpool.dat')
 
 
 # Here's a sample output. Server is Apache+mod_ssl on localhost.
 # $ python https_cli_async.py
 # 991501090.682: read   278 from /python2.1/modindex.html
 # 991501090.684: read   278 from /postgresql/xfunc-c.html
 # 991501090.742: read  4096 from /postgresql/xfunc-c.html
 # 991501090.743: read  4096 from /postgresql/xfunc-c.html
 # 991501090.744: read  4096 from /postgresql/xfunc-c.html
 # 991501090.744: read  4096 from /postgresql/xfunc-c.html
 # 991501090.755: read  4096 from /postgresql/xfunc-c.html
 # 991501090.756: read   278 from /jdk118/api/u-names.html
 # 991501090.777: read  4096 from /postgresql/xfunc-c.html
 # 991501090.778: read  4096 from /postgresql/xfunc-c.html
 # 991501090.778: read  4096 from /postgresql/xfunc-c.html
 # 991501090.782: read  4096 from /postgresql/xfunc-c.html
 # 991501090.813: read  4096 from /python2.1/modindex.html
 # 991501090.839: read  4096 from /jdk118/api/u-names.html
 # 991501090.849: read  4096 from /python2.1/modindex.html
 # 991501090.873: read  3484 from /postgresql/xfunc-c.html
 # 991501090.874: read  4096 from /jdk118/api/u-names.html
 # 991501090.874: read  4096 from /python2.1/modindex.html
 #/postgresql/xfunc-c.html: total: 40626
 # 991501090.886: read  4096 from /jdk118/api/u-names.html
 # 991501090.886: read  2958 from /python2.1/modindex.html
 # 991501090.887: read  4096 from /jdk118/api/u-names.html
 #/python2.1/modindex.html: total: 15524
 # 991501090.893: read  4096 from /jdk118/api/u-names.html
 # 991501090.894: read  2484 from /jdk118/api/u-names.html
 #/jdk118/api/u-names.html: total: 23242
 # $
 
 
 
 |