#!/usr/bin/env python3
from pathlib import Path
from datetime import datetime
p=Path('/srv/apps/sotlab-users/sotlab_users_app.py')
s=p.read_text()
bak=p.with_name(p.name + '.bak.post-body-proxy.' + datetime.now().strftime('%Y%m%d%H%M%S'))
bak.write_text(s)

s=s.replace("    def proxy_to_local(self, upstream):\n", "    def proxy_to_local(self, upstream, body_override=None):\n")
s=s.replace("""        body = None
        if self.command in ('POST', 'PUT', 'PATCH'):
            n = int(self.headers.get('Content-Length', '0') or '0')
            if n > 25 * 1024 * 1024:
                self.send_html(page('Too large', '<section class="panel"><h1>Request too large</h1></section>'), 413)
                return True
            body = self.rfile.read(n)
""", """        body = body_override
        if body is None and self.command in ('POST', 'PUT', 'PATCH'):
            n = int(self.headers.get('Content-Length', '0') or '0')
            if n > 25 * 1024 * 1024:
                self.send_html(page('Too large', '<section class="panel"><h1>Request too large</h1></section>'), 413)
                return True
            body = self.rfile.read(n)
""")
old = """        raw = self.rfile.read(n).decode('utf-8', 'replace')
        fields = {k: v[-1] for k, v in parse_qs(raw, keep_blank_values=True).items()}
"""
new = """        raw_bytes = self.rfile.read(n)
        raw = raw_bytes.decode('utf-8', 'replace')
        fields = {k: v[-1] for k, v in parse_qs(raw, keep_blank_values=True).items()}
"""
if old not in s:
    raise SystemExit('raw read block not found')
s=s.replace(old,new)
old2 = """            if isinstance(root, str) and root.startswith('http://'):
                self.proxy_to_local(root); return
"""
new2 = """            if isinstance(root, str) and root.startswith('http://'):
                self.proxy_to_local(root, raw_bytes); return
"""
if old2 not in s:
    raise SystemExit('post proxy call block not found')
s=s.replace(old2,new2)
p.write_text(s)
print(f'backup={bak}')
