diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2015-06-04 18:14:25 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2015-06-04 18:14:25 +1200 |
commit | 5a33f310412d57c975ff26ddc5653c6cca05a433 (patch) | |
tree | 1283088d2be001b2cf3cfa9b65412bd48bf7bdf3 /libpathod/language/base.py | |
parent | 9fda74c65a632bda5176e2ccafbbcab2af27d77d (diff) | |
download | mitmproxy-5a33f310412d57c975ff26ddc5653c6cca05a433.tar.gz mitmproxy-5a33f310412d57c975ff26ddc5653c6cca05a433.tar.bz2 mitmproxy-5a33f310412d57c975ff26ddc5653c6cca05a433.zip |
Clarify nomenclature, complete nested frame language spec.
Diffstat (limited to 'libpathod/language/base.py')
-rw-r--r-- | libpathod/language/base.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/libpathod/language/base.py b/libpathod/language/base.py index 4475d15b..ee5d05b5 100644 --- a/libpathod/language/base.py +++ b/libpathod/language/base.py @@ -519,3 +519,42 @@ class IntField(_Component): def spec(self): return "%s%s" % (self.preamble, self.origvalue) + + +class NestedMessage(Token): + """ + A nested message, as an escaped string with a preamble. + """ + preamble = "" + nest_type = None + + def __init__(self, value): + Token.__init__(self) + self.value = value + try: + self.parsed = self.nest_type( + self.nest_type.expr().parseString( + value.val, + parseAll=True + ) + ) + except pp.ParseException as v: + raise exceptions.ParseException(v.msg, v.line, v.col) + + @classmethod + def expr(klass): + e = pp.Literal(klass.preamble).suppress() + e = e + TokValueLiteral.expr() + return e.setParseAction(lambda x: klass(*x)) + + def values(self, settings): + return [ + self.value.get_generator(settings), + ] + + def spec(self): + return "%s%s" % (self.preamble, self.value.spec()) + + def freeze(self, settings): + f = self.parsed.freeze(settings).spec() + return self.__class__(TokValueLiteral(f.encode("string_escape"))) |