15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from __future__ import absolute_import
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import socket
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import util
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)util.AddDirToPythonPath(
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    util.GetTelemetryDir(), 'third_party', 'websocket-client')
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pylint: disable=W0611
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from websocket import create_connection as _create_connection
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from websocket import WebSocketException
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from websocket import WebSocketTimeoutException
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def create_connection(*args, **kwargs):
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sockopt = kwargs.get('sockopt', [])
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # By default, we set SO_REUSEADDR on all websockets used by Telemetry.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # This prevents spurious address in use errors on Windows.
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  #
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # TODO(tonyg): We may want to set SO_NODELAY here as well.
252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  sockopt.append((socket.SOL_SOCKET, socket.SO_REUSEADDR, 1))
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwargs['sockopt'] = sockopt
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return _create_connection(*args, **kwargs)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)