#import copy import os #import sys #import base64 #import hashlib #import re import pprint import docing import filing import lxml.etree as etree from lxml.builder import ElementMaker from nitpo import Nitpo #from sheets import Sheets from profile import Profile from urllib.parse import urlparse, parse_qs class Web(Nitpo): def __init__(self, do_verbose=False): """web class""" super().__init__() self.N = "{%s}" % self.const['ns'] self.E = ElementMaker(nsmap={None: self.const['ns']}) self.env = None #self.sheets = Sheets() self.len_start = 0 if self.has_conf('web', 'pathstart'): self.len_start = len(self.conf['web']['pathstart']) self.diags = [] self.profile = Profile() # # web element to be transformed self.web_ele = None # # status code self.status = None # # action code from request self.acod = None self.do_verbose = do_verbose def output(self, env, preps): self.env = env self.preps = preps web_ele = self.E(self.N + 'web') self.web_ele = web_ele # web_doc = etree.ElementTree(web_ele) # sheet_fufi = self.sheets.get_sheet_fufi('web') # changes self.check_request(env) #if out['status'] == '301': # return out # out = docing.show(web_ele) web_doc = etree.ElementTree(web_ele) out = str(preps['web_sheet'](web_doc)) return out def check_request(self, env): env_ele = etree.SubElement(self.web_ele, 'env') # early try to XML the enviroment #for param in env: # if not self.preps['res']['main_param_name'].match(param): # continue # param_ele = etree.SubElement(env_ele, param) # if param_ele is None: # continue # if env[param] is not None: # try: # param_ele.text(pprint.pformat(env[param])) # except TypeError: # continue # env_ele.text = pprint.pformat(env) raw_uri = env['RAW_URI'] full_uri = env['RAW_URI'] if raw_uri.startswith('//'): # # add the pathstart if self.has_conf('web', 'pathstart'): full_uri = self.conf['web']['pathstart'] + '/' \ + raw_uri[2:] if not self.preps['res']['url_u'].match(raw_uri): self.web_ele.attrib['status'] = '400' return kisu = raw_uri[4:26] acod = raw_uri[2:3] self.web_ele.attrib['kisu'] = kisu if kisu not in self.preps['vakis']: self.web_ele.attrib['status'] = '200' self.web_ele.attrib['found'] = 'false' return subda = self.preps['vakis'][kisu] emad = subda['emad'] self.web_ele.attrib['emad'] = emad env_ele = etree.SubElement(self.web_ele, 'env') #for param in env: # param_ele = etree.SubElement(env_ele, param) # # param_ele.text(env[param]) env_ele.text = pprint.pformat(env) repcode = subda['repcode'] self.web_ele.attrib['repcode'] = repcode query_string = env['QUERY_STRING'] if len(query_string) > 0 and acod == 'u': self.parse_query_u(env) fufi = self.profile.fufi_from_emad(emad) self.web_ele.attrib['fufi'] = fufi if not os.path.isfile(fufi): print(f"web does not see {fufi}") #if not os.path.isfile(fufi): # # well reads the file twice sub_doc = filing.parse_lax(fufi) self.web_ele.attrib['fiken'] = filing.md5(fufi) self.web_ele.append(sub_doc.getroot()) #URL='https://someurl.com/with/query_string?i=main&mode=front&sid=12ab&enc=+Hello' #parsed_url = urlparse(URL) # return def parse_query_u(self, env): query_string = env['QUERY_STRING'] self.web_ele.attrib['query_string'] = query_string query = parse_qs(query_string) query_ele = etree.SubElement(self.web_ele, 'query') for name in query: for value in query[name]: name_ele = etree.SubElement(query_ele, name) name_ele.text = value #if('not_really' in query): # if query['not_really'][0] == 'true': # if 'redirect' not in query: # # self.web_ele.attrib['query_string'] = env['QUERY_STRING'] # query_string = env['QUERY_STRING'] # query = parse_qs(query_string) # query_ele = etree.SubElement(self.web_ele, 'query') # for name in query: # for value in query[name]: # name_ele = etree.SubElement(self.web_ele, name) # name_ele.text = value #def web_doc(self, ): # web_ele = self.E(self.N + 'web') # # return self.wex