aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/tnetstring.py
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy/tnetstring.py')
-rw-r--r--libmproxy/tnetstring.py92
1 files changed, 46 insertions, 46 deletions
diff --git a/libmproxy/tnetstring.py b/libmproxy/tnetstring.py
index 58519675..bed8405f 100644
--- a/libmproxy/tnetstring.py
+++ b/libmproxy/tnetstring.py
@@ -72,13 +72,14 @@ __ver_major__ = 0
__ver_minor__ = 2
__ver_patch__ = 0
__ver_sub__ = ""
-__version__ = "%d.%d.%d%s" % (__ver_major__,__ver_minor__,__ver_patch__,__ver_sub__)
+__version__ = "%d.%d.%d%s" % (
+ __ver_major__, __ver_minor__, __ver_patch__, __ver_sub__)
from collections import deque
-def dumps(value,encoding=None):
+def dumps(value, encoding=None):
"""dumps(object,encoding=None) -> string
This function dumps a python object as a tnetstring.
@@ -90,21 +91,21 @@ def dumps(value,encoding=None):
# consider the _gdumps() function instead; it's a standard top-down
# generator that's simpler to understand but much less efficient.
q = deque()
- _rdumpq(q,0,value,encoding)
+ _rdumpq(q, 0, value, encoding)
return "".join(q)
-def dump(value,file,encoding=None):
+def dump(value, file, encoding=None):
"""dump(object,file,encoding=None)
This function dumps a python object as a tnetstring and writes it to
the given file.
"""
- file.write(dumps(value,encoding))
+ file.write(dumps(value, encoding))
file.flush()
-def _rdumpq(q,size,value,encoding=None):
+def _rdumpq(q, size, value, encoding=None):
"""Dump value as a tnetstring, to a deque instance, last chunks first.
This function generates the tnetstring representation of the given value,
@@ -129,7 +130,7 @@ def _rdumpq(q,size,value,encoding=None):
if value is False:
write("5:false!")
return size + 8
- if isinstance(value,(int,long)):
+ if isinstance(value, (int, long)):
data = str(value)
ldata = len(data)
span = str(ldata)
@@ -138,7 +139,7 @@ def _rdumpq(q,size,value,encoding=None):
write(":")
write(span)
return size + 2 + len(span) + ldata
- if isinstance(value,(float,)):
+ if isinstance(value, (float,)):
# Use repr() for float rather than str().
# It round-trips more accurately.
# Probably unnecessary in later python versions that
@@ -151,7 +152,7 @@ def _rdumpq(q,size,value,encoding=None):
write(":")
write(span)
return size + 2 + len(span) + ldata
- if isinstance(value,str):
+ if isinstance(value, str):
lvalue = len(value)
span = str(lvalue)
write(",")
@@ -159,26 +160,26 @@ def _rdumpq(q,size,value,encoding=None):
write(":")
write(span)
return size + 2 + len(span) + lvalue
- if isinstance(value,(list,tuple,)):
+ if isinstance(value, (list, tuple,)):
write("]")
init_size = size = size + 1
for item in reversed(value):
- size = _rdumpq(q,size,item,encoding)
+ size = _rdumpq(q, size, item, encoding)
span = str(size - init_size)
write(":")
write(span)
return size + 1 + len(span)
- if isinstance(value,dict):
+ if isinstance(value, dict):
write("}")
init_size = size = size + 1
- for (k,v) in value.iteritems():
- size = _rdumpq(q,size,v,encoding)
- size = _rdumpq(q,size,k,encoding)
+ for (k, v) in value.iteritems():
+ size = _rdumpq(q, size, v, encoding)
+ size = _rdumpq(q, size, k, encoding)
span = str(size - init_size)
write(":")
write(span)
return size + 1 + len(span)
- if isinstance(value,unicode):
+ if isinstance(value, unicode):
if encoding is None:
raise ValueError("must specify encoding to dump unicode strings")
value = value.encode(encoding)
@@ -192,7 +193,7 @@ def _rdumpq(q,size,value,encoding=None):
raise ValueError("unserializable object")
-def _gdumps(value,encoding):
+def _gdumps(value, encoding):
"""Generate fragments of value dumped as a tnetstring.
This is the naive dumping algorithm, implemented as a generator so that
@@ -207,24 +208,24 @@ def _gdumps(value,encoding):
yield "4:true!"
elif value is False:
yield "5:false!"
- elif isinstance(value,(int,long)):
+ elif isinstance(value, (int, long)):
data = str(value)
yield str(len(data))
yield ":"
yield data
yield "#"
- elif isinstance(value,(float,)):
+ elif isinstance(value, (float,)):
data = repr(value)
yield str(len(data))
yield ":"
yield data
yield "^"
- elif isinstance(value,(str,)):
+ elif isinstance(value, (str,)):
yield str(len(value))
yield ":"
yield value
yield ","
- elif isinstance(value,(list,tuple,)):
+ elif isinstance(value, (list, tuple,)):
sub = []
for item in value:
sub.extend(_gdumps(item))
@@ -233,9 +234,9 @@ def _gdumps(value,encoding):
yield ":"
yield sub
yield "]"
- elif isinstance(value,(dict,)):
+ elif isinstance(value, (dict,)):
sub = []
- for (k,v) in value.iteritems():
+ for (k, v) in value.iteritems():
sub.extend(_gdumps(k))
sub.extend(_gdumps(v))
sub = "".join(sub)
@@ -243,7 +244,7 @@ def _gdumps(value,encoding):
yield ":"
yield sub
yield "}"
- elif isinstance(value,(unicode,)):
+ elif isinstance(value, (unicode,)):
if encoding is None:
raise ValueError("must specify encoding to dump unicode strings")
value = value.encode(encoding)
@@ -255,7 +256,7 @@ def _gdumps(value,encoding):
raise ValueError("unserializable object")
-def loads(string,encoding=None):
+def loads(string, encoding=None):
"""loads(string,encoding=None) -> object
This function parses a tnetstring into a python object.
@@ -263,10 +264,10 @@ def loads(string,encoding=None):
# No point duplicating effort here. In the C-extension version,
# loads() is measurably faster then pop() since it can avoid
# the overhead of building a second string.
- return pop(string,encoding)[0]
+ return pop(string, encoding)[0]
-def load(file,encoding=None):
+def load(file, encoding=None):
"""load(file,encoding=None) -> object
This function reads a tnetstring from a file and parses it into a
@@ -324,21 +325,20 @@ def load(file,encoding=None):
if type == "]":
l = []
while data:
- (item,data) = pop(data,encoding)
+ (item, data) = pop(data, encoding)
l.append(item)
return l
if type == "}":
d = {}
while data:
- (key,data) = pop(data,encoding)
- (val,data) = pop(data,encoding)
+ (key, data) = pop(data, encoding)
+ (val, data) = pop(data, encoding)
d[key] = val
return d
raise ValueError("unknown type tag")
-
-def pop(string,encoding=None):
+def pop(string, encoding=None):
"""pop(string,encoding=None) -> (object, remain)
This function parses a tnetstring into a python object.
@@ -347,12 +347,12 @@ def pop(string,encoding=None):
"""
# Parse out data length, type and remaining string.
try:
- (dlen,rest) = string.split(":",1)
+ (dlen, rest) = string.split(":", 1)
dlen = int(dlen)
except ValueError:
raise ValueError("not a tnetstring: missing or invalid length prefix")
try:
- (data,type,remain) = (rest[:dlen],rest[dlen],rest[dlen+1:])
+ (data, type, remain) = (rest[:dlen], rest[dlen], rest[dlen + 1:])
except IndexError:
# This fires if len(rest) < dlen, meaning we don't need
# to further validate that data is the right length.
@@ -360,40 +360,40 @@ def pop(string,encoding=None):
# Parse the data based on the type tag.
if type == ",":
if encoding is not None:
- return (data.decode(encoding),remain)
- return (data,remain)
+ return (data.decode(encoding), remain)
+ return (data, remain)
if type == "#":
try:
- return (int(data),remain)
+ return (int(data), remain)
except ValueError:
raise ValueError("not a tnetstring: invalid integer literal")
if type == "^":
try:
- return (float(data),remain)
+ return (float(data), remain)
except ValueError:
raise ValueError("not a tnetstring: invalid float literal")
if type == "!":
if data == "true":
- return (True,remain)
+ return (True, remain)
elif data == "false":
- return (False,remain)
+ return (False, remain)
else:
raise ValueError("not a tnetstring: invalid boolean literal")
if type == "~":
if data:
raise ValueError("not a tnetstring: invalid null literal")
- return (None,remain)
+ return (None, remain)
if type == "]":
l = []
while data:
- (item,data) = pop(data,encoding)
+ (item, data) = pop(data, encoding)
l.append(item)
- return (l,remain)
+ return (l, remain)
if type == "}":
d = {}
while data:
- (key,data) = pop(data,encoding)
- (val,data) = pop(data,encoding)
+ (key, data) = pop(data, encoding)
+ (val, data) = pop(data, encoding)
d[key] = val
- return (d,remain)
+ return (d, remain)
raise ValueError("unknown type tag")