# coding: utf-8

# https://docs.python.org/3/library/http.client.html#http.client.HTTPConnection.getresponse
# Запуск скрипта python3 http.client.py

# Подключение необходимых модулей.
import http.client
import ssl
import base64
import zlib
import json
import urllib.parse
import socket

# Список используемых протоколов.
protocolData = {10: 'HTTP/1.0', 11: 'HTTP/1.1'}

from sys import argv

script, dataJson = argv

# Настройки.
configData = {"url": "", "proxy": "", "auth": "", "headers": "", "timeout": "", "returnHeaders": ""}

arrData = json.loads(dataJson)

for key in arrData:
	configData[key] = arrData[key]
	
# Проверка и установка настроек.
url = ''
proxy = ''
auth = ''
headers = {}
timeout = 60
returnHeaders = 0
	
if configData["url"] != '':
	url = configData["url"]
else:
	print("Error URL.")
	exit()
	
if configData["proxy"] != '':
	proxy = configData["proxy"]
else:
	print("Error proxy.")
	exit()
	
if configData["auth"] != '':
	auth = configData["auth"]
else:
	print("Error proxy auth.")
	exit()
	
if configData["headers"] != '':
	headers = configData["headers"]
	
if configData["timeout"] != '':
	timeout = configData["timeout"]
	
if configData["returnHeaders"] != '':
	returnHeaders = configData["returnHeaders"]	
	
# print(url)
# print(proxy)
# print(auth)
# print(headers)

# Разбор URL для запроса.
urlData = urllib.parse.urlparse(url);

# print(urlData)

useUrl = urlData.netloc
usePath = urlData.path
useQuery = '';

if urlData.query != '':
	usePath = usePath+'?'+urlData.query

useUrlArr = useUrl.split(':')
# print(useUrlArr)

# print(usePath)

# exit()

# Авторизация прокси.
authBytes = auth.encode("utf-8")
headersProxy = {
	'Proxy-Authorization': 'Basic ' + base64.b64encode(authBytes).decode("utf-8")
}

proxyArr = proxy.split(':')

# Максимальное количество подключений.
maxConnect = 5
# Количество попыток.
attemptsConnect = 0;
# Статус подключения.
statusConnect = False

while statusConnect == False:
	attemptsConnect = attemptsConnect + 1
	
	# print(attemptsConnect)
	
	# print(socket.getaddrinfo(useUrlArr[0], 443))
	
	conn = http.client.HTTPSConnection(proxyArr[0], proxyArr[1], timeout = timeout)
	conn.set_tunnel(useUrlArr[0], 443, headers = headersProxy)

	payload = ''

	try:
		conn.request("GET", usePath, payload, headers)
		res = conn.getresponse()

		# Вывод кода ответа и заголовка.
		if returnHeaders != 0:
			print(protocolData[res.version], res.status, res.reason)
			print(res.msg)

		# Чтение данных.
		data = res.read()

		if res.getheader('Content-Encoding') == 'gzip':
			print(zlib.decompress(data, 16+zlib.MAX_WBITS).decode("utf-8")) # Вывод ответа с сжатием.
		else:
			print(data.decode("utf-8")) # Вывод ответа без сжатием.
			
		statusConnect = True

	except socket.timeout:

		if attemptsConnect >= maxConnect:
			statusConnect = True
			print('Error timeout socket')

	finally:
		conn.close()