Skip to content

Commit

Permalink
Pull websockify socket() static method.
Browse files Browse the repository at this point in the history
Pull websockify 46e2fbe.

WebSocketServer.socket() is a static method takes a host and port and
an optional connect parameter. If connect is not set then it returns
a socket listening on host and port. If connect is set then
a connection will be made host and port and the socket returned. This
has IPv6 support like the addrinfo method it replaces.

Also, prefer IPv4 resolutions if they are in the list. This can be
overriden to prefer IPv6 resolutions for the same host using the
optional prefer_ipv6 parameter.
  • Loading branch information
kanaka committed Jul 9, 2011
1 parent 3a39bf6 commit 4f8c746
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 15 deletions.
34 changes: 22 additions & 12 deletions utils/websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,16 +144,30 @@ def __init__(self, listen_host='', listen_port=None, source_is_ipv6=False,
#

@staticmethod
def addrinfo(host, port=None):
""" Resolve a host (and optional port) to an IPv4 or IPv6 address.
Returns: family, socktype, proto, canonname, sockaddr
def socket(host, port=None, connect=False, prefer_ipv6=False):
""" Resolve a host (and optional port) to an IPv4 or IPv6
address. Create a socket. Bind to it if listen is set. Return
a socket that is ready for listen or connect.
"""
if not host:
host = 'localhost'
addrs = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM, socket.IPPROTO_TCP)
flags = 0
if host == '': host = None
if not connect:
flags = flags | socket.AI_PASSIVE
addrs = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM,
socket.IPPROTO_TCP, flags)
if not addrs:
raise Exception("Could resolve host '%s'" % host)
return addrs[0]
addrs.sort(key=lambda x: x[0])
if prefer_ipv6:
addrs.reverse()
sock = socket.socket(addrs[0][0], addrs[0][1])
if connect:
sock.connect(addrs[0][4])
else:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(addrs[0][4])
sock.listen(100)
return sock

@staticmethod
def daemonize(keepfd=None, chdir='/'):
Expand Down Expand Up @@ -738,11 +752,7 @@ def start_server(self):
is a WebSockets client then call new_client() method (which must
be overridden) for each new client connection.
"""
addr = self.addrinfo(self.listen_host, self.listen_port)
lsock = socket.socket(addr[0], addr[1])
lsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
lsock.bind((self.listen_host, self.listen_port))
lsock.listen(100)
lsock = self.socket(self.listen_host, self.listen_port)

if self.daemon:
self.daemonize(keepfd=lsock.fileno(), chdir=self.web)
Expand Down
5 changes: 2 additions & 3 deletions utils/websockify
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,8 @@ Traffic Legend:
# Connect to the target
self.msg("connecting to: %s:%s" % (
self.target_host, self.target_port))
addr = self.addrinfo(self.target_host, self.target_port)
tsock = socket.socket(addr[0], addr[1])
tsock.connect((self.target_host, self.target_port))
tsock = self.socket(self.target_host, self.target_port,
connect=True)

if self.verbose and not self.daemon:
print(self.traffic_legend)
Expand Down

0 comments on commit 4f8c746

Please sign in to comment.