S3/ConnMan.py
afd51b6c
 ## Amazon S3 manager
 ## Author: Michal Ludvig <michal@logix.cz>
 ##         http://www.logix.cz/michal
 ## License: GPL Version 2
 ## Copyright: TGRMN Software and contributors
 
e93378f3
 import httplib
 from urlparse import urlparse
 from threading import Semaphore
 from logging import debug, info, warning, error
 
 from Config import Config
8a3e46c2
 from Exceptions import ParameterError
e93378f3
 
 __all__ = [ "ConnMan" ]
 
 class http_connection(object):
8a3e46c2
     def __init__(self, id, hostname, ssl, cfg):
e93378f3
         self.hostname = hostname
         self.ssl = ssl
         self.id = id
         self.counter = 0
8a3e46c2
         if cfg.proxy_host != "":
             self.c = httplib.HTTPConnection(cfg.proxy_host, cfg.proxy_port)
         elif not ssl:
e93378f3
             self.c = httplib.HTTPConnection(hostname)
         else:
             self.c = httplib.HTTPSConnection(hostname)
 
 class ConnMan(object):
     conn_pool_sem = Semaphore()
     conn_pool = {}
     conn_max_counter = 800    ## AWS closes connection after some ~90 requests
 
     @staticmethod
     def get(hostname, ssl = None):
8a3e46c2
         cfg = Config()
e93378f3
         if ssl == None:
8a3e46c2
             ssl = cfg.use_https
e93378f3
         conn = None
8a3e46c2
         if cfg.proxy_host != "":
             if ssl:
                 raise ParameterError("use_ssl=True can't be used with proxy")
             conn_id = "proxy://%s:%s" % (cfg.proxy_host, cfg.proxy_port)
         else:
             conn_id = "http%s://%s" % (ssl and "s" or "", hostname)
e93378f3
         ConnMan.conn_pool_sem.acquire()
         if not ConnMan.conn_pool.has_key(conn_id):
             ConnMan.conn_pool[conn_id] = []
         if len(ConnMan.conn_pool[conn_id]):
             conn = ConnMan.conn_pool[conn_id].pop()
             debug("ConnMan.get(): re-using connection: %s#%d" % (conn.id, conn.counter))
         ConnMan.conn_pool_sem.release()
         if not conn:
             debug("ConnMan.get(): creating new connection: %s" % conn_id)
8a3e46c2
             conn = http_connection(conn_id, hostname, ssl, cfg)
e93378f3
             conn.c.connect()
         conn.counter += 1
         return conn
 
     @staticmethod
     def put(conn):
8a3e46c2
         if conn.id.startswith("proxy://"):
             conn.c.close()
             debug("ConnMan.put(): closing proxy connection (keep-alive not yet supported)")
             return
 
e93378f3
         if conn.counter >= ConnMan.conn_max_counter:
             conn.c.close()
             debug("ConnMan.put(): closing over-used connection")
             return
 
         ConnMan.conn_pool_sem.acquire()
         ConnMan.conn_pool[conn.id].append(conn)
         ConnMan.conn_pool_sem.release()
         debug("ConnMan.put(): connection put back to pool (%s#%d)" % (conn.id, conn.counter))