Commit 4f8c7465 authored by Joel Martin's avatar Joel Martin

Pull websockify socket() static method.

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.
parent 3a39bf60
...@@ -144,16 +144,30 @@ Sec-WebSocket-Accept: %s\r ...@@ -144,16 +144,30 @@ Sec-WebSocket-Accept: %s\r
# #
@staticmethod @staticmethod
def addrinfo(host, port=None): def socket(host, port=None, connect=False, prefer_ipv6=False):
""" Resolve a host (and optional port) to an IPv4 or IPv6 address. """ Resolve a host (and optional port) to an IPv4 or IPv6
Returns: family, socktype, proto, canonname, sockaddr address. Create a socket. Bind to it if listen is set. Return
a socket that is ready for listen or connect.
""" """
if not host: flags = 0
host = 'localhost' if host == '': host = None
addrs = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM, socket.IPPROTO_TCP) if not connect:
flags = flags | socket.AI_PASSIVE
addrs = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM,
socket.IPPROTO_TCP, flags)
if not addrs: if not addrs:
raise Exception("Could resolve host '%s'" % host) 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 @staticmethod
def daemonize(keepfd=None, chdir='/'): def daemonize(keepfd=None, chdir='/'):
...@@ -738,11 +752,7 @@ Sec-WebSocket-Accept: %s\r ...@@ -738,11 +752,7 @@ Sec-WebSocket-Accept: %s\r
is a WebSockets client then call new_client() method (which must is a WebSockets client then call new_client() method (which must
be overridden) for each new client connection. be overridden) for each new client connection.
""" """
addr = self.addrinfo(self.listen_host, self.listen_port) lsock = self.socket(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)
if self.daemon: if self.daemon:
self.daemonize(keepfd=lsock.fileno(), chdir=self.web) self.daemonize(keepfd=lsock.fileno(), chdir=self.web)
......
...@@ -141,9 +141,8 @@ Traffic Legend: ...@@ -141,9 +141,8 @@ Traffic Legend:
# Connect to the target # Connect to the target
self.msg("connecting to: %s:%s" % ( self.msg("connecting to: %s:%s" % (
self.target_host, self.target_port)) self.target_host, self.target_port))
addr = self.addrinfo(self.target_host, self.target_port) tsock = self.socket(self.target_host, self.target_port,
tsock = socket.socket(addr[0], addr[1]) connect=True)
tsock.connect((self.target_host, self.target_port))
if self.verbose and not self.daemon: if self.verbose and not self.daemon:
print(self.traffic_legend) print(self.traffic_legend)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment