# -*- coding: utf-8 -*-
# (C) Fabrice Sincère ; Lycée Algoud-Laffemas Valence
# python 3

# version
VERSION = "1.0"

import sys

if sys.version_info < (3, 0):
    print("Python version " + sys.version)
    print("Erreur : Vous devez utilisez Python version 3")
    sys.exit(1)

# http.client is a low-level HTTP protocol client
# for high-level URL opening use urllib.request
# biblio : https://docs.python.org/3/library/http.client.html
import http.client
import urllib.parse

requetes = ["HEAD", "GET", "POST"]

print("""
#################
# Requête HTTPS #
#################
""")

pproxy = input("Etes-vous derrière un serveur proxy (o/n) ? ") # non par défaut
if pproxy == "o":
    pproxy_adresse = input("Adresse du proxy ? ") # exemple : 172.16.0.1
    while True:
        try:
            pproxy_port = int(input("Numéro de port ? ")) # exemple : 3128
            break
        except:
            print('Valeur invalide\n')
else:
    print("Pas de proxy")

#domaine = input("\nNom de domaine du serveur HTTP ? ") # exemple : fsincere.free.fr ou fsincere.free.fr:80
domaine = input("\nNom de domaine du serveur HTTPS ? ") # exemple : www.python.org

while True:

    emplacement_ressource = input("\nChemin et nom de la ressource ?  /")
    # exemple : isn/langages_web/doc/calcul_carre_get.php?Nombre=12
    emplacement_ressource = "/" + emplacement_ressource

    while True:
        try:
            type_requete = int(input("""
Sélectionner le type de requête :
HEAD --> 0
GET  --> 1
POST --> 2 ? """))
            if type_requete in [0, 1, 2]:
                break
            else:
                print('Valeur invalide\n')
        except:
            print('Valeur invalide\n')

    if pproxy == "o":
        # connexion derrière un proxy
        # exemple :
        # conn = http.client.HTTPConnection("172.16.0.1", 3128)
        # conn.set_tunnel("fsincere.free.fr")
        #conn = http.client.HTTPConnection(pproxy_adresse, pproxy_port) # http
        conn = http.client.HTTPSConnection(pproxy_adresse, pproxy_port) # https
        conn.set_tunnel(domaine)

    else:
        # connexion sans proxy
        # exemple : conn = http.client.HTTPConnection("fsincere.free.fr")
        #conn = http.client.HTTPConnection(domaine)# http
        conn = http.client.HTTPSConnection(domaine)# https
        

    if requetes[type_requete] in ["HEAD", "GET"]:
        print("""
Requête du client
-----------------
{} https://{}{}
""".format(requetes[type_requete], domaine, emplacement_ressource))

        conn.request(requetes[type_requete], emplacement_ressource)

    elif requetes[type_requete] == "POST":

        params = {}
        # exemple : {'Nombre': '12524', 'type': 'issue', 'action': 'show'}

        while True:
            param = input("\nNom du paramètre ? ")
            valeur = input("Valeur ? ")
            params[param] = valeur  # on ajoute au dictionnaire

            continuez = input("\nUn autre paramètre (o/n) ? ")
            if continuez == "n": # oui par défaut
                break

        pparams = urllib.parse.urlencode(params)
        # exemple : Nombre=12524&type=issue&action=show

        print("""
Requête du client
-----------------
POST https://{}{}
Content-Type: application/x-www-form-urlencoded
{}
""".format(domaine, emplacement_ressource, pparams))
        # exemple :
        # POST http://fsincere.free.fr/isn/langages_web/doc/compte_bdd_enregistrement.php
        # Content-Type: application/x-www-form-urlencoded
        # User=Test&Password=Uyte8op

        conn.request("POST", emplacement_ressource, pparams, headers={"Content-type": "application/x-www-form-urlencoded"})

    print("""
Réponse du serveur
------------------
""")

    r = conn.getresponse()

    print("""Version du protocole
--------------------
HTTP/{:.1f}
""".format(0.1*r.version))
    
    print("""Statut
------
{} {}
""".format(r.status, r.reason))

    print("""
En-tête
-------""")

    print(r.msg)

    data = r.read()  # type bytes

    if len(data) > 0 :
        print("""
Données
-------
""")
        print(data.decode(encoding='utf-8', errors='replace')) # type str

    continuez = input("\nUne autre requête (o/n) ? ")
    if continuez == "n": # oui par défaut
        break

conn.close()
print("Bye !")
