#!/usr/bin/env python3

import argparse
import logging
import socket
import ssl

HOST = 'satori.tcs.uj.edu.pl'
PORT = 'https'
PATH = '/'

parser = argparse.ArgumentParser(description='HTTPS Downloader')
parser.add_argument('--debug', action='store_true')
parser.add_argument('--host', default=HOST)
parser.add_argument('--port', default=PORT)
parser.add_argument('--certificate', action='append')
parser.add_argument('path', nargs='?', default=PATH)
args = parser.parse_args()
if args.debug:
    logging.basicConfig(level=logging.DEBUG)
else:
    logging.basicConfig(level=logging.INFO)
try:
    port = int(args.port)
except:
    port = socket.getservbyname(args.port)


sock = socket.create_connection((args.host, port))
context = ssl.create_default_context()
for certificate in args.certificate or []:
    context.load_verify_locations(certificate)
sock = context.wrap_socket(sock, server_hostname=args.host)

request = b'\r\n'.join([ bytes(line, 'utf-8') for line in [
    f'GET {args.path} HTTP/1.0',
    f'Host: {args.host}',
    '',
    ''
    ]])

logging.info(f'REQUEST {request}')
for line in request.split(b'\r\n'):
    logging.info(f'  {line}')
sock.sendall(request)
response = b''
while True:
    part = sock.recv(8192)
    if part == b'':
        break
    response += part
logging.info(f'RESPONSE {response}')
for line in response.split(b'\r\n'):
    logging.info(f'  {line}')
sock.close()
