diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2015-05-16 09:42:47 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2015-05-16 09:42:47 +1200 |
commit | d66dedc6e7bdc201cd4d3fa5f04c9636a8ad57f4 (patch) | |
tree | 088fbf245c8fef8f4a4b549566241bd93bf86fdb /libpathod/language/base.py | |
parent | 2beae27541be19c22e15a2c02e8fbee254bb8e6c (diff) | |
download | mitmproxy-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.py | 55 |
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. |