2020import msgpack
2121import requests
2222import requests .exceptions
23+ from requests .adapters import HTTPAdapter
2324from six .moves .urllib .parse import urlparse
2425
2526from influxdb .line_protocol import make_lines , quote_ident , quote_literal
@@ -87,6 +88,11 @@ class InfluxDBClient(object):
8788 :param headers: headers to add to Requests, will add 'Content-Type'
8889 and 'Accept' unless these are already present, defaults to {}
8990 :type headers: dict
91+ :param socket_options: use custom tcp socket options,
92+ If not specified, then defaults are loaded from
93+ ``HTTPConnection.default_socket_options``
94+ :type socket_options: list
95+
9096 :raises ValueError: if cert is provided but ssl is disabled (set to False)
9197 """
9298
@@ -109,6 +115,7 @@ def __init__(self,
109115 gzip = False ,
110116 session = None ,
111117 headers = None ,
118+ socket_options = None ,
112119 ):
113120 """Construct a new InfluxDBClient object."""
114121 self .__host = host
@@ -128,9 +135,10 @@ def __init__(self,
128135 session = requests .Session ()
129136
130137 self ._session = session
131- adapter = requests . adapters . HTTPAdapter (
138+ adapter = _SocketOptionsAdapter (
132139 pool_connections = int (pool_size ),
133- pool_maxsize = int (pool_size )
140+ pool_maxsize = int (pool_size ),
141+ socket_options = socket_options
134142 )
135143
136144 if use_udp :
@@ -626,7 +634,7 @@ def _batches(iterable, size):
626634 # http://code.activestate.com/recipes/303279-getting-items-in-batches/
627635 iterator = iter (iterable )
628636 while True :
629- try : # Try get the first element in the iterator...
637+ try : # Try get the first element in the iterator...
630638 head = (next (iterator ),)
631639 except StopIteration :
632640 return # ...so that we can stop if there isn't one
@@ -1249,3 +1257,16 @@ def _msgpack_parse_hook(code, data):
12491257 timestamp += datetime .timedelta (microseconds = (epoch_ns / 1000 ))
12501258 return timestamp .isoformat () + 'Z'
12511259 return msgpack .ExtType (code , data )
1260+
1261+
1262+ class _SocketOptionsAdapter (HTTPAdapter ):
1263+ """_SocketOptionsAdapter injects socket_options into HTTP Adapter."""
1264+
1265+ def __init__ (self , * args , ** kwargs ):
1266+ self .socket_options = kwargs .pop ("socket_options" , None )
1267+ super (_SocketOptionsAdapter , self ).__init__ (* args , ** kwargs )
1268+
1269+ def init_poolmanager (self , * args , ** kwargs ):
1270+ if self .socket_options is not None :
1271+ kwargs ["socket_options" ] = self .socket_options
1272+ super (_SocketOptionsAdapter , self ).init_poolmanager (* args , ** kwargs )
0 commit comments