<pre style='margin:0'>
petrrr pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/5e82db5aa03752dec99c2a4d7eb459eb497185c8">https://github.com/macports/macports-ports/commit/5e82db5aa03752dec99c2a4d7eb459eb497185c8</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 5e82db5aa03752dec99c2a4d7eb459eb497185c8
</span>Author: Yen Chi Hsuan <yan12125@gmail.com>
AuthorDate: Fri Oct 20 22:15:51 2017 +0800

<span style='display:block; white-space:pre;color:#404040;'>    py-mitmproxy: Bump to 2.0.2
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    * Add tests
</span><span style='display:block; white-space:pre;color:#404040;'>    * mitmproxy is now Python 3 only
</span><span style='display:block; white-space:pre;color:#404040;'>    * Correct dependencies based on setup.py
</span><span style='display:block; white-space:pre;color:#404040;'>    * Remove upper bound checks to allow update of dependencies
</span><span style='display:block; white-space:pre;color:#404040;'>    * Backport some dependency update and testing fixes
</span><span style='display:block; white-space:pre;color:#404040;'>    * netlib is renamed to mitmproxy.net since upstream PR 1637 (mitmproxy 1.0)
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/53170
</span>---
 python/py-mitmproxy/Portfile                  |  53 ++--
 python/py-mitmproxy/files/patch-setup.py.diff |  39 ---
 python/py-mitmproxy/files/pr2170.patch        |  13 +
 python/py-mitmproxy/files/pr2208.patch        |  70 +++++
 python/py-mitmproxy/files/pr2239.patch        | 352 ++++++++++++++++++++++++++
 5 files changed, 461 insertions(+), 66 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/Portfile b/python/py-mitmproxy/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 85b52b0..bddf354 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-mitmproxy/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortGroup           python 1.0
