mitmproxy/netlib/utils.py

68 lines
1.6 KiB
Python
Raw Normal View History

2015-08-05 19:32:53 +00:00
import re
2016-02-08 03:16:58 +00:00
def setbit(byte, offset, value):
"""
Set a bit in a byte to 1 if value is truthy, 0 if not.
"""
if value:
return byte | (1 << offset)
else:
return byte & ~(1 << offset)
def getbit(byte, offset):
mask = 1 << offset
2015-09-17 13:16:12 +00:00
return bool(byte & mask)
2016-10-17 04:29:45 +00:00
class BiDi:
"""
A wee utility class for keeping bi-directional mappings, like field
constants in protocols. Names are attributes on the object, dict-like
access maps values to names:
CONST = BiDi(a=1, b=2)
assert CONST.a == 1
assert CONST.get_name(1) == "a"
"""
def __init__(self, **kwargs):
self.names = kwargs
self.values = {}
for k, v in kwargs.items():
self.values[v] = k
if len(self.names) != len(self.values):
raise ValueError("Duplicate values not allowed.")
def __getattr__(self, k):
if k in self.names:
return self.names[k]
raise AttributeError("No such attribute: %s", k)
def get_name(self, n, default=None):
return self.values.get(n, default)
2015-09-15 17:12:15 +00:00
_label_valid = re.compile(b"(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
2015-08-01 08:39:14 +00:00
2016-10-17 03:56:46 +00:00
def is_valid_host(host: bytes) -> bool:
2015-09-20 17:40:09 +00:00
"""
Checks if a hostname is valid.
2015-09-20 17:40:09 +00:00
"""
2015-08-01 08:39:14 +00:00
try:
host.decode("idna")
except ValueError:
return False
2015-09-15 17:12:15 +00:00
if len(host) > 255:
return False
if host and host[-1:] == b".":
2015-09-15 17:12:15 +00:00
host = host[:-1]
return all(_label_valid.match(x) for x in host.split(b"."))
def is_valid_port(port):
return 0 <= port <= 65535