#!python3
#-*- coding:utf-8 -*-
"""
"""
import time, sys, os.path
import getpass
#
from email.encoders import encode_noop, encode_7or8bit
from email.message import EmailMessage, MIMEPart
from email.policy import HTTP as HTTP_policy

from urllib.request import urlopen, Request

Uloader_url = 'http://webserver.xxx.yyy/ScrShot/upload.php'

def UploadScrShot3(f, title):
    #check if file named f exists
    if not os.path.isfile(f):
        raise RuntimeError("file %s does not exist"%f)
    fext=os.path.splitext(f)[1][1:]
    # clear HTTP_PROXY setting 
    os.environ['http_proxy']=""
    os.environ['HTTP_PROXY']=""
    #
    request = Request(Uloader_url)
    request.add_header('User-Agent',"Python-urllib")
    request.add_header('Accept-Encoding', 'gzip, deflate')
    request.add_header('Accept', '*/*')
    request.add_header('Connection', 'keep-alive')
    # parameters passed to uploader
    ts=time.localtime()
    raw_params = dict(
        year="%4d"%ts.tm_year, 
        month="%02d"%ts.tm_mon,
        day="%02d"%ts.tm_mday,
        Comment=title,
        )
    #
    #prepara payload as MIME/Multipart form data.
    mp=MIMEPart(policy=HTTP_policy)
    mp.add_header("Content-Type", "multipart/form-data")
    for k,v in raw_params.items():
        t=MIMEPart(policy=HTTP_policy)
        t.set_content(v, "plain",
                      charset="utf-8",cte="8bit",
                      disposition="form-data")
        t.set_param("name", k, header="Content-Disposition")
        mp.attach(t)
    raw_image=open(f,"rb").read()
    img=MIMEPart(policy=HTTP_policy)
    img.set_content(raw_image, "image", fext, 
                    cte="8bit", disposition="form-data", 
                    )
    img.set_param("name", "UserFile", header="Content-Disposition")
    img.set_param("filename", "image.png", header="Content-Disposition")
    mp.attach(img)
    #generate boundary delimeter string
    b=mp.as_bytes(False) # 
    boundary=mp.get_boundary()
    #
    request.add_header(
        'Content-Type',
        'multipart/form-data; boundary=\"{boundary}\"'.format(boundary=boundary)
        )
    # Python document says:
    #  Note A cte of binary does not actually work correctly yet. 
    #   The EmailMessage object as modified by set_content is correct, 
    #   but BytesGenerator does not serialize it correctly. 
    # rebuild request data.
    img.set_payload(b"") # clear raw image data.
    request.data = b""
    for e in mp.get_payload():
        request.data +=("\r\n--{boundary}\r\n".format(boundary=boundary)).encode()
        request.data +=e.as_bytes(False).rstrip()
    # here we assume that img is the last element of mp.get_payload()
    request.data += b"\r\n\r\n"
    request.data += raw_image
    
    request.data += ("\r\n--{boundary}--\r\n".format(boundary=boundary)).encode()
    request.add_header("Content-Length", len(request.data))
    
    res=urlopen(request)
    return 
