aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/language/base.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2015-05-16 09:42:47 +1200
committerAldo Cortesi <aldo@nullcube.com>2015-05-16 09:42:47 +1200
commitd66dedc6e7bdc201cd4d3fa5f04c9636a8ad57f4 (patch)
tree088fbf245c8fef8f4a4b549566241bd93bf86fdb /libpathod/language/base.py
parent2beae27541be19c22e15a2c02e8fbee254bb8e6c (diff)
downloadmitmproxy-d66dedc6e7bdc201cd4d3fa5f04c9636a8ad57f4.tar.gz
mitmproxy-d66dedc6e7bdc201cd4d3fa5f04c9636a8ad57f4.tar.bz2
mitmproxy-d66dedc6e7bdc201cd4d3fa5f04c9636a8ad57f4.zip
websockets: mask specification
- Add a FixedLengthValue - Use it to implement a 4-byte mask specifier - Adjust docs
Diffstat (limited to 'libpathod/language/base.py')
-rw-r--r--libpathod/language/base.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/libpathod/language/base.py b/libpathod/language/base.py
index 4179fa7d..41ad639a 100644
--- a/libpathod/language/base.py
+++ b/libpathod/language/base.py
@@ -7,6 +7,21 @@ from .. import utils
from . import generators, exceptions
+class Settings:
+ def __init__(
+ self,
+ staticdir = None,
+ unconstrained_file_access = False,
+ request_host = None,
+ websocket_key = None
+ ):
+ self.staticdir = staticdir
+ self.unconstrained_file_access = unconstrained_file_access
+ self.request_host = request_host
+ self.websocket_key = websocket_key
+
+
+
Sep = pp.Optional(pp.Literal(":")).suppress()
@@ -375,6 +390,46 @@ class Value(_Component):
return self.__class__(self.value.freeze(settings))
+class FixedLengthValue(Value):
+ """
+ A value component lead by an optional preamble.
+ """
+ preamble = ""
+ length = None
+
+ def __init__(self, value):
+ Value.__init__(self, value)
+ lenguess = None
+ try:
+ lenguess = len(value.get_generator(Settings()))
+ except exceptions.RenderError:
+ pass
+ # This check will fail if we know the length upfront
+ if lenguess is not None and lenguess != self.length:
+ raise exceptions.RenderError(
+ "Invalid value length: '%s' is %s bytes, should be %s."%(
+ self.spec(),
+ lenguess,
+ self.length
+ )
+ )
+
+ def values(self, settings):
+ ret = Value.values(self, settings)
+ l = sum(len(i) for i in ret)
+ # This check will fail if we don't know the length upfront - i.e. for
+ # file inputs
+ if l != self.length:
+ raise exceptions.RenderError(
+ "Invalid value length: '%s' is %s bytes, should be %s."%(
+ self.spec(),
+ l,
+ self.length
+ )
+ )
+ return ret
+
+
class Boolean(_Component):
"""
A boolean flag.