</span> PortGroup           github 1.0
 
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup        mitmproxy mitmproxy 0.17.1 v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup        mitmproxy mitmproxy 2.0.2 v
</span> 
 name                py-${github.project}
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -24,57 +24,56 @@ long_description    \
</span> 
 homepage            http://mitmproxy.org/
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           md5     954b5796ab36c6d7e5dad5775e7178a3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rmd160  6d28eec42f4e410775a8d394f6c12232652df691 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  9b1460be1cf16ceb8b89c11f8593ad2de16ec9ce238964f26eb36e1bcfb13f24
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           md5     d49a024cf743ce3cc1ae4ba4a613166e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    rmd160  5184bd752cae6ffbb61a11c4516e1ceb0ac1973a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  4b67f68dd488af6ccab4f534124e63ad583776922dc004166212254a33b2a07b
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-python.versions     27
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+python.versions     36
</span> 
 if {${name} ne ${subport}} {
     depends_build-append    port:py${python.version}-setuptools
 
     depends_lib-append      port:py${python.version}-asn1 \
                             port:py${python.version}-blinker \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-brotlipy \
</span>                             port:py${python.version}-click \
                             port:py${python.version}-certifi \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-configargparse \
</span>                             port:py${python.version}-construct \
                             port:py${python.version}-cryptography \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-flask \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-cssutils \
</span>                             port:py${python.version}-h2 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-hpack \
</span>                             port:py${python.version}-html2text \
                             port:py${python.version}-hyperframe \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-lxml \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-jsbeautifier \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-kaitaistruct \
</span>                             port:py${python.version}-openssl \
                             port:py${python.version}-parsing \
                             port:py${python.version}-passlib \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-Pillow \
</span>                             port:py${python.version}-pyperclip \
                             port:py${python.version}-requests \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            port:py${python.version}-six \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-ruamel-yaml \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-sortedcontainers \
</span>                             port:py${python.version}-tornado \
                             port:py${python.version}-urwid \
                             port:py${python.version}-watchdog
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { ${python.version} < 35 } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_lib-append \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            port:py${python.version}-backports-ssl_match_hostname
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Testing dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_build-append    port:py${python.version}-pytest \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-beautifulsoup4 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-flask \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            port:py${python.version}-tz
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    patchfiles      patch-setup.py.diff
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Deactivation hack
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Python package `netlib` has been merged into `mitmproxy`, after version 0.16.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # This requires that that port `py27-netlib` is deacitavated. 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    pre-activate {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![catch {set installed [lindex [registry_active py${python.version}-netlib] 0]}]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set _version [lindex $installed 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[vercmp $_version 0.16] <= 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                registry_deactivate_composite  py${python.version}-netlib "" [list ports_nodepcheck 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles              pr2208.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            pr2239.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            pr2170.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Remove all upper bounds - potential breakings are detected by test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        reinplace "s/, *<\[0-9=.\]*//" ${worksrcpath}/setup.py
</span>     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.run yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.cmd py.test-${python.branch}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     livecheck.type  none
 }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/patch-setup.py.diff b/python/py-mitmproxy/files/patch-setup.py.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index f20863f..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-mitmproxy/files/patch-setup.py.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,39 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- setup.orig.py  2016-04-22 05:01:41.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ setup.py       2016-07-13 18:34:31.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -65,20 +65,20 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "certifi>=2015.11.20.1",  # no semver here - this should always be on the last release!
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "configargparse>=0.10, <0.11",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "construct>=2.5.2, <2.6",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "cryptography>=1.3,<1.4",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "Flask>=0.10.1, <0.11",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "cryptography>=1.3,<1.5",               # upstream commit ef363270b8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "Flask>=0.10.1, <0.12",                 # upstream commit b5a39f7d6a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "h2>=2.1.2, <3.0",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "hpack>=2.1.0, <3.0",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "html2text>=2016.1.8, <=2016.4.2",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "hyperframe>=3.2.0, <4.0",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "html2text>=2016.1.8, <=2016.5.29",     # upstream commit b5a39f7d6a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "hyperframe>=3.2.0, !=4.0.0, <5",       # upstream commit ecf4adf30b, f969c70015
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "lxml>=3.5.0, <3.7",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "Pillow>=3.2, <3.3",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "Pillow>=3.2, <3.4",                    # upstream commit e89defe9ad
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "passlib>=1.6.5, <1.7",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "pyasn1>=0.1.9, <0.2",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "pyOpenSSL>=16.0, <17.0",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "pyparsing>=2.0,<2.1",  # 2.1.1 breaks our binaries, see https://sourceforge.net/p/pyparsing/bugs/93/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "pyparsing>=2.1.3,<2.2",                # upstream commit c973fd881f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "pyperclip>=1.5.22, <1.6",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        "requests>=2.9.1, <2.10",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "requests>=2.9.1, <2.11",               # upstream commit b5a39f7d6a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "six>=1.10, <1.11",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "tornado>=4.3, <4.4",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         "urwid>=1.3.1, <1.4",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -116,7 +116,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         'examples': [
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             "beautifulsoup4>=4.4.1, <4.5",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             "harparser>=0.2, <0.3",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            "pytz>=2015.07.0, <=2016.3",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "pytz>=2015.07.0, <=2016.4",        # upstream commit b5a39f7d6a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- )
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/pr2170.patch b/python/py-mitmproxy/files/pr2170.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..7f3ca3f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/files/pr2170.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git test/mitmproxy/contentviews/test_xml_html.py test/mitmproxy/contentviews/test_xml_html.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 899ecfded..2b0aee4d6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/mitmproxy/contentviews/test_xml_html.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/mitmproxy/contentviews/test_xml_html.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -23,7 +23,7 @@ def test_format_xml(filename):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     path = data.path(filename)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     with open(path) as f:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         input = f.read()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    with open(path.replace(".", "-formatted.")) as f:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    with open("-formatted.".join(path.rsplit(".", 1))) as f:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         expected = f.read()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tokens = xml_html.tokenize(input)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert xml_html.format_xml(tokens) == expected
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/pr2208.patch b/python/py-mitmproxy/files/pr2208.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..b541ca2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/files/pr2208.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,70 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/proxy/protocol/http2.py mitmproxy/proxy/protocol/http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a6e8a4dd9..c1812b3da 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/proxy/protocol/http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/proxy/protocol/http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -188,7 +188,7 @@ def _handle_data_received(self, eid, event, source_conn):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.streams[eid].kill()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.connections[source_conn].safe_reset_stream(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 event.stream_id,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                h2.errors.REFUSED_STREAM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                h2.errors.ErrorCodes.REFUSED_STREAM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.log("HTTP body too large. Limit is {}.".format(bsl), "info")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -207,7 +207,7 @@ def _handle_stream_ended(self, eid):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def _handle_stream_reset(self, eid, event, is_server, other_conn):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.streams[eid].kill()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if eid in self.streams and event.error_code == h2.errors.CANCEL:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if eid in self.streams and event.error_code == h2.errors.ErrorCodes.CANCEL:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if is_server:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 other_stream_id = self.streams[eid].client_stream_id
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -228,7 +228,7 @@ def _handle_connection_terminated(self, event, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             event.last_stream_id,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             event.additional_data), "info")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if event.error_code != h2.errors.NO_ERROR:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if event.error_code != h2.errors.ErrorCodes.NO_ERROR:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # Something terrible has happened - kill everything!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.connections[self.client_conn].close_connection(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 error_code=event.error_code,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git test/mitmproxy/proxy/protocol/test_http2.py test/mitmproxy/proxy/protocol/test_http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1f695cc5f..23027c242 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/mitmproxy/proxy/protocol/test_http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/mitmproxy/proxy/protocol/test_http2.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,7 +36,11 @@ class _Http2ServerBase(net_tservers.ServerTestBase):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class handler(mitmproxy.net.tcp.BaseHandler):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def handle(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            h2_conn = h2.connection.H2Connection(client_side=False, header_encoding=False)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            config = h2.config.H2Configuration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                client_side=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                validate_outbound_headers=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                validate_inbound_headers=False)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            h2_conn = h2.connection.H2Connection(config)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             preamble = self.rfile.read(24)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             h2_conn.initiate_connection()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -138,7 +142,11 @@ def _setup_connection(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         client.convert_to_ssl(alpn_protos=[b'h2'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        h2_conn = h2.connection.H2Connection(client_side=True, header_encoding=False)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        config = h2.config.H2Configuration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            client_side=True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            validate_outbound_headers=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            validate_inbound_headers=False)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        h2_conn = h2.connection.H2Connection(config)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         h2_conn.initiate_connection()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         client.wfile.write(h2_conn.data_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         client.wfile.flush()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -756,7 +764,7 @@ class TestMaxConcurrentStreams(_Http2Test):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     @classmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def setup_class(cls):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         _Http2TestBase.setup_class()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        _Http2ServerBase.setup_class(h2_server_settings={h2.settings.MAX_CONCURRENT_STREAMS: 2})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _Http2ServerBase.setup_class(h2_server_settings={h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 2})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     @classmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def handle_server_event(cls, event, h2_conn, rfile, wfile):
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/pr2239.patch b/python/py-mitmproxy/files/pr2239.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..c291d67
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/files/pr2239.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,352 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contentviews/image/image_parser.py mitmproxy/contentviews/image/image_parser.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 062fb38e3..7c74669af 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contentviews/image/image_parser.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contentviews/image/image_parser.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -37,7 +37,7 @@ def parse_gif(data: bytes) -> Metadata:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     descriptor = img.logical_screen_descriptor
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     parts = [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ('Format', 'Compuserve GIF'),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        ('Version', "GIF{}".format(img.header.version.decode('ASCII'))),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        ('Version', "GIF{}".format(img.hdr.version)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ('Size', "{} x {} px".format(descriptor.screen_width, descriptor.screen_height)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ('background', str(descriptor.bg_color_index))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/exif.py mitmproxy/contrib/kaitaistruct/exif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6236a7086..2e8f1f9ff 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/exif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/exif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,16 +1,18 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# The source was exif.ksy from here - https://github.com/kaitai-io/kaitai_struct_formats/blob/24e2d00048b8084ceec30a187a79cb87a79a48ba/image/exif.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from enum import Enum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from pkg_resources import parse_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from .exif_le import ExifLe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from .exif_be import ExifBe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from exif_le import ExifLe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Exif(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -22,3 +24,5 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.body = ExifLe(self._io)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         elif _on == 19789:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.body = ExifBe(self._io)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/exif_be.py mitmproxy/contrib/kaitaistruct/exif_be.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7980a9e8f..8a6e7a2b5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/exif_be.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/exif_be.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,14 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# The source was exif_be.ksy from here - https://github.com/kaitai-io/kaitai_struct_formats/blob/24e2d00048b8084ceec30a187a79cb87a79a48ba/image/exif_be.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from enum import Enum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from pkg_resources import parse_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class ExifBe(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -569,3 +572,5 @@ def ifd0(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._m_ifd0 = self._root.Ifd(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io.seek(_pos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return self._m_ifd0 if hasattr(self, '_m_ifd0') else None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/exif_le.py mitmproxy/contrib/kaitaistruct/exif_le.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 207b3bebe..84e53a38d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/exif_le.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/exif_le.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,14 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# The source was exif_le.ksy from here - https://github.com/kaitai-io/kaitai_struct_formats/blob/24e2d00048b8084ceec30a187a79cb87a79a48ba/image/exif_le.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from enum import Enum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from pkg_resources import parse_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class ExifLe(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -569,3 +572,5 @@ def ifd0(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._m_ifd0 = self._root.Ifd(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io.seek(_pos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return self._m_ifd0 if hasattr(self, '_m_ifd0') else None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/gif.py mitmproxy/contrib/kaitaistruct/gif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 61499cc73..820df568c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/gif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/gif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,14 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# The source was png.ksy from here - https://github.com/kaitai-io/kaitai_struct_formats/blob/562154250bea0081fed4e232751b934bc270a0c7/image/gif.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from enum import Enum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from pkg_resources import parse_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Gif(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class BlockType(Enum):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -24,8 +27,8 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        self.header = self._root.Header(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        self.logical_screen_descriptor = self._root.LogicalScreenDescriptor(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        self.hdr = self._root.Header(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        self.logical_screen_descriptor = self._root.LogicalScreenDescriptorStruct(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if self.logical_screen_descriptor.has_color_table:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._raw_global_color_table = self._io.read_bytes((self.logical_screen_descriptor.color_table_size * 3))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             io = KaitaiStream(BytesIO(self._raw_global_color_table))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -55,7 +58,7 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.blue = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    class LogicalScreenDescriptor(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    class LogicalScreenDescriptorStruct(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -163,7 +166,7 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.magic = self._io.ensure_fixed_contents(struct.pack('3b', 71, 73, 70))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.version = self._io.read_bytes(3)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.version = (self._io.read_bytes(3)).decode(u"ASCII")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class ExtGraphicControl(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -245,3 +248,6 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self.body = self._root.ExtGraphicControl(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self.body = self._root.Subblocks(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/jpeg.py mitmproxy/contrib/kaitaistruct/jpeg.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 08e382a97..a49c83b93 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/jpeg.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/jpeg.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,15 +1,18 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# The source was jpeg.ksy from here - https://github.com/kaitai-io/kaitai_struct_formats/blob/24e2d00048b8084ceec30a187a79cb87a79a48ba/image/jpeg.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from enum import Enum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from pkg_resources import parse_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from .exif import Exif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from exif import Exif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Jpeg(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class ComponentId(Enum):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -127,7 +130,7 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.magic = self._io.read_strz("ASCII", 0, False, True, True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.magic = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             _on = self.magic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if _on == u"Exif":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self.body = self._root.ExifInJpeg(self._io, self, self._root)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -195,7 +198,7 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.magic = self._io.read_str_byte_limit(5, "ASCII")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.magic = (self._io.read_bytes(5)).decode(u"ASCII")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.version_major = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.version_minor = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.density_units = self._root.SegmentApp0.DensityUnit(self._io.read_u1())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -204,3 +207,6 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.thumbnail_x = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.thumbnail_y = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.thumbnail = self._io.read_bytes(((self.thumbnail_x * self.thumbnail_y) * 3))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/make.sh mitmproxy/contrib/kaitaistruct/make.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100755
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000..218d51989
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/make.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#!/usr/bin/env bash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/exif_be.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/exif_le.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/exif.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/gif.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/jpeg.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++wget -N https://raw.githubusercontent.com/kaitai-io/kaitai_struct_formats/master/image/png.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++kaitai-struct-compiler --target python --opaque-types=true *.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/png.py mitmproxy/contrib/kaitaistruct/png.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2f3c1a5c3..98a706937 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/png.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/png.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,14 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# The source was png.ksy from here - https://github.com/kaitai-io/kaitai_struct_formats/blob/9370c720b7d2ad329102d89bdc880ba6a706ef26/image/png.ksy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from enum import Enum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from pkg_resources import parse_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Png(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class ColorType(Enum):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -51,7 +54,7 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.len = self._io.read_u4be()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.type = self._io.read_str_byte_limit(4, "UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.type = (self._io.read_bytes(4)).decode(u"UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             _on = self.type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if _on == u"iTXt":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 self._raw_body = self._io.read_bytes(self.len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -194,7 +197,7 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.keyword = self._io.read_strz("UTF-8", 0, False, True, True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.compression_method = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._raw_text_datastream = self._io.read_bytes_full()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.text_datastream = zlib.decompress(self._raw_text_datastream)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -259,12 +262,12 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.keyword = self._io.read_strz("UTF-8", 0, False, True, True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.compression_flag = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.compression_method = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.language_tag = self._io.read_strz("ASCII", 0, False, True, True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.translated_keyword = self._io.read_strz("UTF-8", 0, False, True, True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.text = self._io.read_str_eos("UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.language_tag = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.translated_keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.text = (self._io.read_bytes_full()).decode(u"UTF-8")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class TextChunk(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -272,8 +275,8 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._parent = _parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._root = _root if _root else self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.keyword = self._io.read_strz("iso8859-1", 0, False, True, True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            self.text = self._io.read_str_eos("iso8859-1")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"iso8859-1")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.text = (self._io.read_bytes_full()).decode(u"iso8859-1")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class TimeChunk(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -287,3 +290,6 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.hour = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.minute = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.second = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/exif.py mitmproxy/contrib/kaitaistruct/exif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2e8f1f9ff..d99cceef1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/exif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/exif.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12,7 +12,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from exif_le import ExifLe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from .exif_le import ExifLe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from .exif_be import ExifBe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Exif(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self._io = _io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -24,5 +26,3 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.body = ExifLe(self._io)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         elif _on == 19789:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.body = ExifBe(self._io)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/contrib/kaitaistruct/jpeg.py mitmproxy/contrib/kaitaistruct/jpeg.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a49c83b93..33fc012fa 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/contrib/kaitaistruct/jpeg.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/contrib/kaitaistruct/jpeg.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12,7 +12,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if parse_version(ks_version) < parse_version('0.7'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from exif import Exif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from .exif import Exif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class Jpeg(KaitaiStruct):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     class ComponentId(Enum):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -207,6 +208,3 @@ def __init__(self, _io, _parent=None, _root=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.thumbnail_x = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.thumbnail_y = self._io.read_u1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.thumbnail = self._io.read_bytes(((self.thumbnail_x * self.thumbnail_y) * 3))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span></pre><pre style='margin:0'>

</pre>