From 7fefbe7a18197c504c9b7185f5cfc404f874988a Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Tue, 24 May 2022 10:07:28 +0300 Subject: [PATCH] Add inUseCacheBool in web url connect file / folder + autodetect MIME --- Sources/pyOpenRPA/Orchestrator/Server.py | 62 +++++++++++++++---- .../Orchestrator/__Orchestrator__.py | 12 ++-- Sources/pyOpenRPA/Tools/License.py | 6 +- changelog.md | 2 + 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/Sources/pyOpenRPA/Orchestrator/Server.py b/Sources/pyOpenRPA/Orchestrator/Server.py index 3560f861..80664bc1 100644 --- a/Sources/pyOpenRPA/Orchestrator/Server.py +++ b/Sources/pyOpenRPA/Orchestrator/Server.py @@ -26,6 +26,9 @@ global gSettingsDict from . import ServerSettings from . import __Orchestrator__ import copy +import mimetypes + +gCacheDict = {} # Tool to merge complex dictionaries @@ -266,6 +269,8 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): #Tech sub def - do item ################################ def URLItemDo(inURLItem,inRequest,inGlobalDict): + global gCacheDict + inResponseDict["Headers"]["Content-type"]= None inResponseDict = inRequest.OpenRPAResponseDict #Set status code 200 inResponseDict["StatusCode"] = 200 @@ -274,11 +279,27 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"] #If file path is set if "ResponseFilePath" in inURLItem: - lFileObject = open(inURLItem["ResponseFilePath"], "rb") - # Write content as utf-8 data - inResponseDict["Body"] = lFileObject.read() - # Закрыть файловый объект - lFileObject.close() + # Check cache + if inURLItem.get("inUseCacheBool",False) == True: + if inURLItem["ResponseFilePath"] in gCacheDict: + # Write content as utf-8 data + inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] + else: + lFileObject = open(inURLItem["ResponseFilePath"], "rb") + # Write content as utf-8 data + gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read() + inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] + # Закрыть файловый объект + lFileObject.close() + else: + lFileObject = open(inURLItem["ResponseFilePath"], "rb") + # Write content as utf-8 data + inResponseDict["Body"] = lFileObject.read() + # Закрыть файловый объект + lFileObject.close() + # detect MIME type if none + if inResponseDict["Headers"]["Content-type"] is None: + inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0] #If function is set if "ResponseDefRequestGlobal" in inURLItem: lDef = inURLItem["ResponseDefRequestGlobal"] @@ -290,6 +311,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): else: inURLItem["ResponseDefRequestGlobal"]() if "ResponseFolderPath" in inURLItem: + #lRequestPath = inRequest.path lRequestPath = urllib.parse.unquote(inRequest.path) if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings @@ -298,12 +320,30 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): #print(f"File full path {lFilePath}") #Check if file exist if os.path.exists(lFilePath) and os.path.isfile(lFilePath): - lFileObject = open(lFilePath, "rb") - # Write content as utf-8 data - inResponseDict["Body"] = lFileObject.read() - inResponseDict["ContentType"]= "application/octet-stream" - # Закрыть файловый объект - lFileObject.close() + # Check cache + if inURLItem.get("inUseCacheBool",False) == True: + if lFilePath in gCacheDict: + # Write content as utf-8 data + inResponseDict["Body"] = gCacheDict[lFilePath] + else: + lFileObject = open(lFilePath, "rb") + # Write content as utf-8 data + gCacheDict[lFilePath] = lFileObject.read() + inResponseDict["Body"] = gCacheDict[lFilePath] + # Закрыть файловый объект + lFileObject.close() + else: + lFileObject = open(lFilePath, "rb") + # Write content as utf-8 data + inResponseDict["Body"] = lFileObject.read() + # Закрыть файловый объект + lFileObject.close() + # detect MIME type if none + if inResponseDict["Headers"]["Content-type"] is None: + inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0] + # If No content-type + if inResponseDict["Headers"]["Content-type"] is None: + inResponseDict["Headers"]["Content-type"]= "application/octet-stream" ############################################## # UAC Check if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]: diff --git a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py index c8b46e5a..38cb7a9c 100644 --- a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -880,7 +880,7 @@ def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentType inGSettings["ServerDict"]["URLList"].append(lURLItemDict) -def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None): +def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None, inUseCacheBool= False): """ Connect URL to Folder "inMethodStr":"GET|POST", @@ -895,6 +895,7 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, :param inMatchTypeStr: :param inFolderPathStr: :param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user + :param inUseCacheBool: True - cache this page - dont open ever """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check if last symbol is "/" - append if not exist @@ -909,12 +910,13 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, "ResponseFolderPath": lFolderPathStr, # Absolute or relative path "ResponseContentType": "application/octet-stream", #HTTP Content-type #"ResponseDefRequestGlobal": inDef #Function with str result - "UACBool": inUACBool + "UACBool": inUACBool, + "UseCacheBool": inUseCacheBool } inGSettings["ServerDict"]["URLList"].append(lURLItemDict) -def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None): +def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None, inUseCacheBool = False): """ Connect URL to File "inMethodStr":"GET|POST", @@ -929,6 +931,7 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo :param inFilePathStr: :param inContentTypeStr: :param inUACBool: default: None; True - check user access before do this URL item. None - get Server flag if ask user + :param inUseCacheBool: True - cache this page - dont open ever """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings lURLItemDict = { @@ -939,7 +942,8 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo #"ResponseFolderPath": os.path.abspath(inFilePathStr), # Absolute or relative path "ResponseContentType": inContentTypeStr, #HTTP Content-type #"ResponseDefRequestGlobal": inDef #Function with str result - "UACBool":inUACBool + "UACBool":inUACBool, + "UseCacheBool": inUseCacheBool } inGSettings["ServerDict"]["URLList"].append(lURLItemDict) diff --git a/Sources/pyOpenRPA/Tools/License.py b/Sources/pyOpenRPA/Tools/License.py index dd4a72b5..4a970f44 100644 --- a/Sources/pyOpenRPA/Tools/License.py +++ b/Sources/pyOpenRPA/Tools/License.py @@ -70,7 +70,7 @@ def ConsoleVerify() -> bool: Цифровой сертификат pyOpenRPA не обнаружен. Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: -https://pyopenrpa.ru/certificate +https://pyopenrpa.ru/verification Операция формирования сертификата является автоматизированной и занимает несколько секунд. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. @@ -89,7 +89,7 @@ https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf Обнаружен цифровой сертификат pyOpenRPA: {0}. Проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: -https://pyopenrpa.ru/certificate +https://pyopenrpa.ru/verification pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. По всем вопросам Вы можете обратиться к правообладателю, контакты см. по адресу: @@ -143,7 +143,7 @@ pyOpenRPA - это открытое программное обеспечени Данный сертификат является свидетельством того, что Вы наделены правами в отношении pyOpenRPA в соответствии с законодательством Российской Федерации. Получить или проверить сертификат, а также ознакомиться с текстом лицензионного соглашения Вы можете по адресу: -https://pyopenrpa.ru/certificate +https://pyopenrpa.ru/verification Операция формирования сертификата является автоматизированной и занимает несколько секунд. pyOpenRPA не использует какие-либо инструменты физической блокировки функциональности своего ПО. diff --git a/changelog.md b/changelog.md index 064aa92c..2f1143c0 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,8 @@ [1.2.12] 2022_Q2 - ORCHESTRATOR +- - WebURL... Support inUseCacheBool - cache the web pages +- - Web server auto detect MIME type from the file name - - Raise debug session from production. Support init_debug file in working directory - - MANAGERS - - - ControlPanel