SNI Proxy EndPoint implementation.
| 244 | |
| 245 | @total_ordering |
| 246 | class SniEndPoint(EndPoint): |
| 247 | """SNI Proxy EndPoint implementation.""" |
| 248 | |
| 249 | def __init__(self, proxy_address, server_name, port=9042, init_index=0): |
| 250 | self._proxy_address = proxy_address |
| 251 | self._index = init_index |
| 252 | self._resolved_address = None # resolved address |
| 253 | self._port = port |
| 254 | self._server_name = server_name |
| 255 | self._ssl_options = {'server_hostname': server_name} |
| 256 | |
| 257 | @property |
| 258 | def address(self): |
| 259 | return self._proxy_address |
| 260 | |
| 261 | @property |
| 262 | def port(self): |
| 263 | return self._port |
| 264 | |
| 265 | @property |
| 266 | def ssl_options(self): |
| 267 | return self._ssl_options |
| 268 | |
| 269 | def resolve(self): |
| 270 | try: |
| 271 | resolved_addresses = self._resolve_proxy_addresses() |
| 272 | except socket.gaierror: |
| 273 | log.debug('Could not resolve sni proxy hostname "%s" ' |
| 274 | 'with port %d' % (self._proxy_address, self._port)) |
| 275 | raise |
| 276 | |
| 277 | # round-robin pick |
| 278 | self._resolved_address = sorted(addr[4][0] for addr in resolved_addresses)[self._index % len(resolved_addresses)] |
| 279 | self._index += 1 |
| 280 | |
| 281 | return self._resolved_address, self._port |
| 282 | |
| 283 | def _resolve_proxy_addresses(self): |
| 284 | return socket.getaddrinfo(self._proxy_address, self._port, |
| 285 | socket.AF_UNSPEC, socket.SOCK_STREAM) |
| 286 | |
| 287 | def __eq__(self, other): |
| 288 | return (isinstance(other, SniEndPoint) and |
| 289 | self.address == other.address and self.port == other.port and |
| 290 | self._server_name == other._server_name) |
| 291 | |
| 292 | def __hash__(self): |
| 293 | return hash((self.address, self.port, self._server_name)) |
| 294 | |
| 295 | def __lt__(self, other): |
| 296 | return ((self.address, self.port, self._server_name) < |
| 297 | (other.address, other.port, self._server_name)) |
| 298 | |
| 299 | def __str__(self): |
| 300 | return str("%s:%d:%s" % (self.address, self.port, self._server_name)) |
| 301 | |
| 302 | def __repr__(self): |
| 303 | return "<%s: %s:%d:%s>" % (self.__class__.__name__, |
no outgoing calls
no test coverage detected