Beautifully crafted timelines that are easy and intuitive to use. http://timeline.knightlab.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.4 KiB
71 lines
2.4 KiB
import httplib |
|
from urlparse import urlparse |
|
from threading import Semaphore |
|
from logging import debug, info, warning, error |
|
|
|
from Config import Config |
|
from Exceptions import ParameterError |
|
|
|
__all__ = [ "ConnMan" ] |
|
|
|
class http_connection(object): |
|
def __init__(self, id, hostname, ssl, cfg): |
|
self.hostname = hostname |
|
self.ssl = ssl |
|
self.id = id |
|
self.counter = 0 |
|
if cfg.proxy_host != "": |
|
self.c = httplib.HTTPConnection(cfg.proxy_host, cfg.proxy_port) |
|
elif not ssl: |
|
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): |
|
cfg = Config() |
|
if ssl == None: |
|
ssl = cfg.use_https |
|
conn = None |
|
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) |
|
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) |
|
conn = http_connection(conn_id, hostname, ssl, cfg) |
|
conn.c.connect() |
|
conn.counter += 1 |
|
return conn |
|
|
|
@staticmethod |
|
def put(conn): |
|
if conn.id.startswith("proxy://"): |
|
conn.c.close() |
|
debug("ConnMan.put(): closing proxy connection (keep-alive not yet supported)") |
|
return |
|
|
|
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)) |
|
|
|
|