Trong Posted January 15, 2023 Share Posted January 15, 2023 (edited) - _Download() Automatically select test and select download method. - Support URL redirect - Account and password UDF: expandcollapse popup#include-once #include <FTPEx.au3> #include <WinAPIEx.au3> #include <String.au3> #include <InetConstants.au3> #include "WinHttp.au3" ;Opt("MustDeclareVars", 1) Opt("TrayAutoPause", 0) If StringInStr(@OSArch, "64") And (Not @AutoItX64) Then _WinAPI_Wow64EnableWow64FsRedirection(0) ; #CONSTANTS# =================================================================================================================== Global Const $ViewLogConsole = 1, $bGetFieSize = 1 Global Const $OPTION_ENABLE_REDIRECTS = 6, $OPTION_USER_AGENT = 0 Global $obError = False, $oErrorHandler = ObjEvent("AutoIt.Error", "__Skip_OBJ_Error") Global $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1") Global $sUSER_AGENT = __WinHttpUA(), $TempDir = @TempDir If Not _Directory_Is_Accessible($TempDir) Then $TempDir = @LocalAppDataDir & "\Temp" If Not _Directory_Is_Accessible($TempDir) Then $TempDir = @ScriptDir EndIf ; =========================================================================================== #comments-start ; Example Global $ftpUserName = "ftpuser@files.trong.live" Global $ftpPassword = "files.trong.live" Global $httpUserName = 'trong' Global $httpPassword = 'autoit' _Download('https://files.trong.live/test.jpg', @ScriptDir & "\testA.jpg") _Download('https://files.trong.live/prv/test.jpg', @ScriptDir & "\testA.jpg", $httpUserName, $httpPassword) _FTP_Download('ftp://files.trong.live/prv/test.jpg', @ScriptDir & "\testB.jpg", $ftpUserName, $ftpPassword) _Download('https://go.microsoft.com/fwlink/?LinkID=2093505', @ScriptDir & "\Microsoft_Edge_Ent_X86.msi") _WinHttp_Download('http://go.microsoft.com/fwlink/?LinkID=2093437', @ScriptDir & "\Microsoft_Edge_Ent_X64.msi") #comments-end ; #CURRENT# ===================================================================================================================== ; _Download() ; _FTP_Download() ; _WinHttp_Download() ; =============================================================================================================================== ; #FUNCTION# ==================================================================================================================== ; Author... ...........: Dao Van Trong - TRONG.LIVE ; =========================================================================================== Func _Download($sURL_Input, $sLocalPathSAVE, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) $sURL_Input = StringReplace($sURL_Input, "\", "/") If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If ($dProtocol = "ftp" Or $dProtocol = "sftp" Or $dProtocol = "ftps") Then Local $fDL = _FTP_Download($sURL_Input, $sLocalPathSAVE, $dUserName, $dPassword) Return SetError(@error, @extended, $fDL) EndIf If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf If (Not ($dUserName == '')) Then ;$dUserName = StringReplace($dUserName, '@', '%40') If ($dProtocol == 'https' And $dPort <> 443) Or ($dProtocol == 'http' And $dPort <> 80) Then $sURL_Input = $dProtocol & "://" & $dUserName & ":" & $dPassword & "@" & $dDomain & ":" & $dPort & $dURLFilePathName Else $sURL_Input = $dProtocol & "://" & $dUserName & ":" & $dPassword & "@" & $dDomain & $dURLFilePathName EndIf EndIf _LogDebug("- InetGet Download: " & $sURL_Input & " -> " & $sLocalPathSAVE & @CRLF) Local $dlTempFilePath While 1 $dlTempFilePath = $TempDir & "\~download-" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "-" & Random(88888888, 99999999, 1) & ".tmp" If (Not FileExists($dlTempFilePath)) Then ExitLoop WEnd $dUserName = StringReplace($dUserName, '%40', '@') Local $sURL_Rediect Local $urlStatus = __URL_Check($sURL_Input, $sURL_Rediect, $dUserName, $dPassword) If @error Then _LogDebug("! /!\ Test connect Error ! " & @CRLF) Return 0 EndIf If ($sURL_Rediect == "") Then Else $sURL_Input = $sURL_Rediect EndIf HttpSetUserAgent($sUSER_AGENT) If $bGetFieSize Then _LogDebug("+ Get file size.... ") $dFileSize = InetGetSize($sURL_Input) If @error Then _LogDebug(" ERROR !" & @CRLF) Else _LogDebug(" OK -> " & _Byte_GetDisplay($dFileSize) & " " & @CRLF) EndIf EndIf _LogDebug("+ Downloading.... ") Local $hDownload = InetGet($sURL_Input, $dlTempFilePath, 1 + 2 + 16, 1) Local $Percentage = 0, $Old_Percentage = 0, $TotalToDownload = 0, $BytesDownloaded = 0, $DownloadedSoFar = 0, $pCheck = 0 Do Sleep(100) If $dFileSize > 0 Then ; Get number of bytes read for current file $BytesDownloaded = InetGetInfo($hDownload, 0) ; Add this to the cumulative total $DownloadedSoFar = $TotalToDownload + $BytesDownloaded ; Calculate the current file percentage $Percentage = Floor(($BytesDownloaded / $dFileSize) * 100) ; Only update the current file percent label if it has changed to avoid flickering If ($Percentage - $Old_Percentage) > 4 Then _LogDebug($Percentage & "% ") $Old_Percentage = $Percentage EndIf EndIf Until InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE) ; Retrieve the number of total bytes received and the filesize. ;Local $iBytesSize = InetGetInfo($hDownload, $INET_DOWNLOADREAD) ;Local $iFileSize = FileGetSize($dlTempFilePath) ;ConsoleWrite("- Downloaded: " & $iBytesSize & " KB/s " & @CRLF) ;ConsoleWrite("- File Size: " & $iFileSize & " KB/s " & @CRLF) Local $aDownloadData = InetGetInfo($hDownload) InetClose($hDownload) If ($aDownloadData[$INET_DOWNLOADSUCCESS] And FileExists($dlTempFilePath)) Then _LogDebug("- DONE !" & @CRLF) __File_SAVE($dlTempFilePath, $sLocalPathSAVE) If FileExists($sLocalPathSAVE) Then _LogDebug("+ Save file to: " & $sLocalPathSAVE & " OK !" & @CRLF) Else _LogDebug("! Save file to: " & $sLocalPathSAVE & " ERROR !" & @CRLF) EndIf Else _LogDebug(" ERROR " & @CRLF) _LogDebug("- Try Download again with WinHttp !" & @CRLF) Return _WinHttp_Download($sURL_Input, $sLocalPathSAVE) EndIf EndFunc ;==>_Download Func _WinHttp_Download($sURL_Input, $sLocalPathSAVE, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If ($dProtocol = "ftp" Or $dProtocol = "sftp" Or $dProtocol = "ftps") Then Local $fDL = _FTP_Download($sURL_Input, $sLocalPathSAVE, $dUserName, $dPassword) Return SetError(@error, @extended, $fDL) EndIf If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf _LogDebug("+ WinHttp Download: " & $sURL_Input & " -> " & $sLocalPathSAVE & @CRLF) Local $sURL_Rediect Local $urlStatus = __URL_Check($sURL_Input, $sURL_Rediect, $dUserName, $dPassword) If @error Then _LogDebug("! /!\ Test connect Error ! " & @CRLF) Return 0 EndIf If ($sURL_Rediect == "") Then Else $sURL_Input = $sURL_Rediect EndIf Local $dlTempFilePath While 1 $dlTempFilePath = $TempDir & "\~download-" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "-" & Random(88888888, 99999999, 1) & ".tmp" If (Not FileExists($dlTempFilePath)) Then ExitLoop WEnd ; Initialize and get session handle Local $hOpen = _WinHttpOpen() ; Set User-Agent string _WinHttpSetOption($hOpen, $WINHTTP_OPTION_USER_AGENT, $sUSER_AGENT) ; Get connection handle _LogDebug("- WinHttp Connecting ...") Local $hConnect = _WinHttpConnect($hOpen, $dDomain) If @error Then _LogDebug(" ERROR " & @error & @CRLF) Return SetError(1, 0, 0) EndIf _LogDebug(" OK" & @CRLF & "- WinHttp Downloading ...") ; SimpleSSL-request it... Local $vReturned If (($dProtocol = "https") Or ($dPort = 443)) Then $vReturned = _WinHttpSimpleSSLRequest($hConnect, "GET", $dURLFilePathName, $dProtocol & "://" & $dDomain, $WINHTTP_NO_REQUEST_DATA, $WINHTTP_NO_ADDITIONAL_HEADERS, False, 2, $dUserName, $dPassword) Else $vReturned = _WinHttpSimpleRequest($hConnect, "GET", $dURLFilePathName, $dProtocol & "://" & $dDomain, $WINHTTP_NO_REQUEST_DATA, $WINHTTP_NO_ADDITIONAL_HEADERS, False, 2, $dUserName, $dPassword) EndIf If @error Then _LogDebug("! Request ERROR " & @error & @CRLF) Return SetError(2, 0, 0) EndIf _LogDebug(" OK" & @CRLF & "- Saving to file ...") ; Close handles _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) If FileExists($sLocalPathSAVE) Then _DelIt($sLocalPathSAVE, 1) Local $iDirFile = _Path_Split($sLocalPathSAVE, 6) If Not FileExists($iDirFile) Then DirCreate($iDirFile) Local $DataLen = BinaryLen($vReturned) Local $hFile = FileOpen($sLocalPathSAVE, 2 + 8 + 16) FileWrite($hFile, $vReturned) FileClose($hFile) If FileExists($sLocalPathSAVE) Then _LogDebug(" OK (Size: " & _Byte_GetDisplay($DataLen) & ") file: " & $sLocalPathSAVE & @CRLF) Return 1 Else _LogDebug(" ERROR (Size: " & _Byte_GetDisplay($DataLen) & ") file: " & $sLocalPathSAVE & @CRLF) Return SetError(1, 0, 0) EndIf EndFunc ;==>_WinHttp_Download Func _FTP_Download($sURL_Input, $sLocalPathSAVE, $dUserName = "anonymous", $dPassword = "") _LogDebug("+ FTP Download: " & $sURL_Input & " -> " & $sLocalPathSAVE & @CRLF) If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'ftp://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) #cs ConsoleWrite("- Protocol : " & $dProtocol & @CRLF) ConsoleWrite("- Domain : " & $dDomain & @CRLF) ConsoleWrite("- Port : " & $dPort & @CRLF) ConsoleWrite("- User : " & $dUser & @CRLF) ConsoleWrite("- Password : " & $dPass & @CRLF) ConsoleWrite("- FilePathName: " & $dURLFilePathName & @CRLF) ConsoleWrite("- FilePath : " & $dURLFilePath & @CRLF) ConsoleWrite("- FileName : " &$dURLFileName & @CRLF) #ce If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "")) Then $dUserName = "anonymous" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf Local $Err, $sFTP_Message, $iReturn = 0, $iError = 0 Local $dlTempFilePath = $TempDir & "\~download.tmp" While 1 $dlTempFilePath = $TempDir & "\~download-" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "-" & Random(88888888, 99999999, 1) & ".tmp" If (Not FileExists($dlTempFilePath)) Then ExitLoop WEnd If $bGetFieSize Then _LogDebug("- FTP Getting the file size... " & @CRLF) $dFileSize = _Byte_GetDisplay(__FTP_FileGetSize($sURL_Input, $dUserName, $dPassword)) EndIf ;_LogDebug("-Protocol: " & $dProtocol & @CRLF) ;_LogDebug("-Server: " & $dDomain & @CRLF) ;_LogDebug("-User: '" & $dUserName & "'" & @CRLF) ;_LogDebug("-Password: '" & $dPassword & "'" & @CRLF) ;_LogDebug("-RemoteFile: " & $dURLFilePathName & @CRLF) If $dFileSize > 0 Then _LogDebug("- File Size: " & $dFileSize & @CRLF) Else _LogDebug("! An error occurred, Getting the file size failed!" & @CRLF) EndIf _LogDebug("- FTP Getting the file ... " & @CRLF) Local $hOpen = _FTP_Open('FTP_Client', $INTERNET_OPEN_TYPE_DIRECT) If @error Then Return SetError(1, 0, 0) Local $hFTPSession = _FTP_Connect($hOpen, $dDomain, $dUserName, $dPassword) If @error Then Local $WinHTTP_Error_Return = @extended Local $WinHTTP_Error_Name = _WinHTTP_GetName_ErrorCode($WinHTTP_Error_Return) _LogDebug('! _FTP_Connect Error: ' & @error & " - Extended: " & $WinHTTP_Error_Return & @CRLF) _LogDebug('! WinHTTP Error: ' & $WinHTTP_Error_Name & @CRLF) If ($WinHTTP_Error_Return = 12029) Then _LogDebug('! Error: A connection with the server could not be established' & @CRLF) If ($WinHTTP_Error_Return = 12014) Then _LogDebug('! Error: The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect.' & @CRLF) Return SetError(2, $WinHTTP_Error_Return, 0) EndIf If $bGetFieSize Then _LogDebug("- Downloading " & $dURLFilePathName & " (" & $dFileSize & ") " & " ..." & @CRLF) Else _LogDebug("- Downloading " & $dURLFilePathName & " ...") EndIf Local $fuFunctionToCall = __FTPGetFile_UpdateProgress Local $iFDL = _FTP_ProgressDownload($hFTPSession, $dlTempFilePath, $dURLFilePathName, $fuFunctionToCall) Local $iErr, $sFTP_Message If (Not FileExists($dlTempFilePath)) Then _FTP_GetLastResponseInfo($iErr, $sFTP_Message) _LogDebug('! ERROR ! Code: [' & $Err & '] FTP_Message: [' & @CRLF & $sFTP_Message & "]" & @CRLF) _FTP_Close($hFTPSession) _FTP_Close($hOpen) $hOpen = _FTP_Open('FTP_Client', $INTERNET_OPEN_TYPE_DIRECT) $hFTPSession = _FTP_Connect($hOpen, $dDomain, $dUserName, $dPassword) If @error Then Local $WinHTTP_Error_Return = @extended Local $WinHTTP_Error_Name = _WinHTTP_GetName_ErrorCode($WinHTTP_Error_Return) _LogDebug('! _FTP_Connect Error: ' & @error & " - Extended: " & $WinHTTP_Error_Return & @CRLF) _LogDebug('! WinHTTP Error: ' & $WinHTTP_Error_Name & @CRLF) If ($WinHTTP_Error_Return = 12029) Then _LogDebug('! Error: A connection with the server could not be established' & @CRLF) If ($WinHTTP_Error_Return = 12014) Then _LogDebug('! Error: The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect.' & @CRLF) Return SetError(2, $WinHTTP_Error_Return, 0) EndIf $iFDL = _FTP_FileGet($hFTPSession, $dURLFilePathName, $dlTempFilePath, False, Default, $FTP_TRANSFER_TYPE_BINARY) If (Not FileExists($dlTempFilePath)) Then _FTP_GetLastResponseInfo($iErr, $sFTP_Message) _LogDebug('! ERROR ! Code: [' & $Err & '] FTP_Message: [' & @CRLF & $sFTP_Message & "]" & @CRLF) _FTP_Close($hFTPSession) _FTP_Close($hOpen) Return SetError(3, 0, 0) Else _LogDebug('+ OK !' & @CRLF) EndIf Else _LogDebug('+ OK !' & @CRLF) EndIf _FTP_Close($hFTPSession) _FTP_Close($hOpen) __File_SAVE($dlTempFilePath, $sLocalPathSAVE) If FileExists($sLocalPathSAVE) Then _LogDebug("+ Save file to: " & $sLocalPathSAVE & " OK !" & @CRLF) Return SetError(0, 0, 1) Else _LogDebug("! Save file to: " & $sLocalPathSAVE & " ERROR !" & @CRLF) Return SetError(4, 0, 0) EndIf EndFunc ;==>_FTP_Download Func __FTPGetFile_UpdateProgress($iPercent) _LogDebug(" " & Int($iPercent) & "%" & ' ') ;If _IsPressed("77") Then Return 0 ; Abort on F8 Return 1 ; 1 to continue Download EndFunc ;==>__FTPGetFile_UpdateProgress Func __FTP_FileGetSize($sURL_Input, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'ftp://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "")) Then $dUserName = "anonymous" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf Local $hOpen = _FTP_Open('FTP_Client') If @error Then Return SetError(1, 0, "") Local $hConn = _FTP_Connect($hOpen, $dDomain, $dUserName, $dPassword) If @error Then Local $WinHTTP_Error_Return = @extended Local $WinHTTP_Error_Name = _WinHTTP_GetName_ErrorCode($WinHTTP_Error_Return) _LogDebug('! _FTP_Connect Error: ' & @error & " - Extended: " & $WinHTTP_Error_Return & @CRLF) _LogDebug('! WinHTTP Error: ' & $WinHTTP_Error_Name & @CRLF) If ($WinHTTP_Error_Return = 12029) Then _LogDebug('! Error: A connection with the server could not be established' & @CRLF) If ($WinHTTP_Error_Return = 12014) Then _LogDebug('! Error: The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect.' & @CRLF) Return SetError(2, $WinHTTP_Error_Return, 0) EndIf Local $iFileSize = _FTP_FileGetSize($hConn, $dURLFilePathName) If @error Then Return SetError(3, 0, "") ;ConsoleWrite('$sFilenameNext1 = ' & $dFileName & ' size = ' & $iFileSize & ' -> Error code: ' & @error & ' extended: ' & @extended & @CRLF) Local $iErr, $sMessage Local $iFtpr = _FTP_GetLastResponseInfo($iErr, $sMessage) ; no error ;ConsoleWrite('$sMessage = ' & $sMessage & ' err = ' & $iErr & ' -> Error code: ' & @error & ' extended: ' & @extended & @CRLF) Local $iFtpc = _FTP_Close($hConn) Local $iFtpo = _FTP_Close($hOpen) Return $iFileSize EndFunc ;==>__FTP_FileGetSize Func __File_SAVE($dlTempFilePath, $sLocalPathSAVE) If Not FileExists($dlTempFilePath) Then _LogDebug("! Source path is not File Exists: " & $dlTempFilePath & @CRLF) Return SetError(1, 0, -1) EndIf _LogDebug("- Move (" & FileExists($dlTempFilePath) & ") " & $dlTempFilePath & " >TO> " & $sLocalPathSAVE & " > ") If FileExists($sLocalPathSAVE) Then _DelIt($sLocalPathSAVE, 1) Local $iDirFile = _Path_Split($sLocalPathSAVE, 6) If Not FileExists($iDirFile) Then DirCreate($iDirFile) If FileMove($dlTempFilePath, $sLocalPathSAVE, 1) Then _DelIt($dlTempFilePath, 1) _LogDebug(" Move OK" & @CRLF) Return 1 Else _LogDebug(" ERROR !" & @CRLF & @CRLF) _LogDebug("- Try Copy (" & FileExists($dlTempFilePath) & ") " & $dlTempFilePath & " >TO> " & $sLocalPathSAVE & " > ") If FileCopy($dlTempFilePath, $sLocalPathSAVE, 1) Then _DelIt($dlTempFilePath, 1) _LogDebug(" OK" & @CRLF) Return 1 Else _LogDebug(" ERROR !" & @CRLF & @CRLF) Return 0 EndIf EndIf EndFunc ;==>__File_SAVE Func _Encode_URL($UnicodeURL) Local $UnicodeBinary = StringToBinary($UnicodeURL, 4) Local $UnicodeBinary2 = StringReplace($UnicodeBinary, '0x', '', 1) Local $UnicodeBinaryLength = StringLen($UnicodeBinary2) Local $EncodedString, $UnicodeBinaryChar For $i = 1 To $UnicodeBinaryLength Step 2 $UnicodeBinaryChar = StringMid($UnicodeBinary2, $i, 2) If StringInStr("$-_.+!*'(),;/?:@=&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", BinaryToString('0x' & $UnicodeBinaryChar, 4)) Then $EncodedString &= BinaryToString('0x' & $UnicodeBinaryChar) Else $EncodedString &= '%' & $UnicodeBinaryChar EndIf Next Return $EncodedString EndFunc ;==>_Encode_URL Func _Decode_URL($toDecode) Local $strChar = "", $iOne, $iTwo Local $aryHex = StringSplit($toDecode, "") For $i = 1 To $aryHex[0] If $aryHex[$i] = "%" Then $i = $i + 1 $iOne = $aryHex[$i] $i = $i + 1 $iTwo = $aryHex[$i] $strChar = $strChar & Chr(Dec($iOne & $iTwo)) Else $strChar = $strChar & $aryHex[$i] EndIf Next Local $Process = StringToBinary(StringReplace($strChar, "+", " ")) Local $DecodedString = BinaryToString($Process, 4) Return $DecodedString EndFunc ;==>_Decode_URL Func __URL_Status($sURL_Input, ByRef $sURL_Rediect, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf If (Not ($dUserName == '')) Then If ($dProtocol == 'https' And $dPort <> 443) Or ($dProtocol == 'http' And $dPort <> 80) Then $sURL_Input = $dProtocol & "://" & $dDomain & ":" & $dPort & $dURLFilePathName Else $sURL_Input = $dProtocol & "://" & $dDomain & $dURLFilePathName EndIf EndIf $oHTTP.Option($OPTION_USER_AGENT) = $sUSER_AGENT $oHTTP.Option($OPTION_ENABLE_REDIRECTS) = False $oHTTP.Open("HEAD", $sURL_Input, False) If @error Then Return SetError(1, @error, -1) If (StringLen(StringStripWS($dUserName, 8)) > 1) Then $oHTTP.SetCredentials($dUserName, $dPassword, 0) $oHTTP.Send() If @error Then Return SetError(2, @error, 105) ;Error 105 (net::ERR_NAME_NOT_RESOLVED) Local $oStatus = $oHTTP.Status If @error Then Return SetError(3, @error, 118) ;Error 118 (net::ERR_CONNECTION_TIMED_OUT) If (($oStatus = 301) Or ($oStatus = 302)) Then $sURL_Rediect = $oHTTP.GetResponseHeader("Location") _LogDebug("! Redirect to URL: " & $sURL_Rediect & @CRLF) EndIf ;_LogDebug("+ GetResponseHeader: " & $oStatus & @CRLF) ;_LogDebug("- Cache-Control: " & $oHTTP.GetResponseHeader("Cache-Control") & @CRLF) ;_LogDebug("- Connection: " & $oHTTP.GetResponseHeader("Connection") & @CRLF) ;_LogDebug("- Date: " & $oHTTP.GetResponseHeader("Date") & @CRLF) ;_LogDebug("- Keep-Alive: " & $oHTTP.GetResponseHeader("Keep-Alive") & @CRLF) _LogDebug("- Content-Length: " & _Byte_GetDisplay($oHTTP.GetResponseHeader("Content-Length")) & @CRLF) ;_LogDebug("- Content-Type: " & $oHTTP.GetResponseHeader("Content-Type") & @CRLF) ;_LogDebug("- Expires: " & $oHTTP.GetResponseHeader("Expires") & @CRLF) ;_LogDebug("- Last-Modified: " & $oHTTP.GetResponseHeader("Last-Modified") & @CRLF) ;_LogDebug("- Accept-Ranges: " & $oHTTP.GetResponseHeader("Accept-Ranges") & @CRLF) ;_LogDebug("- Server: " & $oHTTP.GetResponseHeader("Server") & @CRLF) ;_LogDebug("- WWW-Authenticate: " & $oHTTP.GetResponseHeader("WWW-Authenticate") & @CRLF) ;_LogDebug($oHTTP.getAllResponseHeaders() & @CRLF) $oHTTP.Option($OPTION_ENABLE_REDIRECTS) = True Return SetError(0, 0, $oStatus) EndFunc ;==>__URL_Status Func _Check_Connect($iDomain, $iPort = 80) Opt("TCPTimeout", 3000) TCPStartup() _LogDebug("- Checking Domain: " & $iDomain & " | Port: " & $iPort & " ") Local $sIPAddress = TCPNameToIP($iDomain) _LogDebug(" -> IP Address: " & $sIPAddress) Local $iSocket = TCPConnect($sIPAddress, $iPort) If $iSocket < 1 Then _LogDebug(" -> ERROR !" & @CRLF) Return SetError(1, 0, 0) Else _LogDebug(" -> SK:" & $iSocket & " OK !" & @CRLF) Return SetError(0, 0, 1) EndIf TCPShutdown() Opt("TCPTimeout", 250) EndFunc ;==>_Check_Connect Func __URL_Check($sURL_Input, ByRef $sURL_Rediect, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) #cs ConsoleWrite("- Protocol : " & $dProtocol & @CRLF) ConsoleWrite("- Domain : " & $dDomain & @CRLF) ConsoleWrite("- Port : " & $dPort & @CRLF) ConsoleWrite("- User : " & $dUser & @CRLF) ConsoleWrite("- Password : " & $dPass & @CRLF) ConsoleWrite("- FilePathName: " & $dURLFilePathName & @CRLF) ConsoleWrite("- FilePath : " & $dURLFilePath & @CRLF) ConsoleWrite("- FileName : " &$dURLFileName & @CRLF) #ce If $dPort > 0 Then If _Check_Connect($dDomain, $dPort) = 0 Then Return SetError(1, 0, 0) Else Switch $dProtocol Case "http" If (_Check_Connect($dDomain, 80) = 0) Then Return SetError(1, 0, 0) Case "https" If (_Check_Connect($dDomain, 443) = 0) Then Return SetError(1, 0, 0) Case "ftp", "ftps" If (_Check_Connect($dDomain, 21) = 0) Then Return SetError(1, 0, 0) Case "sftp" If (_Check_Connect($dDomain, 22) = 0) Then Return SetError(1, 0, 0) EndSwitch EndIf Local $urlStatus = __URL_Status($sURL_Input, $sURL_Rediect, $dUserName, $dPassword) Switch $urlStatus Case 301, 302 If ($sURL_Rediect == "") Then Else $sURL_Input = $sURL_Rediect EndIf _LogDebug("- URL Status: " & $urlStatus & " > Connection Successful! (URL redirect to: " & $sURL_Input & ")" & @CRLF) Return SetError(0, 0, __URL_Check($sURL_Input, $sURL_Rediect, $dUserName, $dPassword)) Case 200 _LogDebug("- URL Status: " & $urlStatus & " > Connection Successful! (URL: " & $sURL_Input & ")" & @CRLF) Return SetError(0, 0, $urlStatus) Case 401, 407 _LogDebug("- URL Status: " & $urlStatus & " > Connection error! > Unauthorized (URL: " & $sURL_Input & ")" & @CRLF) Case 404 _LogDebug("- URL Status: " & $urlStatus & " > Connection Successful! > URL Not Found: " & $sURL_Input & @CRLF) Case 105 _LogDebug("- URL Status: " & $urlStatus & " > Connection error: ERR_NAME_NOT_RESOLVED > URL is Not Found: " & $sURL_Input & @CRLF) Case Else _LogDebug("- URL Status: " & $urlStatus & " > Connection error! > URL: " & $sURL_Input & @CRLF) EndSwitch Return SetError(1, 0, $urlStatus) EndFunc ;==>__URL_Check Func _Byte_GetDisplay($iSize, $iPlaces = 4) Local $aBytes[7] = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB'] For $i = 6 To 1 Step -1 If $iSize >= 1024 ^ $i Then Return Round($iSize / 1024 ^ $i, $iPlaces) & $aBytes[$i] EndIf Next Return $iSize & ' Bytes' EndFunc ;==>_Byte_GetDisplay Func _Convert_Size($inputSize, $inputUnit = 0, $outputPlaces = 2, $outputString = True, $inputBits = False, $outputBits = False, $outputUnit = -4) Local $unitNames[9] = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"] Local $Bytes = $inputSize * 1024 ^ $inputUnit Local $b = "B" If $inputBits Then $Bytes /= 8 If $outputBits Then $Bytes *= 8 $b = "b" EndIf If $outputUnit < 0 Then Local $outputMax = Abs($outputUnit) $outputUnit = Int(Log($Bytes) / Log(1024)) If $outputUnit > $outputMax Then $outputUnit = $outputMax EndIf If $outputString Then Return String(Round($Bytes / 1024 ^ $outputUnit, $outputPlaces)) & " " & $unitNames[$outputUnit] & $b Else Return Round($Bytes / 1024 ^ $outputUnit, $outputPlaces) EndIf EndFunc ;==>_Convert_Size Func _Path_Split($sFilePath, $sType = 0) Local $sDrive, $sDir, $sFileName, $sExtension, $sReturn Local $aArray = StringRegExp($sFilePath, "^\h*((?:\\\\\?\\)*(\\\\[^\?\/\\]+|[A-Za-z]:)?(.*[\/\\]\h*)?((?:[^\.\/\\]|(?(?=\.[^\/\\]*\.)\.))*)?([^\/\\]*))$", 1) If @error Then ReDim $aArray[5] $aArray[0] = $sFilePath EndIf $sDrive = $aArray[1] If StringLeft($aArray[2], 1) == "/" Then $sDir = StringRegExpReplace($aArray[2], "\h*[\/\\]+\h*", "\/") Else $sDir = StringRegExpReplace($aArray[2], "\h*[\/\\]+\h*", "\\") EndIf $aArray[2] = $sDir $sFileName = $aArray[3] $sExtension = $aArray[4] If $sType = 1 Then Return $sDrive If $sType = 2 Then Return $sDir If $sType = 3 Then Return $sFileName If $sType = 4 Then Return $sExtension If $sType = 5 Then Return $sFileName & $sExtension If $sType = 6 Then Return $sDrive & $sDir If $sType = 7 Then Return $sDrive & $sDir & $sFileName Return $aArray EndFunc ;==>_Path_Split Func _IsFile($sPath) If (Not FileExists($sPath)) Then Return SetError(-1, 0, 0) If StringInStr(FileGetAttrib($sPath), 'D') <> 0 Then Return SetError(0, 0, 0) Else Return SetError(0, 0, 1) EndIf EndFunc ;==>_IsFile Func _DelIt($sPath, $Fc = 1) If (Not FileExists($sPath)) Then Return SetError(-1, 0, 1) If _IsFile($sPath) Then Return SetError(0, 0, _DelFile($sPath, $Fc)) Else Return SetError(0, 0, _RemoveDir($sPath, $Fc)) EndIf EndFunc ;==>_DelIt Func _DelFile($sPath, $Fc = 1) If (Not _IsFile($sPath)) Then Return SetError(-1, 0, 0) Else FileSetAttrib($sPath, "-RSH") FileDelete($sPath) If $Fc Then If FileExists($sPath) Then _TakeOwnership($sPath, "Everyone", $Fc) If FileExists($sPath) Then FileDelete($sPath) If FileExists($sPath) Then RunWait(@ComSpec & ' /c Del /f /q "' & $sPath & '"', '', @SW_HIDE) EndIf If FileExists($sPath) Then Return SetError(1, 0, 0) Return SetError(0, 0, 1) EndIf EndFunc ;==>_DelFile Func _RemoveDir($sPath, $Fc = 1) If _IsFile($sPath) Then Return SetError(-1, 0, 0) Else DirRemove($sPath, $Fc) If FileExists($sPath) Then _TakeOwnership($sPath, "Everyone", $Fc) DirRemove($sPath, $Fc) If FileExists($sPath) Then RunWait(@ComSpec & ' /c rmdir "' & $sPath & '" /s /q ', '', @SW_HIDE) If FileExists($sPath) Then Return SetError(1, 0, 0) Return SetError(0, 0, 1) EndIf EndFunc ;==>_RemoveDir Func _GetDomainURL($sURL_Input) Local $sURL_Pattern = "^(?i)(?:(?:[a-z]+):\/\/)?" & _ ; Protocol "(?:(?:(?:[^@:]+))" & _ ; Username "(?::(?:[^@]+))?@)?" & _ ; Password "([^\/:]+)" & _ ; Host "(?::(?:\d+))?" & _ ; Port "(?:\/(?:[^?]+)?)?" & _ ; Path "(?:\?\N+)?" ; Query Local $aHost = StringRegExp($sURL_Input, $sURL_Pattern, 1) If IsArray($aHost) Then Return $aHost[0] Return "" EndFunc ;==>_GetDomainURL Func _LogDebug($iLog = "", $iLogs = "", $itype = -1) If (($itype = 0) And ($iLog = "") And ($iLogs = "")) Then Return 0 If (($itype = -1) And $ViewLogConsole) Then Return ConsoleWrite($iLog) If ($iLogs = "") Then $iLogs = $iLog If ($itype = 0) Then If $ViewLogConsole Then ConsoleWrite("- " & $iLog & @CRLF) ;If $sTextColor <> $lBkColor Then ;$sTextColor = $lBkColor ;GUICtrlSetColor($labStatus, $sTextColor) ;EndIf ;GUICtrlSetData($labStatus, $iLogs) Else If $ViewLogConsole Then ConsoleWrite("! " & $iLog & @CRLF) ;If $sTextColor <> $sTextColorError Then ;$sTextColor = $sTextColorError ;GUICtrlSetColor($labStatus, $sTextColor) ;EndIf ;GUICtrlSetData($labStatus, $iLogs) EndIf Return 1 EndFunc ;==>_LogDebug Func __Skip_OBJ_Error() $obError = True ;ConsoleWrite("! " & $obError.description & @CRLF) EndFunc ;==>__Skip_OBJ_Error Func _WinHttpURL_GetStatus($sURL_Input, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf ; Initialize and get session handle Global $hOpen = _WinHttpOpen() ; Get connection handle Global $hConnect = _WinHttpConnect($hOpen, $dDomain) ; Specify the reguest Global $hRequest = _WinHttpOpenRequest($hConnect, "HEAD", $dURLFilePathName, Default, $dProtocol & "://" & $dDomain) ; Set credentials If (StringLen(StringStripWS($dUserName, 8)) > 1) Then _WinHttpSetCredentials($hRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, $dUserName, $dPassword) ; Send request _WinHttpSendRequest($hRequest) ; Wait for the response _WinHttpReceiveResponse($hRequest) ; Get full header Global $sHeader = _WinHttpQueryHeaders($hRequest) ConsoleWrite($sHeader & @CRLF) ; Close handles _WinHttpCloseHandle($hRequest) _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) EndFunc ;==>_WinHttpURL_GetStatus Func _Directory_Is_Accessible($sPath, $iTouch = 0) If Not FileExists($sPath) Then DirCreate($sPath) If Not StringInStr(FileGetAttrib($sPath), "D", 2) Then Return SetError(1, 0, 0) Local $iEnum = 0, $maxEnum = 9999, $iRandom = Random(88888888, 99999999, 1) If $iTouch Then _TakeOwnership($sPath, "Everyone", 1) While FileExists($sPath & "\_IsWritable-" & $iEnum & "-" & $iRandom) $iEnum += 1 If ($iEnum > $maxEnum) Then Return SetError(2, 0, 0) WEnd Local $iSuccess = DirCreate($sPath & "\_IsWritable-" & $iEnum & "-" & $iRandom) Switch $iSuccess Case 1 $iTouch = DirRemove($sPath & "\_IsWritable-" & $iEnum & "-" & $iRandom, 1) Return SetError($iTouch < 1, 0, $iTouch) Case Else Return SetError(3, 0, 0) EndSwitch EndFunc ;==>_Directory_Is_Accessible Func _File_Is_Accessible($sFile, $iTouch = 0) ; Returns ; 1 = Success, file is writeable and deletable ; 2 = Access Denied because of lacking access rights OR because file is open by another process ; 3 = File is set "Read Only" by attribute ; 0 = File not found or Is Directory If ((Not FileExists("\\?\" & $sFile)) Or StringInStr(FileGetAttrib("\\?\" & $sFile), "D", 2)) Then Return SetError(1, 0, 0) Local $oFileAttrib = FileGetAttrib("\\?\" & $sFile) If $iTouch Then FileSetAttrib("\\?\" & $sFile, "-RHS") _TakeOwnership($sFile, "Everyone", 1) EndIf If StringInStr(FileGetAttrib("\\?\" & $sFile), "R", 2) Then Return 3 ; Read-Only Flag set Local $hFile = _WinAPI_CreateFileEx("\\?\" & $sFile, $OPEN_EXISTING, $GENERIC_READ + $GENERIC_WRITE, $FILE_SHARE_READ + $FILE_SHARE_WRITE + $FILE_SHARE_DELETE, $FILE_FLAG_BACKUP_SEMANTICS) ; Local $iReturn = $hFile _WinAPI_CloseHandle($hFile) If ($iReturn = 0) Then Return 2 ; File not accessible, UAC issue? Return 1 ; Success EndFunc ;==>_File_Is_Accessible Func _TakeOwnership($sFile, $iUserName = "Everyone", $sRecurse = 1) If ($iUserName = Default) Or (StringStripWS($iUserName, 8) = '') Then $iUserName = "Everyone" If ($sRecurse = Default) Or ($sRecurse = True) Or ($sRecurse > 0) Then $sRecurse = 1 Else $sRecurse = 0 EndIf Local $osNotIsEnglish = True Switch @OSLang Case "0009", "0409", "0809", "0C09", "1009", "1409", "1809", "1C09", "2009", "2409", "2809", "2C09", "3009", "3409", "3C09", "4009", "4409", "4809", "4C09" $osNotIsEnglish = False Case "3809", "5009", "5409", "5809", "5C09", "6009", "6409" ; new $osNotIsEnglish = False EndSwitch If StringInStr($iUserName, ' ') Then $iUserName = '"' & $iUserName & '"' If ($sRecurse = Default) Then $sRecurse = 1 If Not FileExists($sFile) Then Return SetError(1, 0, $sFile) If StringInStr(FileGetAttrib($sFile), 'D') <> 0 Then If $sRecurse Then RunWait(@ComSpec & ' /c takeown /f "' & $sFile & '" /R /D Y', '', @SW_HIDE) If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /T /C /G Administrators:F', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /T /C /G Users:F', '', @SW_HIDE) RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /T /C /G ' & $iUserName & ':F', '', @SW_HIDE) If $osNotIsEnglish Then If ($iUserName = "Everyone") Then $iUserName = '*S-1-1-0' If ($iUserName = '"' & 'Authenticated Users' & '"') Then $iUserName = '*S-1-5-11' EndIf If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Administrators:F /T /C /Q', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Users:F /T /C /Q', '', @SW_HIDE) RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant ' & $iUserName & ':F /T /C /Q', '', @SW_HIDE) Return SetError(0, 0, FileSetAttrib($sFile, "-RHS", 1)) Else RunWait(@ComSpec & ' /c takeown /f "' & $sFile & '" ', '', @SW_HIDE) If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Administrators:F', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Users:F', '', @SW_HIDE) RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G ' & $iUserName & ':F', '', @SW_HIDE) If $osNotIsEnglish Then If ($iUserName = "Everyone") Then $iUserName = '*S-1-1-0' If ($iUserName = '"' & 'Authenticated Users' & '"') Then $iUserName = '*S-1-5-11' EndIf If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Administrators:F /C /Q', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Users:F /C /Q', '', @SW_HIDE) RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant ' & $iUserName & ':F /C /Q', '', @SW_HIDE) Return SetError(0, 0, FileSetAttrib($sFile, "-RHS", 0)) EndIf Else RunWait(@ComSpec & ' /c takeown /f "' & $sFile & '"', '', @SW_HIDE) If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Administrators:F', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Users:F', '', @SW_HIDE) RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G ' & $iUserName & ':F', '', @SW_HIDE) If $osNotIsEnglish Then If ($iUserName = "Everyone") Then $iUserName = '*S-1-1-0' If ($iUserName = '"' & 'Authenticated Users' & '"') Then $iUserName = '*S-1-5-11' EndIf If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Administrators:F /Q', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Users:F /Q', '', @SW_HIDE) RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant ' & $iUserName & ':F /Q', '', @SW_HIDE) Return SetError(0, 0, FileSetAttrib($sFile, "-RHS")) EndIf Return $sFile EndFunc ;==>_TakeOwnership Func _URL_Split($sURL_Input, ByRef $sURL_Protocol, ByRef $sURL_Domain, ByRef $sURL_FilePATH, ByRef $sURL_FileName) Local $sURL_Protocol_Number_Pattern = '^(?s)(?i)(http|ftp|sftp|ftps|https|file)://(.*?/|.*$)(.*/){0,}(.*)$' Local $sURL_Pattern = "^(?i)(?:(?:[a-z]+):\/\/)?" & "(?:(?:(?:[^@:]+))" & "(?::(?:[^@]+))?@)?" & "([^\/:]+)" & "(?::(?:\d+))?" & "(?:\/(?:[^?]+)?)?" & "(?:\?\N+)?" Local $aURL_Pattern = StringRegExp($sURL_Input, $sURL_Protocol_Number_Pattern, 2) If Not IsArray($aURL_Pattern) Or UBound($aURL_Pattern) - 1 <> 4 Then Return SetError(1, 0, 0) If StringRight($aURL_Pattern[2], 1) = '/' Then $aURL_Pattern[2] = StringTrimRight($aURL_Pattern[2], 1) $aURL_Pattern[3] = '/' & $aURL_Pattern[3] EndIf $sURL_Protocol = $aURL_Pattern[1] Local $aHost = StringRegExp($sURL_Input, $sURL_Pattern, 1) If Not @error And IsArray($aHost) Then $sURL_Domain = $aHost[0] Else $sURL_Domain = $aURL_Pattern[2] EndIf $sURL_FilePATH = $aURL_Pattern[3] $sURL_FileName = $aURL_Pattern[4] Return $aURL_Pattern EndFunc ;==>_URL_Split #cs Local $sURL_Protocol, $sURL_Protocol_Number, $sURL_Domain, $sURL_Port, $sURL_User, $sURL_Password, $sURL_FilePathName, $sURL_FilePATH, $sURL_FileName _WinHttp_SplitURL($sURL_Input, $sURL_Protocol, $sURL_Domain, $sURL_Port, $sURL_User, $sURL_Password, $sURL_FilePathName, $sURL_FilePATH, $sURL_FileName) ConsoleWrite("! URL_Input : " & $sURL_Input & @CRLF) ConsoleWrite("- Protocol : " & $sURL_Protocol & @CRLF) ConsoleWrite("- Domain : " & $sURL_Domain & @CRLF) ConsoleWrite("- Port : " & $sURL_Port & @CRLF) ConsoleWrite("- User : " & $sURL_User & @CRLF) ConsoleWrite("- Password : " & $sURL_Password & @CRLF) ConsoleWrite("- FilePathName: " & $sURL_FilePathName & @CRLF) ConsoleWrite("- FilePath : " & $sURL_FilePath & @CRLF) ConsoleWrite("- FileName : " & $sURL_FileName & @CRLF) #ce Func _WinHttp_SplitURL($sURL_Input, ByRef $sURL_Protocol, ByRef $sURL_Domain, ByRef $sURL_Port, ByRef $sURL_User, ByRef $sURL_Password, ByRef $sURL_FilePathName, ByRef $sURL_FilePATH, ByRef $sURL_FileName) If StringStripWS($sURL_Input, 8) = '' Then Return SetError(1, 0, 0) $sURL_Input = StringReplace($sURL_Input, "\", "/") If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input _URL_Split($sURL_Input, $sURL_Protocol, $sURL_Domain, $sURL_FilePATH, $sURL_FileName) StringReplace($sURL_Input, '@', '') If @extended > 1 Then Local $sUser, $aUser = _StringBetween($sURL_Input, $sURL_Protocol & "://", '@') If IsArray($aUser) Then $sUser = $aUser[0] $sURL_Input = StringReplace($sURL_Input, $sURL_Protocol & "://" & $sUser & '@', $sURL_Protocol & "://" & $sUser & '%40') EndIf EndIf Local $ORG_URL_Protocol = $sURL_Protocol, $sFake_Protocol = 'http', $iFake_Protocol = False Switch $sURL_Protocol Case 'http', 'https', 'ftp' Case Else $iFake_Protocol = True $sURL_Input = StringReplace($sURL_Input, $sURL_Protocol & "://", $sFake_Protocol & "://") EndSwitch Local $aUrl = _WinHttpCrackUrl($sURL_Input) If IsArray($aUrl) Then If $iFake_Protocol Then $sURL_Protocol = $ORG_URL_Protocol Else $sURL_Protocol = ($aUrl[0] == '' ? $sURL_Protocol : $aUrl[0]) EndIf ;$sURL_Protocol_Number = $aUrl[1] $sURL_Domain = ($aUrl[2] == '' ? $sURL_Domain : $aUrl[2]) $sURL_Port = $aUrl[3] $sURL_User = StringReplace($aUrl[4], '%40', '@') $sURL_Password = $aUrl[5] $sURL_FilePathName = ($aUrl[6] == '' ? $sURL_FilePATH & $sURL_FileName : $aUrl[6]) ;$sURL_ExtraInfo = $aUrl[7] Return $aUrl EndIf Return SetError(1, 0, "") EndFunc ;==>_WinHttp_SplitURL Func _WinHTTP_GetName_ErrorCode($nErrorCode = 0) ; By Dao Van Trong - TRONG.LIVE Switch $nErrorCode Case 12001 Return "ERROR_WINHTTP_OUT_OF_HANDLES" Case 12002 Return "ERROR_WINHTTP_TIMEOUT" Case 12004 Return "ERROR_WINHTTP_INTERNAL_ERROR" Case 12005 Return "ERROR_WINHTTP_INVALID_URL" Case 12006 Return "ERROR_WINHTTP_UNRECOGNIZED_SCHEME" Case 12007 Return "ERROR_WINHTTP_NAME_NOT_RESOLVED" Case 12009 Return "ERROR_WINHTTP_INVALID_OPTION" Case 12011 Return "ERROR_WINHTTP_OPTION_NOT_SETTABLE" Case 12012 Return "ERROR_WINHTTP_SHUTDOWN" Case 12015 Return "ERROR_WINHTTP_LOGIN_FAILURE" Case 12017 Return "ERROR_WINHTTP_OPERATION_CANCELLED" Case 12018 Return "ERROR_WINHTTP_INCORRECT_HANDLE_TYPE" Case 12019 Return "ERROR_WINHTTP_INCORRECT_HANDLE_STATE" Case 12029 Return "ERROR_WINHTTP_CANNOT_CONNECT" Case 12030 Return "ERROR_WINHTTP_CONNECTION_ERROR" Case 12032 Return "ERROR_WINHTTP_RESEND_REQUEST" Case 12044 Return "ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED" Case 12150 Return "ERROR_WINHTTP_HEADER_NOT_FOUND" Case 12152 Return "ERROR_WINHTTP_INVALID_SERVER_RESPONSE" Case 12153 Return "ERROR_WINHTTP_INVALID_HEADER" Case 12154 Return "ERROR_WINHTTP_INVALID_QUERY_REQUEST" Case 12155 Return "ERROR_WINHTTP_HEADER_ALREADY_EXISTS" Case 12156 Return "ERROR_WINHTTP_REDIRECT_FAILED" Case 12178 Return "ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR" Case 12166 Return "ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT" Case 12167 Return "ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT" Case 12176 Return "ERROR_WINHTTP_UNHANDLED_SCRIPT_TYPE" Case 12177 Return "ERROR_WINHTTP_SCRIPT_EXECUTION_ERROR" Case 12172 Return "ERROR_WINHTTP_NOT_INITIALIZED" Case 12175 Return "ERROR_WINHTTP_SECURE_FAILURE" Case 12037 Return "ERROR_WINHTTP_SECURE_CERT_DATE_INVALID" Case 12038 Return "ERROR_WINHTTP_SECURE_CERT_CN_INVALID" Case 12045 Return "ERROR_WINHTTP_SECURE_INVALID_CA" Case 12057 Return "ERROR_WINHTTP_SECURE_CERT_REV_FAILED" Case 12157 Return "ERROR_WINHTTP_SECURE_CHANNEL_ERROR" Case 12169 Return "ERROR_WINHTTP_SECURE_INVALID_CERT" Case 12170 Return "ERROR_WINHTTP_SECURE_CERT_REVOKED" Case 12179 Return "ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE" Case 12180 Return "ERROR_WINHTTP_AUTODETECTION_FAILED" Case 12181 Return "ERROR_WINHTTP_HEADER_COUNT_EXCEEDED" Case 12182 Return "ERROR_WINHTTP_HEADER_SIZE_OVERFLOW" Case 12183 Return "ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW" Case 12184 Return "ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW" Case 12185 Return "ERROR_WINHTTP_CLIENT_CERT_NO_PRIVATE_KEY" Case 12186 Return "ERROR_WINHTTP_CLIENT_CERT_NO_ACCESS_PRIVATE_KEY" Case 12187 Return "ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED_PROXY" Case 12188 Return "ERROR_WINHTTP_SECURE_FAILURE_PROXY" Case 12189 Return "ERROR_WINHTTP_RESERVED_189" Case 12190 Return "ERROR_WINHTTP_HTTP_PROTOCOL_MISMATCH" Case 12191 Return "ERROR_WINHTTP_GLOBAL_CALLBACK_FAILED" Case 12192 Return "ERROR_WINHTTP_FEATURE_DISABLED" Return "WINHTTP_ERROR_LAST" Case Else Return SetError(1, 0, "") EndSwitch EndFunc ;==>_WinHTTP_GetName_ErrorCode Func _WinInet_GetName_ErrorCode($nErrorCode = 0) ; By Dao Van Trong - TRONG.LIVE Switch $nErrorCode Case 12000 Return "INTERNET_ERROR_BASE" Case 12001 Return "ERROR_INTERNET_OUT_OF_HANDLES" Case 12002 Return "ERROR_INTERNET_TIMEOUT" Case 12003 Return "ERROR_INTERNET_EXTENDED_ERROR" Case 12004 Return "ERROR_INTERNET_INTERNAL_ERROR" Case 12005 Return "ERROR_INTERNET_INVALID_URL" Case 12006 Return "ERROR_INTERNET_UNRECOGNIZED_SCHEME" Case 12007 Return "ERROR_INTERNET_NAME_NOT_RESOLVED" Case 12008 Return "ERROR_INTERNET_PROTOCOL_NOT_FOUND" Case 12009 Return "ERROR_INTERNET_INVALID_OPTION" Case 12010 Return "ERROR_INTERNET_BAD_OPTION_LENGTH" Case 12011 Return "ERROR_INTERNET_OPTION_NOT_SETTABLE" Case 12012 Return "ERROR_INTERNET_SHUTDOWN" Case 12013 Return "ERROR_INTERNET_INCORRECT_USER_NAME" Case 12014 Return "ERROR_INTERNET_INCORRECT_PASSWORD" Case 12015 Return "ERROR_INTERNET_LOGIN_FAILURE" Case 12016 Return "ERROR_INTERNET_INVALID_OPERATION" Case 12017 Return "ERROR_INTERNET_OPERATION_CANCELLED" Case 12018 Return "ERROR_INTERNET_INCORRECT_HANDLE_TYPE" Case 12019 Return "ERROR_INTERNET_INCORRECT_HANDLE_STATE" Case 12020 Return "ERROR_INTERNET_NOT_PROXY_REQUEST" Case 12021 Return "ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND" Case 12022 Return "ERROR_INTERNET_BAD_REGISTRY_PARAMETER" Case 12023 Return "ERROR_INTERNET_NO_DIRECT_ACCESS" Case 12024 Return "ERROR_INTERNET_NO_CONTEXT" Case 12025 Return "ERROR_INTERNET_NO_CALLBACK" Case 12026 Return "ERROR_INTERNET_REQUEST_PENDING" Case 12027 Return "ERROR_INTERNET_INCORRECT_FORMAT" Case 12028 Return "ERROR_INTERNET_ITEM_NOT_FOUND" Case 12029 Return "ERROR_INTERNET_CANNOT_CONNECT" Case 12030 Return "ERROR_INTERNET_CONNECTION_ABORTED" Case 12031 Return "ERROR_INTERNET_CONNECTION_RESET" Case 12032 Return "ERROR_INTERNET_FORCE_RETRY" Case 12033 Return "ERROR_INTERNET_INVALID_PROXY_REQUEST" Case 12034 Return "ERROR_INTERNET_NEED_UI" Case 12036 Return "ERROR_INTERNET_HANDLE_EXISTS" Case 12037 Return "ERROR_INTERNET_SEC_CERT_DATE_INVALID" Case 12038 Return "ERROR_INTERNET_SEC_CERT_CN_INVALID" Case 12039 Return "ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR" Case 12040 Return "ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR" Case 12041 Return "ERROR_INTERNET_MIXED_SECURITY" Case 12042 Return "ERROR_INTERNET_CHG_POST_IS_NON_SECURE" Case 12043 Return "ERROR_INTERNET_POST_IS_NON_SECURE" Case 12044 Return "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED" Case 12045 Return "ERROR_INTERNET_INVALID_CA" Case 12046 Return "ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP" Case 12047 Return "ERROR_INTERNET_ASYNC_THREAD_FAILED" Case 12048 Return "ERROR_INTERNET_REDIRECT_SCHEME_CHANGE" Case 12049 Return "ERROR_INTERNET_DIALOG_PENDING" Case 12050 Return "ERROR_INTERNET_RETRY_DIALOG" Case 12052 Return "ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR" Case 12053 Return "ERROR_INTERNET_INSERT_CDROM" Case 12054 Return "ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED" Case 12055 Return "ERROR_INTERNET_SEC_CERT_ERRORS" Case 12056 Return "ERROR_INTERNET_SEC_CERT_NO_REV" Case 12057 Return "ERROR_INTERNET_SEC_CERT_REV_FAILED" Case 12060 Return "ERROR_HTTP_HSTS_REDIRECT_REQUIRED" Case 12062 Return "ERROR_INTERNET_SEC_CERT_WEAK_SIGNATURE" Case 12110 Return "ERROR_FTP_TRANSFER_IN_PROGRESS" Case 12111 Return "ERROR_FTP_DROPPED" Case 12112 Return "ERROR_FTP_NO_PASSIVE_MODE" Case 12130 Return "ERROR_GOPHER_PROTOCOL_ERROR" Case 12131 Return "ERROR_GOPHER_NOT_FILE" Case 12132 Return "ERROR_GOPHER_DATA_ERROR" Case 12133 Return "ERROR_GOPHER_END_OF_DATA" Case 12134 Return "ERROR_GOPHER_INVALID_LOCATOR" Case 12135 Return "ERROR_GOPHER_INCORRECT_LOCATOR_TYPE" Case 12136 Return "ERROR_GOPHER_NOT_GOPHER_PLUS" Case 12137 Return "ERROR_GOPHER_ATTRIBUTE_NOT_FOUND" Case 12138 Return "ERROR_GOPHER_UNKNOWN_LOCATOR" Case 12150 Return "ERROR_HTTP_HEADER_NOT_FOUND" Case 12151 Return "ERROR_HTTP_DOWNLEVEL_SERVER" Case 12152 Return "ERROR_HTTP_INVALID_SERVER_RESPONSE" Case 12153 Return "ERROR_HTTP_INVALID_HEADER" Case 12154 Return "ERROR_HTTP_INVALID_QUERY_REQUEST" Case 12155 Return "ERROR_HTTP_HEADER_ALREADY_EXISTS" Case 12156 Return "ERROR_HTTP_REDIRECT_FAILED" Case 12160 Return "ERROR_HTTP_NOT_REDIRECTED" Case 12161 Return "ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION" Case 12162 Return "ERROR_HTTP_COOKIE_DECLINED" Case 12168 Return "ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION" Case 12157 Return "ERROR_INTERNET_SECURITY_CHANNEL_ERROR" Case 12158 Return "ERROR_INTERNET_UNABLE_TO_CACHE_FILE" Case 12159 Return "ERROR_INTERNET_TCPIP_NOT_INSTALLED" Case 12163 Return "ERROR_INTERNET_DISCONNECTED" Return "ERROR_INTERNET_OFFLINE" Case 12164 Return "ERROR_INTERNET_SERVER_UNREACHABLE" Case 12165 Return "ERROR_INTERNET_PROXY_SERVER_UNREACHABLE" Case 12166 Return "ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT" Case 12167 Return "ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT" Case 12169 Return "ERROR_INTERNET_SEC_INVALID_CERT" Case 12170 Return "ERROR_INTERNET_SEC_CERT_REVOKED" Case 12171 Return "ERROR_INTERNET_FAILED_DUETOSECURITYCHECK" Case 12172 Return "ERROR_INTERNET_NOT_INITIALIZED" Case 12173 Return "ERROR_INTERNET_NEED_MSN_SSPI_PKG" Case 12174 Return "ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY" Case 12175 Return "ERROR_INTERNET_DECODING_FAILED" Case 12187 Return "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED_PROXY" Case 12188 Return "ERROR_INTERNET_SECURE_FAILURE_PROXY" Case 12190 Return "ERROR_INTERNET_HTTP_PROTOCOL_MISMATCH" Case 12191 Return "ERROR_INTERNET_GLOBAL_CALLBACK_FAILED" Case 12192 Return "ERROR_INTERNET_FEATURE_DISABLED" Return "INTERNET_ERROR_LAST" Case 12051 Return "ERROR_INTERNET_NO_NEW_CONTAINERS" Case 12058 Return "ERROR_INTERNET_SOURCE_PORT_IN_USE" Case 12059 Return "ERROR_INTERNET_INSECURE_FALLBACK_REQUIRED" Case 12061 Return "ERROR_INTERNET_PROXY_ALERT" Case 12080 Return "ERROR_INTERNET_NO_CM_CONNECTION" Case 12147 Return "ERROR_HTTP_PUSH_STATUS_CODE_NOT_SUPPORTED" Case 12148 Return "ERROR_HTTP_PUSH_RETRY_NOT_SUPPORTED" Case 12149 Return "ERROR_HTTP_PUSH_ENABLE_FAILED" Case 12189 Return "ERROR_INTERNET_DISALLOW_INPRIVATE" Case 12900 Return "INTERNET_INTERNAL_ERROR_BASE" Case 12901 Return "ERROR_INTERNET_INTERNAL_SOCKET_ERROR" Case 12902 Return "ERROR_INTERNET_CONNECTION_AVAILABLE" Case 12903 Return "ERROR_INTERNET_NO_KNOWN_SERVERS" Case 12904 Return "ERROR_INTERNET_PING_FAILED" Case 12905 Return "ERROR_INTERNET_NO_PING_SUPPORT" Case 12906 Return "ERROR_INTERNET_CACHE_SUCCESS" Case 12907 Return "ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION_EX" Case Else Return SetError(1, 0, "") EndSwitch EndFunc ;==>_WinInet_GetName_ErrorCode If you do not have a WinHTTP UDF ("WinHttp.au3"), download it here: https://github.com/dragana-r/autoit-winhttp  Standalone code: expandcollapse popupGlobal $__g_hWinInet_FTP = -1, $__g_hCallback_FTP, $__g_bCallback_FTP = False Global Const $STR_REGEXPARRAYGLOBALMATCH = 3, $STR_ENDISSTART = 0, $STR_ENDNOTSTART = 1, $FO_OVERWRITE = 2, $FO_BINARY = 16, $OPEN_EXISTING = 3, $FILE_SHARE_READ = 0x00000001, $FILE_SHARE_WRITE = 0x00000002, $FILE_SHARE_DELETE = 0x00000004, $GENERIC_WRITE = 0x40000000, $GENERIC_READ = 0x80000000, $INTERNET_OPEN_TYPE_DIRECT = 1, $FTP_TRANSFER_TYPE_UNKNOWN = 0, $FTP_TRANSFER_TYPE_BINARY = 2, $INTERNET_FLAG_DEFAULT = 0, $INTERNET_FLAG_PASSIVE = 0x08000000, $INTERNET_FLAG_TRANSFER_BINARY = 2, $INTERNET_SERVICE_FTP = 1, $INTERNET_FLAG_NO_CACHE_WRITE = 0x04000000, $INET_DOWNLOADCOMPLETE = 2, $INET_DOWNLOADSUCCESS = 3, $INTERNET_DEFAULT_PORT = 0, $ICU_ESCAPE = 0x80000000, $FILE_FLAG_BACKUP_SEMANTICS = 0x02000000, $WINHTTP_FLAG_ASYNC = 0x10000000, $WINHTTP_FLAG_ESCAPE_DISABLE = 0x00000040, $WINHTTP_FLAG_SECURE = 0x00800000, $WINHTTP_ACCESS_TYPE_NO_PROXY = 1, $WINHTTP_NO_PROXY_NAME = "", $WINHTTP_NO_PROXY_BYPASS = "", $WINHTTP_NO_REFERER = "", $WINHTTP_DEFAULT_ACCEPT_TYPES = 0, $WINHTTP_NO_ADDITIONAL_HEADERS = "", $WINHTTP_NO_REQUEST_DATA = "", $WINHTTP_HEADER_NAME_BY_INDEX = "", $WINHTTP_NO_HEADER_INDEX = 0, $WINHTTP_OPTION_CALLBACK = 1, $WINHTTP_OPTION_RESOLVE_TIMEOUT = 2, $WINHTTP_OPTION_CONNECT_TIMEOUT = 3, $WINHTTP_OPTION_CONNECT_RETRIES = 4, $WINHTTP_OPTION_SEND_TIMEOUT = 5, $WINHTTP_OPTION_RECEIVE_TIMEOUT = 6, $WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT = 7, $WINHTTP_OPTION_HANDLE_TYPE = 9, $WINHTTP_OPTION_READ_BUFFER_SIZE = 12, $WINHTTP_OPTION_WRITE_BUFFER_SIZE = 13, $WINHTTP_OPTION_PARENT_HANDLE = 21, $WINHTTP_OPTION_EXTENDED_ERROR = 24, $WINHTTP_OPTION_SECURITY_FLAGS = 31, $WINHTTP_OPTION_URL = 34, $WINHTTP_OPTION_SECURITY_KEY_BITNESS = 36, $WINHTTP_OPTION_PROXY = 38, $WINHTTP_OPTION_USER_AGENT = 41, $WINHTTP_OPTION_CONTEXT_VALUE = 45, $WINHTTP_OPTION_CLIENT_CERT_CONTEXT = 47, $WINHTTP_OPTION_REQUEST_PRIORITY = 58, $WINHTTP_OPTION_HTTP_VERSION = 59, $WINHTTP_OPTION_DISABLE_FEATURE = 63, $WINHTTP_OPTION_CODEPAGE = 68, $WINHTTP_OPTION_MAX_CONNS_PER_SERVER = 73, $WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER = 74, $WINHTTP_OPTION_AUTOLOGON_POLICY = 77, $WINHTTP_OPTION_SERVER_CERT_CONTEXT = 78, $WINHTTP_OPTION_ENABLE_FEATURE = 79, $WINHTTP_OPTION_WORKER_THREAD_COUNT = 80, $WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT = 81, $WINHTTP_OPTION_PASSPORT_COBRANDING_URL = 82, $WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH = 83, $WINHTTP_OPTION_SECURE_PROTOCOLS = 84, $WINHTTP_OPTION_ENABLETRACING = 85, $WINHTTP_OPTION_PASSPORT_SIGN_OUT = 86, $WINHTTP_OPTION_REDIRECT_POLICY = 88, $WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS = 89, $WINHTTP_OPTION_MAX_HTTP_STATUS_CONTINUE = 90, $WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE = 91, $WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE = 92, $WINHTTP_OPTION_CONNECTION_INFO = 93, $WINHTTP_OPTION_SPN = 96, $WINHTTP_OPTION_GLOBAL_PROXY_CREDS = 97, $WINHTTP_OPTION_GLOBAL_SERVER_CREDS = 98, $WINHTTP_OPTION_REJECT_USERPWD_IN_URL = 100, $WINHTTP_OPTION_USE_GLOBAL_SERVER_CREDENTIALS = 101, $WINHTTP_OPTION_UNSAFE_HEADER_PARSING = 110, $WINHTTP_OPTION_DECOMPRESSION = 118, $WINHTTP_OPTION_USERNAME = 0x1000, $WINHTTP_OPTION_PASSWORD = 0x1001, $WINHTTP_OPTION_PROXY_USERNAME = 0x1002, $WINHTTP_OPTION_PROXY_PASSWORD = 0x1003, $WINHTTP_DECOMPRESSION_FLAG_ALL = 0x00000003, $WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM = 0, $WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW = 1, $WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH = 2, $WINHTTP_ENABLE_PASSPORT_AUTH = 0x10000000, $HTTP_STATUS_DENIED = 401, $HTTP_STATUS_PROXY_AUTH_REQ = 407, $SECURITY_FLAG_IGNORE_UNKNOWN_CA = 0x00000100, $SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000, $SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000, $SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE = 0x00000200, $WINHTTP_QUERY_CONTENT_TYPE = 1, $WINHTTP_QUERY_STATUS_CODE = 19, $WINHTTP_QUERY_RAW_HEADERS_CRLF = 22, $WINHTTP_AUTH_SCHEME_BASIC = 0x00000001, $WINHTTP_AUTH_SCHEME_PASSPORT = 0x00000004, $WINHTTP_AUTH_TARGET_SERVER = 0x00000000 Global Const $hWINHTTPDLL__WINHTTP = DllOpen("winhttp.dll") DllOpen("winhttp.dll") ;Opt("MustDeclareVars", 1) Opt("TrayAutoPause", 0) If StringInStr(@OSArch, "64") And (Not @AutoItX64) Then _WinAPI_Wow64EnableWow64FsRedirection(0) ; #CONSTANTS# =================================================================================================================== Global Const $ViewLogConsole = 1, $bGetFieSize = 1 Global Const $OPTION_ENABLE_REDIRECTS = 6, $OPTION_USER_AGENT = 0 Global $obError = False, $oErrorHandler = ObjEvent("AutoIt.Error", "__Skip_OBJ_Error") Global $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1") Global $sUSER_AGENT = __WinHttpUA(), $TempDir = @TempDir If Not _Directory_Is_Accessible($TempDir) Then $TempDir = @LocalAppDataDir & "\Temp" If Not _Directory_Is_Accessible($TempDir) Then $TempDir = @ScriptDir EndIf ; =========================================================================================== ; Example Global $ftpUserName = "ftpuser@files.trong.live" Global $ftpPassword = "files.trong.live" Global $httpUserName = 'trong' Global $httpPassword = 'autoit' _Download('https://files.trong.live/test.jpg', @ScriptDir & "\testA.jpg") _Download('https://files.trong.live/prv/test.jpg', @ScriptDir & "\testA.jpg", $httpUserName, $httpPassword) _FTP_Download('ftp://files.trong.live/prv/test.jpg', @ScriptDir & "\testB.jpg", $ftpUserName, $ftpPassword) _Download('https://go.microsoft.com/fwlink/?LinkID=2093505', @ScriptDir & "\Microsoft_Edge_Ent_X86.msi") _WinHttp_Download('http://go.microsoft.com/fwlink/?LinkID=2093437', @ScriptDir & "\Microsoft_Edge_Ent_X64.msi") ; #CURRENT# ===================================================================================================================== ; _Download() ; _FTP_Download() ; _WinHttp_Download() ; =============================================================================================================================== ; #FUNCTION# ==================================================================================================================== ; Author... ...........: Dao Van Trong - TRONG.LIVE ; =========================================================================================== Func _Download($sURL_Input, $sLocalPathSAVE, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) $sURL_Input = StringReplace($sURL_Input, "\", "/") If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If ($dProtocol = "ftp" Or $dProtocol = "sftp" Or $dProtocol = "ftps") Then Local $fDL = _FTP_Download($sURL_Input, $sLocalPathSAVE, $dUserName, $dPassword) Return SetError(@error, @extended, $fDL) EndIf If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf If (Not ($dUserName == '')) Then ;$dUserName = StringReplace($dUserName, '@', '%40') If ($dProtocol == 'https' And $dPort <> 443) Or ($dProtocol == 'http' And $dPort <> 80) Then $sURL_Input = $dProtocol & "://" & $dUserName & ":" & $dPassword & "@" & $dDomain & ":" & $dPort & $dURLFilePathName Else $sURL_Input = $dProtocol & "://" & $dUserName & ":" & $dPassword & "@" & $dDomain & $dURLFilePathName EndIf EndIf _LogDebug("- InetGet Download: " & $sURL_Input & " -> " & $sLocalPathSAVE & @CRLF) Local $dlTempFilePath While 1 $dlTempFilePath = $TempDir & "\~download-" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "-" & Random(88888888, 99999999, 1) & ".tmp" If (Not FileExists($dlTempFilePath)) Then ExitLoop WEnd $dUserName = StringReplace($dUserName, '%40', '@') Local $sURL_Rediect Local $urlStatus = __URL_Check($sURL_Input, $sURL_Rediect, $dUserName, $dPassword) If @error Then _LogDebug("! /!\ Test connect Error ! " & @CRLF) Return 0 EndIf If ($sURL_Rediect == "") Then Else $sURL_Input = $sURL_Rediect EndIf HttpSetUserAgent($sUSER_AGENT) If $bGetFieSize Then _LogDebug("+ Get file size.... ") $dFileSize = InetGetSize($sURL_Input) If @error Then _LogDebug(" ERROR !" & @CRLF) Else _LogDebug(" OK -> " & _Byte_GetDisplay($dFileSize) & " " & @CRLF) EndIf EndIf _LogDebug("+ Downloading.... ") Local $hDownload = InetGet($sURL_Input, $dlTempFilePath, 1 + 2 + 16, 1) Local $Percentage = 0, $Old_Percentage = 0, $TotalToDownload = 0, $BytesDownloaded = 0, $DownloadedSoFar = 0, $pCheck = 0 Do Sleep(100) If $dFileSize > 0 Then ; Get number of bytes read for current file $BytesDownloaded = InetGetInfo($hDownload, 0) ; Add this to the cumulative total $DownloadedSoFar = $TotalToDownload + $BytesDownloaded ; Calculate the current file percentage $Percentage = Floor(($BytesDownloaded / $dFileSize) * 100) ; Only update the current file percent label if it has changed to avoid flickering If ($Percentage - $Old_Percentage) > 4 Then _LogDebug($Percentage & "% ") $Old_Percentage = $Percentage EndIf EndIf Until InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE) ; Retrieve the number of total bytes received and the filesize. ;Local $iBytesSize = InetGetInfo($hDownload, $INET_DOWNLOADREAD) ;Local $iFileSize = FileGetSize($dlTempFilePath) ;ConsoleWrite("- Downloaded: " & $iBytesSize & " KB/s " & @CRLF) ;ConsoleWrite("- File Size: " & $iFileSize & " KB/s " & @CRLF) Local $aDownloadData = InetGetInfo($hDownload) InetClose($hDownload) If ($aDownloadData[$INET_DOWNLOADSUCCESS] And FileExists($dlTempFilePath)) Then _LogDebug("- DONE !" & @CRLF) __File_SAVE($dlTempFilePath, $sLocalPathSAVE) If FileExists($sLocalPathSAVE) Then _LogDebug("+ Save file to: " & $sLocalPathSAVE & " OK !" & @CRLF) Else _LogDebug("! Save file to: " & $sLocalPathSAVE & " ERROR !" & @CRLF) EndIf Else _LogDebug(" ERROR " & @CRLF) _LogDebug("- Try Download again with WinHttp !" & @CRLF) Return _WinHttp_Download($sURL_Input, $sLocalPathSAVE) EndIf EndFunc ;==>_Download Func _WinHttp_Download($sURL_Input, $sLocalPathSAVE, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If ($dProtocol = "ftp" Or $dProtocol = "sftp" Or $dProtocol = "ftps") Then Local $fDL = _FTP_Download($sURL_Input, $sLocalPathSAVE, $dUserName, $dPassword) Return SetError(@error, @extended, $fDL) EndIf If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf _LogDebug("+ WinHttp Download: " & $sURL_Input & " -> " & $sLocalPathSAVE & @CRLF) Local $sURL_Rediect Local $urlStatus = __URL_Check($sURL_Input, $sURL_Rediect, $dUserName, $dPassword) If @error Then _LogDebug("! /!\ Test connect Error ! " & @CRLF) Return 0 EndIf If ($sURL_Rediect == "") Then Else $sURL_Input = $sURL_Rediect EndIf Local $dlTempFilePath While 1 $dlTempFilePath = $TempDir & "\~download-" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "-" & Random(88888888, 99999999, 1) & ".tmp" If (Not FileExists($dlTempFilePath)) Then ExitLoop WEnd ; Initialize and get session handle Local $hOpen = _WinHttpOpen() ; Set User-Agent string _WinHttpSetOption($hOpen, $WINHTTP_OPTION_USER_AGENT, $sUSER_AGENT) ; Get connection handle _LogDebug("- WinHttp Connecting ...") Local $hConnect = _WinHttpConnect($hOpen, $dDomain) If @error Then _LogDebug(" ERROR " & @error & @CRLF) Return SetError(1, 0, 0) EndIf _LogDebug(" OK" & @CRLF & "- WinHttp Downloading ...") ; SimpleSSL-request it... Local $vReturned If (($dProtocol = "https") Or ($dPort = 443)) Then $vReturned = _WinHttpSimpleSSLRequest($hConnect, "GET", $dURLFilePathName, $dProtocol & "://" & $dDomain, $WINHTTP_NO_REQUEST_DATA, $WINHTTP_NO_ADDITIONAL_HEADERS, False, 2, $dUserName, $dPassword) Else $vReturned = _WinHttpSimpleRequest($hConnect, "GET", $dURLFilePathName, $dProtocol & "://" & $dDomain, $WINHTTP_NO_REQUEST_DATA, $WINHTTP_NO_ADDITIONAL_HEADERS, False, 2, $dUserName, $dPassword) EndIf If @error Then _LogDebug("! Request ERROR " & @error & @CRLF) Return SetError(2, 0, 0) EndIf _LogDebug(" OK" & @CRLF & "- Saving to file ...") ; Close handles _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) If FileExists($sLocalPathSAVE) Then _DelIt($sLocalPathSAVE, 1) Local $iDirFile = _Path_Split($sLocalPathSAVE, 6) If Not FileExists($iDirFile) Then DirCreate($iDirFile) Local $DataLen = BinaryLen($vReturned) Local $hFile = FileOpen($sLocalPathSAVE, 2 + 8 + 16) FileWrite($hFile, $vReturned) FileClose($hFile) If FileExists($sLocalPathSAVE) Then _LogDebug(" OK (Size: " & _Byte_GetDisplay($DataLen) & ") file: " & $sLocalPathSAVE & @CRLF) Return 1 Else _LogDebug(" ERROR (Size: " & _Byte_GetDisplay($DataLen) & ") file: " & $sLocalPathSAVE & @CRLF) Return SetError(1, 0, 0) EndIf EndFunc ;==>_WinHttp_Download Func _FTP_Download($sURL_Input, $sLocalPathSAVE, $dUserName = "anonymous", $dPassword = "") _LogDebug("+ FTP Download: " & $sURL_Input & " -> " & $sLocalPathSAVE & @CRLF) If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'ftp://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) #cs ConsoleWrite("- Protocol : " & $dProtocol & @CRLF) ConsoleWrite("- Domain : " & $dDomain & @CRLF) ConsoleWrite("- Port : " & $dPort & @CRLF) ConsoleWrite("- User : " & $dUser & @CRLF) ConsoleWrite("- Password : " & $dPass & @CRLF) ConsoleWrite("- FilePathName: " & $dURLFilePathName & @CRLF) ConsoleWrite("- FilePath : " & $dURLFilePath & @CRLF) ConsoleWrite("- FileName : " &$dURLFileName & @CRLF) #ce If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "")) Then $dUserName = "anonymous" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf Local $Err, $sFTP_Message, $iReturn = 0, $iError = 0 Local $dlTempFilePath = $TempDir & "\~download.tmp" While 1 $dlTempFilePath = $TempDir & "\~download-" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "-" & Random(88888888, 99999999, 1) & ".tmp" If (Not FileExists($dlTempFilePath)) Then ExitLoop WEnd If $bGetFieSize Then _LogDebug("- FTP Getting the file size... " & @CRLF) $dFileSize = _Byte_GetDisplay(__FTP_FileGetSize($sURL_Input, $dUserName, $dPassword)) EndIf ;_LogDebug("-Protocol: " & $dProtocol & @CRLF) ;_LogDebug("-Server: " & $dDomain & @CRLF) ;_LogDebug("-User: '" & $dUserName & "'" & @CRLF) ;_LogDebug("-Password: '" & $dPassword & "'" & @CRLF) ;_LogDebug("-RemoteFile: " & $dURLFilePathName & @CRLF) If $dFileSize > 0 Then _LogDebug("- File Size: " & $dFileSize & @CRLF) Else _LogDebug("! An error occurred, Getting the file size failed!" & @CRLF) EndIf _LogDebug("- FTP Getting the file ... " & @CRLF) Local $hOpen = _FTP_Open('FTP_Client', $INTERNET_OPEN_TYPE_DIRECT) If @error Then Return SetError(1, 0, 0) Local $hFTPSession = _FTP_Connect($hOpen, $dDomain, $dUserName, $dPassword) If @error Then Local $WinHTTP_Error_Return = @extended Local $WinHTTP_Error_Name = _WinHTTP_GetName_ErrorCode($WinHTTP_Error_Return) _LogDebug('! _FTP_Connect Error: ' & @error & " - Extended: " & $WinHTTP_Error_Return & @CRLF) _LogDebug('! WinHTTP Error: ' & $WinHTTP_Error_Name & @CRLF) If ($WinHTTP_Error_Return = 12029) Then _LogDebug('! Error: A connection with the server could not be established' & @CRLF) If ($WinHTTP_Error_Return = 12014) Then _LogDebug('! Error: The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect.' & @CRLF) Return SetError(2, $WinHTTP_Error_Return, 0) EndIf If $bGetFieSize Then _LogDebug("- Downloading " & $dURLFilePathName & " (" & $dFileSize & ") " & " ..." & @CRLF) Else _LogDebug("- Downloading " & $dURLFilePathName & " ...") EndIf Local $fuFunctionToCall = __FTPGetFile_UpdateProgress Local $iFDL = _FTP_ProgressDownload($hFTPSession, $dlTempFilePath, $dURLFilePathName, $fuFunctionToCall) Local $iErr, $sFTP_Message If (Not FileExists($dlTempFilePath)) Then _FTP_GetLastResponseInfo($iErr, $sFTP_Message) _LogDebug('! ERROR ! Code: [' & $Err & '] FTP_Message: [' & @CRLF & $sFTP_Message & "]" & @CRLF) _FTP_Close($hFTPSession) _FTP_Close($hOpen) $hOpen = _FTP_Open('FTP_Client', $INTERNET_OPEN_TYPE_DIRECT) $hFTPSession = _FTP_Connect($hOpen, $dDomain, $dUserName, $dPassword) If @error Then Local $WinHTTP_Error_Return = @extended Local $WinHTTP_Error_Name = _WinHTTP_GetName_ErrorCode($WinHTTP_Error_Return) _LogDebug('! _FTP_Connect Error: ' & @error & " - Extended: " & $WinHTTP_Error_Return & @CRLF) _LogDebug('! WinHTTP Error: ' & $WinHTTP_Error_Name & @CRLF) If ($WinHTTP_Error_Return = 12029) Then _LogDebug('! Error: A connection with the server could not be established' & @CRLF) If ($WinHTTP_Error_Return = 12014) Then _LogDebug('! Error: The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect.' & @CRLF) Return SetError(2, $WinHTTP_Error_Return, 0) EndIf $iFDL = _FTP_FileGet($hFTPSession, $dURLFilePathName, $dlTempFilePath, False, Default, $FTP_TRANSFER_TYPE_BINARY) If (Not FileExists($dlTempFilePath)) Then _FTP_GetLastResponseInfo($iErr, $sFTP_Message) _LogDebug('! ERROR ! Code: [' & $Err & '] FTP_Message: [' & @CRLF & $sFTP_Message & "]" & @CRLF) _FTP_Close($hFTPSession) _FTP_Close($hOpen) Return SetError(3, 0, 0) Else _LogDebug('+ OK !' & @CRLF) EndIf Else _LogDebug('+ OK !' & @CRLF) EndIf _FTP_Close($hFTPSession) _FTP_Close($hOpen) __File_SAVE($dlTempFilePath, $sLocalPathSAVE) If FileExists($sLocalPathSAVE) Then _LogDebug("+ Save file to: " & $sLocalPathSAVE & " OK !" & @CRLF) Return SetError(0, 0, 1) Else _LogDebug("! Save file to: " & $sLocalPathSAVE & " ERROR !" & @CRLF) Return SetError(4, 0, 0) EndIf EndFunc ;==>_FTP_Download Func __FTPGetFile_UpdateProgress($iPercent) _LogDebug(" " & Int($iPercent) & "%" & ' ') ;If _IsPressed("77") Then Return 0 ; Abort on F8 Return 1 ; 1 to continue Download EndFunc ;==>__FTPGetFile_UpdateProgress Func __FTP_FileGetSize($sURL_Input, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'ftp://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "")) Then $dUserName = "anonymous" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf Local $hOpen = _FTP_Open('FTP_Client') If @error Then Return SetError(1, 0, "") Local $hConn = _FTP_Connect($hOpen, $dDomain, $dUserName, $dPassword) If @error Then Local $WinHTTP_Error_Return = @extended Local $WinHTTP_Error_Name = _WinHTTP_GetName_ErrorCode($WinHTTP_Error_Return) _LogDebug('! _FTP_Connect Error: ' & @error & " - Extended: " & $WinHTTP_Error_Return & @CRLF) _LogDebug('! WinHTTP Error: ' & $WinHTTP_Error_Name & @CRLF) If ($WinHTTP_Error_Return = 12029) Then _LogDebug('! Error: A connection with the server could not be established' & @CRLF) If ($WinHTTP_Error_Return = 12014) Then _LogDebug('! Error: The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect.' & @CRLF) Return SetError(2, $WinHTTP_Error_Return, 0) EndIf Local $iFileSize = _FTP_FileGetSize($hConn, $dURLFilePathName) If @error Then Return SetError(3, 0, "") ;ConsoleWrite('$sFilenameNext1 = ' & $dFileName & ' size = ' & $iFileSize & ' -> Error code: ' & @error & ' extended: ' & @extended & @CRLF) Local $iErr, $sMessage Local $iFtpr = _FTP_GetLastResponseInfo($iErr, $sMessage) ; no error ;ConsoleWrite('$sMessage = ' & $sMessage & ' err = ' & $iErr & ' -> Error code: ' & @error & ' extended: ' & @extended & @CRLF) Local $iFtpc = _FTP_Close($hConn) Local $iFtpo = _FTP_Close($hOpen) Return $iFileSize EndFunc ;==>__FTP_FileGetSize Func __File_SAVE($dlTempFilePath, $sLocalPathSAVE) If Not FileExists($dlTempFilePath) Then _LogDebug("! Source path is not File Exists: " & $dlTempFilePath & @CRLF) Return SetError(1, 0, -1) EndIf _LogDebug("- Move (" & FileExists($dlTempFilePath) & ") " & $dlTempFilePath & " >TO> " & $sLocalPathSAVE & " > ") If FileExists($sLocalPathSAVE) Then _DelIt($sLocalPathSAVE, 1) Local $iDirFile = _Path_Split($sLocalPathSAVE, 6) If Not FileExists($iDirFile) Then DirCreate($iDirFile) If FileMove($dlTempFilePath, $sLocalPathSAVE, 1) Then _DelIt($dlTempFilePath, 1) _LogDebug(" Move OK" & @CRLF) Return 1 Else _LogDebug(" ERROR !" & @CRLF & @CRLF) _LogDebug("- Try Copy (" & FileExists($dlTempFilePath) & ") " & $dlTempFilePath & " >TO> " & $sLocalPathSAVE & " > ") If FileCopy($dlTempFilePath, $sLocalPathSAVE, 1) Then _DelIt($dlTempFilePath, 1) _LogDebug(" OK" & @CRLF) Return 1 Else _LogDebug(" ERROR !" & @CRLF & @CRLF) Return 0 EndIf EndIf EndFunc ;==>__File_SAVE Func _Encode_URL($UnicodeURL) Local $UnicodeBinary = StringToBinary($UnicodeURL, 4) Local $UnicodeBinary2 = StringReplace($UnicodeBinary, '0x', '', 1) Local $UnicodeBinaryLength = StringLen($UnicodeBinary2) Local $EncodedString, $UnicodeBinaryChar For $i = 1 To $UnicodeBinaryLength Step 2 $UnicodeBinaryChar = StringMid($UnicodeBinary2, $i, 2) If StringInStr("$-_.+!*'(),;/?:@=&abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", BinaryToString('0x' & $UnicodeBinaryChar, 4)) Then $EncodedString &= BinaryToString('0x' & $UnicodeBinaryChar) Else $EncodedString &= '%' & $UnicodeBinaryChar EndIf Next Return $EncodedString EndFunc ;==>_Encode_URL Func _Decode_URL($toDecode) Local $strChar = "", $iOne, $iTwo Local $aryHex = StringSplit($toDecode, "") For $i = 1 To $aryHex[0] If $aryHex[$i] = "%" Then $i = $i + 1 $iOne = $aryHex[$i] $i = $i + 1 $iTwo = $aryHex[$i] $strChar = $strChar & Chr(Dec($iOne & $iTwo)) Else $strChar = $strChar & $aryHex[$i] EndIf Next Local $Process = StringToBinary(StringReplace($strChar, "+", " ")) Local $DecodedString = BinaryToString($Process, 4) Return $DecodedString EndFunc ;==>_Decode_URL Func __URL_Status($sURL_Input, ByRef $sURL_Rediect, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf If (Not ($dUserName == '')) Then If ($dProtocol == 'https' And $dPort <> 443) Or ($dProtocol == 'http' And $dPort <> 80) Then $sURL_Input = $dProtocol & "://" & $dDomain & ":" & $dPort & $dURLFilePathName Else $sURL_Input = $dProtocol & "://" & $dDomain & $dURLFilePathName EndIf EndIf $oHTTP.Option($OPTION_USER_AGENT) = $sUSER_AGENT $oHTTP.Option($OPTION_ENABLE_REDIRECTS) = False $oHTTP.Open("HEAD", $sURL_Input, False) If @error Then Return SetError(1, @error, -1) If (StringLen(StringStripWS($dUserName, 8)) > 1) Then $oHTTP.SetCredentials($dUserName, $dPassword, 0) $oHTTP.Send() If @error Then Return SetError(2, @error, 105) ;Error 105 (net::ERR_NAME_NOT_RESOLVED) Local $oStatus = $oHTTP.Status If @error Then Return SetError(3, @error, 118) ;Error 118 (net::ERR_CONNECTION_TIMED_OUT) If (($oStatus = 301) Or ($oStatus = 302)) Then $sURL_Rediect = $oHTTP.GetResponseHeader("Location") _LogDebug("! Redirect to URL: " & $sURL_Rediect & @CRLF) EndIf ;_LogDebug("+ GetResponseHeader: " & $oStatus & @CRLF) ;_LogDebug("- Cache-Control: " & $oHTTP.GetResponseHeader("Cache-Control") & @CRLF) ;_LogDebug("- Connection: " & $oHTTP.GetResponseHeader("Connection") & @CRLF) ;_LogDebug("- Date: " & $oHTTP.GetResponseHeader("Date") & @CRLF) ;_LogDebug("- Keep-Alive: " & $oHTTP.GetResponseHeader("Keep-Alive") & @CRLF) _LogDebug("- Content-Length: " & _Byte_GetDisplay($oHTTP.GetResponseHeader("Content-Length")) & @CRLF) ;_LogDebug("- Content-Type: " & $oHTTP.GetResponseHeader("Content-Type") & @CRLF) ;_LogDebug("- Expires: " & $oHTTP.GetResponseHeader("Expires") & @CRLF) ;_LogDebug("- Last-Modified: " & $oHTTP.GetResponseHeader("Last-Modified") & @CRLF) ;_LogDebug("- Accept-Ranges: " & $oHTTP.GetResponseHeader("Accept-Ranges") & @CRLF) ;_LogDebug("- Server: " & $oHTTP.GetResponseHeader("Server") & @CRLF) ;_LogDebug("- WWW-Authenticate: " & $oHTTP.GetResponseHeader("WWW-Authenticate") & @CRLF) ;_LogDebug($oHTTP.getAllResponseHeaders() & @CRLF) $oHTTP.Option($OPTION_ENABLE_REDIRECTS) = True Return SetError(0, 0, $oStatus) EndFunc ;==>__URL_Status Func _Check_Connect($iDomain, $iPort = 80) Opt("TCPTimeout", 3000) TCPStartup() _LogDebug("- Checking Domain: " & $iDomain & " | Port: " & $iPort & " ") Local $sIPAddress = TCPNameToIP($iDomain) _LogDebug(" -> IP Address: " & $sIPAddress) Local $iSocket = TCPConnect($sIPAddress, $iPort) If $iSocket < 1 Then _LogDebug(" -> ERROR !" & @CRLF) Return SetError(1, 0, 0) Else _LogDebug(" -> SK:" & $iSocket & " OK !" & @CRLF) Return SetError(0, 0, 1) EndIf TCPShutdown() Opt("TCPTimeout", 250) EndFunc ;==>_Check_Connect Func __URL_Check($sURL_Input, ByRef $sURL_Rediect, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) #cs ConsoleWrite("- Protocol : " & $dProtocol & @CRLF) ConsoleWrite("- Domain : " & $dDomain & @CRLF) ConsoleWrite("- Port : " & $dPort & @CRLF) ConsoleWrite("- User : " & $dUser & @CRLF) ConsoleWrite("- Password : " & $dPass & @CRLF) ConsoleWrite("- FilePathName: " & $dURLFilePathName & @CRLF) ConsoleWrite("- FilePath : " & $dURLFilePath & @CRLF) ConsoleWrite("- FileName : " &$dURLFileName & @CRLF) #ce If $dPort > 0 Then If _Check_Connect($dDomain, $dPort) = 0 Then Return SetError(1, 0, 0) Else Switch $dProtocol Case "http" If (_Check_Connect($dDomain, 80) = 0) Then Return SetError(1, 0, 0) Case "https" If (_Check_Connect($dDomain, 443) = 0) Then Return SetError(1, 0, 0) Case "ftp", "ftps" If (_Check_Connect($dDomain, 21) = 0) Then Return SetError(1, 0, 0) Case "sftp" If (_Check_Connect($dDomain, 22) = 0) Then Return SetError(1, 0, 0) EndSwitch EndIf Local $urlStatus = __URL_Status($sURL_Input, $sURL_Rediect, $dUserName, $dPassword) Switch $urlStatus Case 301, 302 If ($sURL_Rediect == "") Then Else $sURL_Input = $sURL_Rediect EndIf _LogDebug("- URL Status: " & $urlStatus & " > Connection Successful! (URL redirect to: " & $sURL_Input & ")" & @CRLF) Return SetError(0, 0, __URL_Check($sURL_Input, $sURL_Rediect, $dUserName, $dPassword)) Case 200 _LogDebug("- URL Status: " & $urlStatus & " > Connection Successful! (URL: " & $sURL_Input & ")" & @CRLF) Return SetError(0, 0, $urlStatus) Case 401, 407 _LogDebug("- URL Status: " & $urlStatus & " > Connection error! > Unauthorized (URL: " & $sURL_Input & ")" & @CRLF) Case 404 _LogDebug("- URL Status: " & $urlStatus & " > Connection Successful! > URL Not Found: " & $sURL_Input & @CRLF) Case 105 _LogDebug("- URL Status: " & $urlStatus & " > Connection error: ERR_NAME_NOT_RESOLVED > URL is Not Found: " & $sURL_Input & @CRLF) Case Else _LogDebug("- URL Status: " & $urlStatus & " > Connection error! > URL: " & $sURL_Input & @CRLF) EndSwitch Return SetError(1, 0, $urlStatus) EndFunc ;==>__URL_Check Func _Byte_GetDisplay($iSize, $iPlaces = 4) Local $aBytes[7] = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB'] For $i = 6 To 1 Step -1 If $iSize >= 1024 ^ $i Then Return Round($iSize / 1024 ^ $i, $iPlaces) & $aBytes[$i] EndIf Next Return $iSize & ' Bytes' EndFunc ;==>_Byte_GetDisplay Func _Convert_Size($inputSize, $inputUnit = 0, $outputPlaces = 2, $outputString = True, $inputBits = False, $outputBits = False, $outputUnit = -4) Local $unitNames[9] = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"] Local $Bytes = $inputSize * 1024 ^ $inputUnit Local $b = "B" If $inputBits Then $Bytes /= 8 If $outputBits Then $Bytes *= 8 $b = "b" EndIf If $outputUnit < 0 Then Local $outputMax = Abs($outputUnit) $outputUnit = Int(Log($Bytes) / Log(1024)) If $outputUnit > $outputMax Then $outputUnit = $outputMax EndIf If $outputString Then Return String(Round($Bytes / 1024 ^ $outputUnit, $outputPlaces)) & " " & $unitNames[$outputUnit] & $b Else Return Round($Bytes / 1024 ^ $outputUnit, $outputPlaces) EndIf EndFunc ;==>_Convert_Size Func _Path_Split($sFilePath, $sType = 0) Local $sDrive, $sDir, $sFileName, $sExtension, $sReturn Local $aArray = StringRegExp($sFilePath, "^\h*((?:\\\\\?\\)*(\\\\[^\?\/\\]+|[A-Za-z]:)?(.*[\/\\]\h*)?((?:[^\.\/\\]|(?(?=\.[^\/\\]*\.)\.))*)?([^\/\\]*))$", 1) If @error Then ReDim $aArray[5] $aArray[0] = $sFilePath EndIf $sDrive = $aArray[1] If StringLeft($aArray[2], 1) == "/" Then $sDir = StringRegExpReplace($aArray[2], "\h*[\/\\]+\h*", "\/") Else $sDir = StringRegExpReplace($aArray[2], "\h*[\/\\]+\h*", "\\") EndIf $aArray[2] = $sDir $sFileName = $aArray[3] $sExtension = $aArray[4] If $sType = 1 Then Return $sDrive If $sType = 2 Then Return $sDir If $sType = 3 Then Return $sFileName If $sType = 4 Then Return $sExtension If $sType = 5 Then Return $sFileName & $sExtension If $sType = 6 Then Return $sDrive & $sDir If $sType = 7 Then Return $sDrive & $sDir & $sFileName Return $aArray EndFunc ;==>_Path_Split Func _IsFile($sPath) If (Not FileExists($sPath)) Then Return SetError(-1, 0, 0) If StringInStr(FileGetAttrib($sPath), 'D') <> 0 Then Return SetError(0, 0, 0) Else Return SetError(0, 0, 1) EndIf EndFunc ;==>_IsFile Func _DelIt($sPath, $Fc = 1) If (Not FileExists($sPath)) Then Return SetError(-1, 0, 1) If _IsFile($sPath) Then Return SetError(0, 0, _DelFile($sPath, $Fc)) Else Return SetError(0, 0, _RemoveDir($sPath, $Fc)) EndIf EndFunc ;==>_DelIt Func _DelFile($sPath, $Fc = 1) If (Not _IsFile($sPath)) Then Return SetError(-1, 0, 0) Else FileSetAttrib($sPath, "-RSH") FileDelete($sPath) If $Fc Then If FileExists($sPath) Then _TakeOwnership($sPath, "Everyone", $Fc) If FileExists($sPath) Then FileDelete($sPath) If FileExists($sPath) Then RunWait(@ComSpec & ' /c Del /f /q "' & $sPath & '"', '', @SW_HIDE) EndIf If FileExists($sPath) Then Return SetError(1, 0, 0) Return SetError(0, 0, 1) EndIf EndFunc ;==>_DelFile Func _RemoveDir($sPath, $Fc = 1) If _IsFile($sPath) Then Return SetError(-1, 0, 0) Else DirRemove($sPath, $Fc) If FileExists($sPath) Then _TakeOwnership($sPath, "Everyone", $Fc) DirRemove($sPath, $Fc) If FileExists($sPath) Then RunWait(@ComSpec & ' /c rmdir "' & $sPath & '" /s /q ', '', @SW_HIDE) If FileExists($sPath) Then Return SetError(1, 0, 0) Return SetError(0, 0, 1) EndIf EndFunc ;==>_RemoveDir Func _GetDomainURL($sURL_Input) Local $sURL_Pattern = "^(?i)(?:(?:[a-z]+):\/\/)?" & _ ; Protocol "(?:(?:(?:[^@:]+))" & _ ; Username "(?::(?:[^@]+))?@)?" & _ ; Password "([^\/:]+)" & _ ; Host "(?::(?:\d+))?" & _ ; Port "(?:\/(?:[^?]+)?)?" & _ ; Path "(?:\?\N+)?" ; Query Local $aHost = StringRegExp($sURL_Input, $sURL_Pattern, 1) If IsArray($aHost) Then Return $aHost[0] Return "" EndFunc ;==>_GetDomainURL Func _LogDebug($iLog = "", $iLogs = "", $itype = -1) If (($itype = 0) And ($iLog = "") And ($iLogs = "")) Then Return 0 If (($itype = -1) And $ViewLogConsole) Then Return ConsoleWrite($iLog) If ($iLogs = "") Then $iLogs = $iLog If ($itype = 0) Then If $ViewLogConsole Then ConsoleWrite("- " & $iLog & @CRLF) ;If $sTextColor <> $lBkColor Then ;$sTextColor = $lBkColor ;GUICtrlSetColor($labStatus, $sTextColor) ;EndIf ;GUICtrlSetData($labStatus, $iLogs) Else If $ViewLogConsole Then ConsoleWrite("! " & $iLog & @CRLF) ;If $sTextColor <> $sTextColorError Then ;$sTextColor = $sTextColorError ;GUICtrlSetColor($labStatus, $sTextColor) ;EndIf ;GUICtrlSetData($labStatus, $iLogs) EndIf Return 1 EndFunc ;==>_LogDebug Func __Skip_OBJ_Error() $obError = True ;ConsoleWrite("! " & $obError.description & @CRLF) EndFunc ;==>__Skip_OBJ_Error Func _WinHttpURL_GetStatus($sURL_Input, $dUserName = "anonymous", $dPassword = "") If (StringStripWS($sURL_Input, 8) == '') Then Return SetError(1, 0, 0) If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input Local $dFileSize, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName _WinHttp_SplitURL($sURL_Input, $dProtocol, $dDomain, $dPort, $dUser, $dPass, $dURLFilePathName, $dURLFilePath, $dURLFileName) If (($dUserName = Default) Or (StringStripWS($dUserName, 8) == "") Or (StringLower($dUserName) == "anonymous")) Then $dUserName = "" If ((StringLower($dUserName) == "anonymous") Or ($dUserName == "") And (StringLen(StringStripWS($dUser, 8)) > 1)) Then $dUserName = $dUser If (($dPassword == "") And (StringLen($dPass) > 1)) Then $dPassword = $dPass EndIf ; Initialize and get session handle Global $hOpen = _WinHttpOpen() ; Get connection handle Global $hConnect = _WinHttpConnect($hOpen, $dDomain) ; Specify the reguest Global $hRequest = _WinHttpOpenRequest($hConnect, "HEAD", $dURLFilePathName, Default, $dProtocol & "://" & $dDomain) ; Set credentials If (StringLen(StringStripWS($dUserName, 8)) > 1) Then _WinHttpSetCredentials($hRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, $dUserName, $dPassword) ; Send request _WinHttpSendRequest($hRequest) ; Wait for the response _WinHttpReceiveResponse($hRequest) ; Get full header Global $sHeader = _WinHttpQueryHeaders($hRequest) ConsoleWrite($sHeader & @CRLF) ; Close handles _WinHttpCloseHandle($hRequest) _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) EndFunc ;==>_WinHttpURL_GetStatus Func _Directory_Is_Accessible($sPath, $iTouch = 0) If Not FileExists($sPath) Then DirCreate($sPath) If Not StringInStr(FileGetAttrib($sPath), "D", 2) Then Return SetError(1, 0, 0) Local $iEnum = 0, $maxEnum = 9999, $iRandom = Random(88888888, 99999999, 1) If $iTouch Then _TakeOwnership($sPath, "Everyone", 1) While FileExists($sPath & "\_IsWritable-" & $iEnum & "-" & $iRandom) $iEnum += 1 If ($iEnum > $maxEnum) Then Return SetError(2, 0, 0) WEnd Local $iSuccess = DirCreate($sPath & "\_IsWritable-" & $iEnum & "-" & $iRandom) Switch $iSuccess Case 1 $iTouch = DirRemove($sPath & "\_IsWritable-" & $iEnum & "-" & $iRandom, 1) Return SetError($iTouch < 1, 0, $iTouch) Case Else Return SetError(3, 0, 0) EndSwitch EndFunc ;==>_Directory_Is_Accessible Func _File_Is_Accessible($sFile, $iTouch = 0) ; Returns ; 1 = Success, file is writeable and deletable ; 2 = Access Denied because of lacking access rights OR because file is open by another process ; 3 = File is set "Read Only" by attribute ; 0 = File not found or Is Directory If ((Not FileExists("\\?\" & $sFile)) Or StringInStr(FileGetAttrib("\\?\" & $sFile), "D", 2)) Then Return SetError(1, 0, 0) Local $oFileAttrib = FileGetAttrib("\\?\" & $sFile) If $iTouch Then FileSetAttrib("\\?\" & $sFile, "-RHS") _TakeOwnership($sFile, "Everyone", 1) EndIf If StringInStr(FileGetAttrib("\\?\" & $sFile), "R", 2) Then Return 3 ; Read-Only Flag set Local $hFile = _WinAPI_CreateFileEx("\\?\" & $sFile, $OPEN_EXISTING, $GENERIC_READ + $GENERIC_WRITE, $FILE_SHARE_READ + $FILE_SHARE_WRITE + $FILE_SHARE_DELETE, $FILE_FLAG_BACKUP_SEMANTICS) ; Local $iReturn = $hFile _WinAPI_CloseHandle($hFile) If ($iReturn = 0) Then Return 2 ; File not accessible, UAC issue? Return 1 ; Success EndFunc ;==>_File_Is_Accessible Func _TakeOwnership($sFile, $iUserName = "Everyone", $sRecurse = 1) If ($iUserName = Default) Or (StringStripWS($iUserName, 8) = '') Then $iUserName = "Everyone" If ($sRecurse = Default) Or ($sRecurse = True) Or ($sRecurse > 0) Then $sRecurse = 1 Else $sRecurse = 0 EndIf Local $osNotIsEnglish = True Switch @OSLang Case "0009", "0409", "0809", "0C09", "1009", "1409", "1809", "1C09", "2009", "2409", "2809", "2C09", "3009", "3409", "3C09", "4009", "4409", "4809", "4C09" $osNotIsEnglish = False Case "3809", "5009", "5409", "5809", "5C09", "6009", "6409" ; new $osNotIsEnglish = False EndSwitch If StringInStr($iUserName, ' ') Then $iUserName = '"' & $iUserName & '"' If ($sRecurse = Default) Then $sRecurse = 1 If Not FileExists($sFile) Then Return SetError(1, 0, $sFile) If StringInStr(FileGetAttrib($sFile), 'D') <> 0 Then If $sRecurse Then RunWait(@ComSpec & ' /c takeown /f "' & $sFile & '" /R /D Y', '', @SW_HIDE) If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /T /C /G Administrators:F', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /T /C /G Users:F', '', @SW_HIDE) RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /T /C /G ' & $iUserName & ':F', '', @SW_HIDE) If $osNotIsEnglish Then If ($iUserName = "Everyone") Then $iUserName = '*S-1-1-0' If ($iUserName = '"' & 'Authenticated Users' & '"') Then $iUserName = '*S-1-5-11' EndIf If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Administrators:F /T /C /Q', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Users:F /T /C /Q', '', @SW_HIDE) RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant ' & $iUserName & ':F /T /C /Q', '', @SW_HIDE) Return SetError(0, 0, FileSetAttrib($sFile, "-RHS", 1)) Else RunWait(@ComSpec & ' /c takeown /f "' & $sFile & '" ', '', @SW_HIDE) If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Administrators:F', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Users:F', '', @SW_HIDE) RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G ' & $iUserName & ':F', '', @SW_HIDE) If $osNotIsEnglish Then If ($iUserName = "Everyone") Then $iUserName = '*S-1-1-0' If ($iUserName = '"' & 'Authenticated Users' & '"') Then $iUserName = '*S-1-5-11' EndIf If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Administrators:F /C /Q', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Users:F /C /Q', '', @SW_HIDE) RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant ' & $iUserName & ':F /C /Q', '', @SW_HIDE) Return SetError(0, 0, FileSetAttrib($sFile, "-RHS", 0)) EndIf Else RunWait(@ComSpec & ' /c takeown /f "' & $sFile & '"', '', @SW_HIDE) If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Administrators:F', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G Users:F', '', @SW_HIDE) RunWait(@ComSpec & ' /c Echo y|Cacls "' & $sFile & '" /C /G ' & $iUserName & ':F', '', @SW_HIDE) If $osNotIsEnglish Then If ($iUserName = "Everyone") Then $iUserName = '*S-1-1-0' If ($iUserName = '"' & 'Authenticated Users' & '"') Then $iUserName = '*S-1-5-11' EndIf If $iUserName <> 'Administrators' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Administrators:F /Q', '', @SW_HIDE) If $iUserName <> 'Users' Then RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant Users:F /Q', '', @SW_HIDE) RunWait(@ComSpec & ' /c iCacls "' & $sFile & '" /grant ' & $iUserName & ':F /Q', '', @SW_HIDE) Return SetError(0, 0, FileSetAttrib($sFile, "-RHS")) EndIf Return $sFile EndFunc ;==>_TakeOwnership Func _URL_Split($sURL_Input, ByRef $sURL_Protocol, ByRef $sURL_Domain, ByRef $sURL_FilePATH, ByRef $sURL_FileName) Local $sURL_Protocol_Number_Pattern = '^(?s)(?i)(http|ftp|sftp|ftps|https|file)://(.*?/|.*$)(.*/){0,}(.*)$' Local $sURL_Pattern = "^(?i)(?:(?:[a-z]+):\/\/)?" & "(?:(?:(?:[^@:]+))" & "(?::(?:[^@]+))?@)?" & "([^\/:]+)" & "(?::(?:\d+))?" & "(?:\/(?:[^?]+)?)?" & "(?:\?\N+)?" Local $aURL_Pattern = StringRegExp($sURL_Input, $sURL_Protocol_Number_Pattern, 2) If Not IsArray($aURL_Pattern) Or UBound($aURL_Pattern) - 1 <> 4 Then Return SetError(1, 0, 0) If StringRight($aURL_Pattern[2], 1) = '/' Then $aURL_Pattern[2] = StringTrimRight($aURL_Pattern[2], 1) $aURL_Pattern[3] = '/' & $aURL_Pattern[3] EndIf $sURL_Protocol = $aURL_Pattern[1] Local $aHost = StringRegExp($sURL_Input, $sURL_Pattern, 1) If Not @error And IsArray($aHost) Then $sURL_Domain = $aHost[0] Else $sURL_Domain = $aURL_Pattern[2] EndIf $sURL_FilePATH = $aURL_Pattern[3] $sURL_FileName = $aURL_Pattern[4] Return $aURL_Pattern EndFunc ;==>_URL_Split #cs Local $sURL_Protocol, $sURL_Protocol_Number, $sURL_Domain, $sURL_Port, $sURL_User, $sURL_Password, $sURL_FilePathName, $sURL_FilePATH, $sURL_FileName _WinHttp_SplitURL($sURL_Input, $sURL_Protocol, $sURL_Domain, $sURL_Port, $sURL_User, $sURL_Password, $sURL_FilePathName, $sURL_FilePATH, $sURL_FileName) ConsoleWrite("! URL_Input : " & $sURL_Input & @CRLF) ConsoleWrite("- Protocol : " & $sURL_Protocol & @CRLF) ConsoleWrite("- Domain : " & $sURL_Domain & @CRLF) ConsoleWrite("- Port : " & $sURL_Port & @CRLF) ConsoleWrite("- User : " & $sURL_User & @CRLF) ConsoleWrite("- Password : " & $sURL_Password & @CRLF) ConsoleWrite("- FilePathName: " & $sURL_FilePathName & @CRLF) ConsoleWrite("- FilePath : " & $sURL_FilePath & @CRLF) ConsoleWrite("- FileName : " & $sURL_FileName & @CRLF) #ce Func _WinHttp_SplitURL($sURL_Input, ByRef $sURL_Protocol, ByRef $sURL_Domain, ByRef $sURL_Port, ByRef $sURL_User, ByRef $sURL_Password, ByRef $sURL_FilePathName, ByRef $sURL_FilePATH, ByRef $sURL_FileName) If StringStripWS($sURL_Input, 8) = '' Then Return SetError(1, 0, 0) $sURL_Input = StringReplace($sURL_Input, "\", "/") If (Not StringInStr($sURL_Input, '://')) Then $sURL_Input = 'http://' & $sURL_Input _URL_Split($sURL_Input, $sURL_Protocol, $sURL_Domain, $sURL_FilePATH, $sURL_FileName) StringReplace($sURL_Input, '@', '') If @extended > 1 Then Local $sUser, $aUser = _StringBetween($sURL_Input, $sURL_Protocol & "://", '@') If IsArray($aUser) Then $sUser = $aUser[0] $sURL_Input = StringReplace($sURL_Input, $sURL_Protocol & "://" & $sUser & '@', $sURL_Protocol & "://" & $sUser & '%40') EndIf EndIf Local $ORG_URL_Protocol = $sURL_Protocol, $sFake_Protocol = 'http', $iFake_Protocol = False Switch $sURL_Protocol Case 'http', 'https', 'ftp' Case Else $iFake_Protocol = True $sURL_Input = StringReplace($sURL_Input, $sURL_Protocol & "://", $sFake_Protocol & "://") EndSwitch Local $aUrl = _WinHttpCrackUrl($sURL_Input) If IsArray($aUrl) Then If $iFake_Protocol Then $sURL_Protocol = $ORG_URL_Protocol Else $sURL_Protocol = ($aUrl[0] == '' ? $sURL_Protocol : $aUrl[0]) EndIf ;$sURL_Protocol_Number = $aUrl[1] $sURL_Domain = ($aUrl[2] == '' ? $sURL_Domain : $aUrl[2]) $sURL_Port = $aUrl[3] $sURL_User = StringReplace($aUrl[4], '%40', '@') $sURL_Password = $aUrl[5] $sURL_FilePathName = ($aUrl[6] == '' ? $sURL_FilePATH & $sURL_FileName : $aUrl[6]) ;$sURL_ExtraInfo = $aUrl[7] Return $aUrl EndIf Return SetError(1, 0, "") EndFunc ;==>_WinHttp_SplitURL Func _WinHTTP_GetName_ErrorCode($nErrorCode = 0) ; By Dao Van Trong - TRONG.LIVE Switch $nErrorCode Case 12001 Return "ERROR_WINHTTP_OUT_OF_HANDLES" Case 12002 Return "ERROR_WINHTTP_TIMEOUT" Case 12004 Return "ERROR_WINHTTP_INTERNAL_ERROR" Case 12005 Return "ERROR_WINHTTP_INVALID_URL" Case 12006 Return "ERROR_WINHTTP_UNRECOGNIZED_SCHEME" Case 12007 Return "ERROR_WINHTTP_NAME_NOT_RESOLVED" Case 12009 Return "ERROR_WINHTTP_INVALID_OPTION" Case 12011 Return "ERROR_WINHTTP_OPTION_NOT_SETTABLE" Case 12012 Return "ERROR_WINHTTP_SHUTDOWN" Case 12015 Return "ERROR_WINHTTP_LOGIN_FAILURE" Case 12017 Return "ERROR_WINHTTP_OPERATION_CANCELLED" Case 12018 Return "ERROR_WINHTTP_INCORRECT_HANDLE_TYPE" Case 12019 Return "ERROR_WINHTTP_INCORRECT_HANDLE_STATE" Case 12029 Return "ERROR_WINHTTP_CANNOT_CONNECT" Case 12030 Return "ERROR_WINHTTP_CONNECTION_ERROR" Case 12032 Return "ERROR_WINHTTP_RESEND_REQUEST" Case 12044 Return "ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED" Case 12150 Return "ERROR_WINHTTP_HEADER_NOT_FOUND" Case 12152 Return "ERROR_WINHTTP_INVALID_SERVER_RESPONSE" Case 12153 Return "ERROR_WINHTTP_INVALID_HEADER" Case 12154 Return "ERROR_WINHTTP_INVALID_QUERY_REQUEST" Case 12155 Return "ERROR_WINHTTP_HEADER_ALREADY_EXISTS" Case 12156 Return "ERROR_WINHTTP_REDIRECT_FAILED" Case 12178 Return "ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR" Case 12166 Return "ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT" Case 12167 Return "ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT" Case 12176 Return "ERROR_WINHTTP_UNHANDLED_SCRIPT_TYPE" Case 12177 Return "ERROR_WINHTTP_SCRIPT_EXECUTION_ERROR" Case 12172 Return "ERROR_WINHTTP_NOT_INITIALIZED" Case 12175 Return "ERROR_WINHTTP_SECURE_FAILURE" Case 12037 Return "ERROR_WINHTTP_SECURE_CERT_DATE_INVALID" Case 12038 Return "ERROR_WINHTTP_SECURE_CERT_CN_INVALID" Case 12045 Return "ERROR_WINHTTP_SECURE_INVALID_CA" Case 12057 Return "ERROR_WINHTTP_SECURE_CERT_REV_FAILED" Case 12157 Return "ERROR_WINHTTP_SECURE_CHANNEL_ERROR" Case 12169 Return "ERROR_WINHTTP_SECURE_INVALID_CERT" Case 12170 Return "ERROR_WINHTTP_SECURE_CERT_REVOKED" Case 12179 Return "ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE" Case 12180 Return "ERROR_WINHTTP_AUTODETECTION_FAILED" Case 12181 Return "ERROR_WINHTTP_HEADER_COUNT_EXCEEDED" Case 12182 Return "ERROR_WINHTTP_HEADER_SIZE_OVERFLOW" Case 12183 Return "ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW" Case 12184 Return "ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW" Case 12185 Return "ERROR_WINHTTP_CLIENT_CERT_NO_PRIVATE_KEY" Case 12186 Return "ERROR_WINHTTP_CLIENT_CERT_NO_ACCESS_PRIVATE_KEY" Case 12187 Return "ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED_PROXY" Case 12188 Return "ERROR_WINHTTP_SECURE_FAILURE_PROXY" Case 12189 Return "ERROR_WINHTTP_RESERVED_189" Case 12190 Return "ERROR_WINHTTP_HTTP_PROTOCOL_MISMATCH" Case 12191 Return "ERROR_WINHTTP_GLOBAL_CALLBACK_FAILED" Case 12192 Return "ERROR_WINHTTP_FEATURE_DISABLED" Return "WINHTTP_ERROR_LAST" Case Else Return SetError(1, 0, "") EndSwitch EndFunc ;==>_WinHTTP_GetName_ErrorCode Func _WinInet_GetName_ErrorCode($nErrorCode = 0) ; By Dao Van Trong - TRONG.LIVE Switch $nErrorCode Case 12000 Return "INTERNET_ERROR_BASE" Case 12001 Return "ERROR_INTERNET_OUT_OF_HANDLES" Case 12002 Return "ERROR_INTERNET_TIMEOUT" Case 12003 Return "ERROR_INTERNET_EXTENDED_ERROR" Case 12004 Return "ERROR_INTERNET_INTERNAL_ERROR" Case 12005 Return "ERROR_INTERNET_INVALID_URL" Case 12006 Return "ERROR_INTERNET_UNRECOGNIZED_SCHEME" Case 12007 Return "ERROR_INTERNET_NAME_NOT_RESOLVED" Case 12008 Return "ERROR_INTERNET_PROTOCOL_NOT_FOUND" Case 12009 Return "ERROR_INTERNET_INVALID_OPTION" Case 12010 Return "ERROR_INTERNET_BAD_OPTION_LENGTH" Case 12011 Return "ERROR_INTERNET_OPTION_NOT_SETTABLE" Case 12012 Return "ERROR_INTERNET_SHUTDOWN" Case 12013 Return "ERROR_INTERNET_INCORRECT_USER_NAME" Case 12014 Return "ERROR_INTERNET_INCORRECT_PASSWORD" Case 12015 Return "ERROR_INTERNET_LOGIN_FAILURE" Case 12016 Return "ERROR_INTERNET_INVALID_OPERATION" Case 12017 Return "ERROR_INTERNET_OPERATION_CANCELLED" Case 12018 Return "ERROR_INTERNET_INCORRECT_HANDLE_TYPE" Case 12019 Return "ERROR_INTERNET_INCORRECT_HANDLE_STATE" Case 12020 Return "ERROR_INTERNET_NOT_PROXY_REQUEST" Case 12021 Return "ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND" Case 12022 Return "ERROR_INTERNET_BAD_REGISTRY_PARAMETER" Case 12023 Return "ERROR_INTERNET_NO_DIRECT_ACCESS" Case 12024 Return "ERROR_INTERNET_NO_CONTEXT" Case 12025 Return "ERROR_INTERNET_NO_CALLBACK" Case 12026 Return "ERROR_INTERNET_REQUEST_PENDING" Case 12027 Return "ERROR_INTERNET_INCORRECT_FORMAT" Case 12028 Return "ERROR_INTERNET_ITEM_NOT_FOUND" Case 12029 Return "ERROR_INTERNET_CANNOT_CONNECT" Case 12030 Return "ERROR_INTERNET_CONNECTION_ABORTED" Case 12031 Return "ERROR_INTERNET_CONNECTION_RESET" Case 12032 Return "ERROR_INTERNET_FORCE_RETRY" Case 12033 Return "ERROR_INTERNET_INVALID_PROXY_REQUEST" Case 12034 Return "ERROR_INTERNET_NEED_UI" Case 12036 Return "ERROR_INTERNET_HANDLE_EXISTS" Case 12037 Return "ERROR_INTERNET_SEC_CERT_DATE_INVALID" Case 12038 Return "ERROR_INTERNET_SEC_CERT_CN_INVALID" Case 12039 Return "ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR" Case 12040 Return "ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR" Case 12041 Return "ERROR_INTERNET_MIXED_SECURITY" Case 12042 Return "ERROR_INTERNET_CHG_POST_IS_NON_SECURE" Case 12043 Return "ERROR_INTERNET_POST_IS_NON_SECURE" Case 12044 Return "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED" Case 12045 Return "ERROR_INTERNET_INVALID_CA" Case 12046 Return "ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP" Case 12047 Return "ERROR_INTERNET_ASYNC_THREAD_FAILED" Case 12048 Return "ERROR_INTERNET_REDIRECT_SCHEME_CHANGE" Case 12049 Return "ERROR_INTERNET_DIALOG_PENDING" Case 12050 Return "ERROR_INTERNET_RETRY_DIALOG" Case 12052 Return "ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR" Case 12053 Return "ERROR_INTERNET_INSERT_CDROM" Case 12054 Return "ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED" Case 12055 Return "ERROR_INTERNET_SEC_CERT_ERRORS" Case 12056 Return "ERROR_INTERNET_SEC_CERT_NO_REV" Case 12057 Return "ERROR_INTERNET_SEC_CERT_REV_FAILED" Case 12060 Return "ERROR_HTTP_HSTS_REDIRECT_REQUIRED" Case 12062 Return "ERROR_INTERNET_SEC_CERT_WEAK_SIGNATURE" Case 12110 Return "ERROR_FTP_TRANSFER_IN_PROGRESS" Case 12111 Return "ERROR_FTP_DROPPED" Case 12112 Return "ERROR_FTP_NO_PASSIVE_MODE" Case 12130 Return "ERROR_GOPHER_PROTOCOL_ERROR" Case 12131 Return "ERROR_GOPHER_NOT_FILE" Case 12132 Return "ERROR_GOPHER_DATA_ERROR" Case 12133 Return "ERROR_GOPHER_END_OF_DATA" Case 12134 Return "ERROR_GOPHER_INVALID_LOCATOR" Case 12135 Return "ERROR_GOPHER_INCORRECT_LOCATOR_TYPE" Case 12136 Return "ERROR_GOPHER_NOT_GOPHER_PLUS" Case 12137 Return "ERROR_GOPHER_ATTRIBUTE_NOT_FOUND" Case 12138 Return "ERROR_GOPHER_UNKNOWN_LOCATOR" Case 12150 Return "ERROR_HTTP_HEADER_NOT_FOUND" Case 12151 Return "ERROR_HTTP_DOWNLEVEL_SERVER" Case 12152 Return "ERROR_HTTP_INVALID_SERVER_RESPONSE" Case 12153 Return "ERROR_HTTP_INVALID_HEADER" Case 12154 Return "ERROR_HTTP_INVALID_QUERY_REQUEST" Case 12155 Return "ERROR_HTTP_HEADER_ALREADY_EXISTS" Case 12156 Return "ERROR_HTTP_REDIRECT_FAILED" Case 12160 Return "ERROR_HTTP_NOT_REDIRECTED" Case 12161 Return "ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION" Case 12162 Return "ERROR_HTTP_COOKIE_DECLINED" Case 12168 Return "ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION" Case 12157 Return "ERROR_INTERNET_SECURITY_CHANNEL_ERROR" Case 12158 Return "ERROR_INTERNET_UNABLE_TO_CACHE_FILE" Case 12159 Return "ERROR_INTERNET_TCPIP_NOT_INSTALLED" Case 12163 Return "ERROR_INTERNET_DISCONNECTED" Return "ERROR_INTERNET_OFFLINE" Case 12164 Return "ERROR_INTERNET_SERVER_UNREACHABLE" Case 12165 Return "ERROR_INTERNET_PROXY_SERVER_UNREACHABLE" Case 12166 Return "ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT" Case 12167 Return "ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT" Case 12169 Return "ERROR_INTERNET_SEC_INVALID_CERT" Case 12170 Return "ERROR_INTERNET_SEC_CERT_REVOKED" Case 12171 Return "ERROR_INTERNET_FAILED_DUETOSECURITYCHECK" Case 12172 Return "ERROR_INTERNET_NOT_INITIALIZED" Case 12173 Return "ERROR_INTERNET_NEED_MSN_SSPI_PKG" Case 12174 Return "ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY" Case 12175 Return "ERROR_INTERNET_DECODING_FAILED" Case 12187 Return "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED_PROXY" Case 12188 Return "ERROR_INTERNET_SECURE_FAILURE_PROXY" Case 12190 Return "ERROR_INTERNET_HTTP_PROTOCOL_MISMATCH" Case 12191 Return "ERROR_INTERNET_GLOBAL_CALLBACK_FAILED" Case 12192 Return "ERROR_INTERNET_FEATURE_DISABLED" Return "INTERNET_ERROR_LAST" Case 12051 Return "ERROR_INTERNET_NO_NEW_CONTAINERS" Case 12058 Return "ERROR_INTERNET_SOURCE_PORT_IN_USE" Case 12059 Return "ERROR_INTERNET_INSECURE_FALLBACK_REQUIRED" Case 12061 Return "ERROR_INTERNET_PROXY_ALERT" Case 12080 Return "ERROR_INTERNET_NO_CM_CONNECTION" Case 12147 Return "ERROR_HTTP_PUSH_STATUS_CODE_NOT_SUPPORTED" Case 12148 Return "ERROR_HTTP_PUSH_RETRY_NOT_SUPPORTED" Case 12149 Return "ERROR_HTTP_PUSH_ENABLE_FAILED" Case 12189 Return "ERROR_INTERNET_DISALLOW_INPRIVATE" Case 12900 Return "INTERNET_INTERNAL_ERROR_BASE" Case 12901 Return "ERROR_INTERNET_INTERNAL_SOCKET_ERROR" Case 12902 Return "ERROR_INTERNET_CONNECTION_AVAILABLE" Case 12903 Return "ERROR_INTERNET_NO_KNOWN_SERVERS" Case 12904 Return "ERROR_INTERNET_PING_FAILED" Case 12905 Return "ERROR_INTERNET_NO_PING_SUPPORT" Case 12906 Return "ERROR_INTERNET_CACHE_SUCCESS" Case 12907 Return "ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION_EX" Case Else Return SetError(1, 0, "") EndSwitch EndFunc ;==>_WinInet_GetName_ErrorCode Func _WinAPI_GetLastError(Const $_iCallerError = @error, Const $_iCallerExtended = @extended) Local $aCall = DllCall("kernel32.dll", "dword", "GetLastError") Return SetError($_iCallerError, $_iCallerExtended, $aCall[0]) EndFunc ;==>_WinAPI_GetLastError Func _WinAPI_CloseHandle($hObject) Local $aCall = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject) If @error Then Return SetError(@error, @extended, False) Return $aCall[0] EndFunc ;==>_WinAPI_CloseHandle Func _WinAPI_MakeQWord($iLoDWORD, $iHiDWORD) Local $tInt64 = DllStructCreate("uint64") Local $tDwords = DllStructCreate("dword;dword", DllStructGetPtr($tInt64)) DllStructSetData($tDwords, 1, $iLoDWORD) DllStructSetData($tDwords, 2, $iHiDWORD) Return DllStructGetData($tInt64, 1) EndFunc ;==>_WinAPI_MakeQWord Func _FTP_Close($hSession) If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0) Local $aCall = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $hSession) If @error Or Not $aCall[0] Then Return SetError(@error + 10, _WinAPI_GetLastError(), 0) If $__g_bCallback_FTP = True Then DllCallbackFree($__g_hCallback_FTP) Return $aCall[0] EndFunc ;==>_FTP_Close Func _FTP_Connect($hInternetSession, $sServerName, $sUsername, $sPassword, $iPassive = 0, $iServerPort = 0, $iService = $INTERNET_SERVICE_FTP, $iFlags = $INTERNET_FLAG_DEFAULT, $fuContext = 0) If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0) If $iPassive == 1 Then $iFlags = BitOR($iFlags, $INTERNET_FLAG_PASSIVE) Local $ai_InternetConnect = DllCall($__g_hWinInet_FTP, 'hwnd', 'InternetConnectW', 'handle', $hInternetSession, 'wstr', $sServerName, 'ushort', $iServerPort, 'wstr', $sUsername, 'wstr', $sPassword, 'dword', $iService, 'dword', $iFlags, 'dword_ptr', $fuContext) If @error Or $ai_InternetConnect[0] = 0 Then Return SetError(@error + 10, _WinAPI_GetLastError(), 0) Return $ai_InternetConnect[0] EndFunc ;==>_FTP_Connect Func _FTP_FileGet($hFTPSession, $sRemoteFile, $sLocalFile, $bFailIfExists = False, $iFlagsAndAttributes = 0, $iFlags = $FTP_TRANSFER_TYPE_UNKNOWN, $iContext = 0) If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0) Local $ai_FTPGetFile = DllCall($__g_hWinInet_FTP, 'bool', 'FtpGetFileW', 'handle', $hFTPSession, 'wstr', $sRemoteFile, 'wstr', $sLocalFile, 'bool', $bFailIfExists, 'dword', $iFlagsAndAttributes, 'dword', $iFlags, 'dword_ptr', $iContext) If @error Or $ai_FTPGetFile[0] = 0 Then Return SetError(@error + 10, _WinAPI_GetLastError(), 0) Return $ai_FTPGetFile[0] EndFunc ;==>_FTP_FileGet Func _FTP_FileGetSize($hFTPSession, $sFileName) If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0) Local $ai_FTPGetSizeHandle = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $hFTPSession, 'wstr', $sFileName, 'dword', $GENERIC_READ, 'dword', $INTERNET_FLAG_NO_CACHE_WRITE + $INTERNET_FLAG_TRANSFER_BINARY, 'dword_ptr', 0) If @error Then Return SetError(@error, @extended, 0) If $ai_FTPGetSizeHandle[0] = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0) Local $ai_FTPGetFileSize = DllCall($__g_hWinInet_FTP, 'dword', 'FtpGetFileSize', 'handle', $ai_FTPGetSizeHandle[0], 'dword*', 0) If @error Then Local $iError = @error Local $iExtended = @extended DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FTPGetSizeHandle[0]) Return SetError($iError + 10, $iExtended, 0) EndIf DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FTPGetSizeHandle[0]) Return _WinAPI_MakeQWord($ai_FTPGetFileSize[0], $ai_FTPGetFileSize[2]) EndFunc ;==>_FTP_FileGetSize Func _FTP_GetLastResponseInfo(ByRef $iError, ByRef $sMessage) Local $ai_LastResponseInfo = DllCall($__g_hWinInet_FTP, 'bool', 'InternetGetLastResponseInfoW', 'dword*', 0, 'wstr', "", 'dword*', 4096) If @error Or $ai_LastResponseInfo[0] = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0) $iError = $ai_LastResponseInfo[1] $sMessage = $ai_LastResponseInfo[2] Return $ai_LastResponseInfo[0] EndFunc ;==>_FTP_GetLastResponseInfo Func _FTP_Open($sAgent, $iAccessType = $INTERNET_OPEN_TYPE_DIRECT, $sProxyName = '', $sProxyBypass = '', $iFlags = 0) If $__g_hWinInet_FTP = -1 Then __FTP_Init() Local $ai_InternetOpen = DllCall($__g_hWinInet_FTP, 'handle', 'InternetOpenW', 'wstr', $sAgent, 'dword', $iAccessType, 'wstr', $sProxyName, 'wstr', $sProxyBypass, 'dword', $iFlags) If @error Or $ai_InternetOpen[0] = 0 Then Return SetError(@error + 10, _WinAPI_GetLastError(), 0) Return $ai_InternetOpen[0] EndFunc ;==>_FTP_Open Func _FTP_ProgressDownload($hFTPSession, $sLocalFile, $sRemoteFile, $hFunctionToCall = 0) If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0) Local $hFile = FileOpen($sLocalFile, $FO_OVERWRITE + $FO_BINARY) If $hFile < 0 Then Return SetError(-1, 0, 0) Local $iLasterror, $iError Local $ai_FtpOpenfile = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $hFTPSession, 'wstr', $sRemoteFile, 'dword', $GENERIC_READ, 'dword', $FTP_TRANSFER_TYPE_BINARY, 'dword_ptr', 0) If @error Or $ai_FtpOpenfile[0] = 0 Then $iError = @error $iLasterror = _WinAPI_GetLastError() FileClose($hFile) Return SetError($iError + 10, $iLasterror, 0) EndIf Local $ai_FTPGetFileSize = DllCall($__g_hWinInet_FTP, 'dword', 'FtpGetFileSize', 'handle', $ai_FtpOpenfile[0], 'dword*', 0) If @error Then $iError = @error DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0]) FileClose($hFile) Return SetError($iError + 20, 0, 0) EndIf If Not IsFunc($hFunctionToCall) Then ProgressOn("FTP Download", "Downloading " & $sLocalFile) Local $iLen = _WinAPI_MakeQWord($ai_FTPGetFileSize[0], $ai_FTPGetFileSize[2]) Local Const $iChunkSize = 256 * 1024 Local $iLast = Mod($iLen, $iChunkSize) Local $iParts = Ceiling($iLen / $iChunkSize) Local $tBuffer = DllStructCreate("byte[" & $iChunkSize & "]") Local $aCall, $ai_FTPread, $iOut, $iRet Local $x = $iChunkSize Local $iDone = 0 For $i = 1 To $iParts If $i = $iParts And $iLast > 0 Then $x = $iLast EndIf $ai_FTPread = DllCall($__g_hWinInet_FTP, 'bool', 'InternetReadFile', 'handle', $ai_FtpOpenfile[0], 'struct*', $tBuffer, 'dword', $x, 'dword*', $iOut) If @error Or $ai_FTPread[0] = 0 Then $iError = @error $iLasterror = _WinAPI_GetLastError() DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0]) FileClose($hFile) If Not IsFunc($hFunctionToCall) Then ProgressOff() Return SetError($iError + 30, $iLasterror, 0) EndIf $iRet = FileWrite($hFile, BinaryMid(DllStructGetData($tBuffer, 1), 1, $ai_FTPread[4])) If Not $iRet Then $iLasterror = _WinAPI_GetLastError() DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0]) FileClose($hFile) FileDelete($sLocalFile) If Not IsFunc($hFunctionToCall) Then ProgressOff() Return SetError(-7, $iLasterror, 0) EndIf $iDone += $ai_FTPread[4] If Not IsFunc($hFunctionToCall) Then ProgressSet(($iDone / $iLen) * 100) Else $iRet = $hFunctionToCall(($iDone / $iLen) * 100) If $iRet <= 0 Then $iLasterror = @error DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0]) FileClose($hFile) FileDelete($sLocalFile) If Not IsFunc($hFunctionToCall) Then ProgressOff() Return SetError(-6, $iLasterror, $iRet) EndIf EndIf Sleep(10) Next FileClose($hFile) If Not IsFunc($hFunctionToCall) Then ProgressOff() $aCall = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0]) If @error Or Not $aCall[0] Then Return SetError(@error + 40, _WinAPI_GetLastError(), 0) EndIf Return 1 EndFunc ;==>_FTP_ProgressDownload Func __FTP_Init() $__g_hWinInet_FTP = DllOpen('wininet.dll') EndFunc ;==>__FTP_Init Func _WinAPI_CreateFileEx($sFilePath, $iCreation, $iAccess = 0, $iShare = 0, $iFlagsAndAttributes = 0, $tSecurity = 0, $hTemplate = 0) Local $aCall = DllCall('kernel32.dll', 'handle', 'CreateFileW', 'wstr', $sFilePath, 'dword', $iAccess, 'dword', $iShare, 'struct*', $tSecurity, 'dword', $iCreation, 'dword', $iFlagsAndAttributes, 'handle', $hTemplate) If @error Then Return SetError(@error, @extended, 0) If $aCall[0] = Ptr(-1) Then Return SetError(10, _WinAPI_GetLastError(), 0) Return $aCall[0] EndFunc ;==>_WinAPI_CreateFileEx Func _WinAPI_Wow64EnableWow64FsRedirection($bEnable) Local $aCall = DllCall('kernel32.dll', 'boolean', 'Wow64EnableWow64FsRedirection', 'boolean', $bEnable) If @error Then Return SetError(@error, @extended, 0) Return $aCall[0] EndFunc ;==>_WinAPI_Wow64EnableWow64FsRedirection Func _StringBetween($sString, $sStart, $sEnd, $iMode = $STR_ENDISSTART, $bCase = False) $sStart = $sStart ? "\Q" & $sStart & "\E" : "\A" If $iMode <> $STR_ENDNOTSTART Then $iMode = $STR_ENDISSTART If $iMode = $STR_ENDISSTART Then $sEnd = $sEnd ? "(?=\Q" & $sEnd & "\E)" : "\z" Else $sEnd = $sEnd ? "\Q" & $sEnd & "\E" : "\z" EndIf If $bCase = Default Then $bCase = False EndIf Local $aRet = StringRegExp($sString, "(?s" & (Not $bCase ? "i" : "") & ")" & $sStart & "(.*?)" & $sEnd, $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(1, 0, 0) Return $aRet EndFunc ;==>_StringBetween Func _WinHttpCloseHandle($hInternet) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpCloseHandle", "handle", $hInternet) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return 1 EndFunc ;==>_WinHttpCloseHandle Func _WinHttpConnect($hSession, $sServerName, $iServerPort = Default) Local $aURL = _WinHttpCrackUrl($sServerName), $iScheme = 0 If @error Then __WinHttpDefault($iServerPort, $INTERNET_DEFAULT_PORT) Else $sServerName = $aURL[2] $iServerPort = $aURL[3] $iScheme = $aURL[1] EndIf Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpConnect", "handle", $hSession, "wstr", $sServerName, "dword", $iServerPort, "dword", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) _WinHttpSetOption($aCall[0], $WINHTTP_OPTION_CONTEXT_VALUE, $iScheme) Return $aCall[0] EndFunc ;==>_WinHttpConnect Func _WinHttpCrackUrl($sURL, $iFlag = Default) __WinHttpDefault($iFlag, $ICU_ESCAPE) Local $tURL_COMPONENTS = DllStructCreate("dword StructSize;" & "ptr SchemeName;" & "dword SchemeNameLength;" & "int Scheme;" & "ptr HostName;" & "dword HostNameLength;" & "word Port;" & "ptr UserName;" & "dword UserNameLength;" & "ptr Password;" & "dword PasswordLength;" & "ptr UrlPath;" & "dword UrlPathLength;" & "ptr ExtraInfo;" & "dword ExtraInfoLength") DllStructSetData($tURL_COMPONENTS, 1, DllStructGetSize($tURL_COMPONENTS)) Local $tBuffers[6] Local $iURLLen = StringLen($sURL) For $i = 0 To 5 $tBuffers[$i] = DllStructCreate("wchar[" & $iURLLen + 1 & "]") Next DllStructSetData($tURL_COMPONENTS, "SchemeNameLength", $iURLLen) DllStructSetData($tURL_COMPONENTS, "SchemeName", DllStructGetPtr($tBuffers[0])) DllStructSetData($tURL_COMPONENTS, "HostNameLength", $iURLLen) DllStructSetData($tURL_COMPONENTS, "HostName", DllStructGetPtr($tBuffers[1])) DllStructSetData($tURL_COMPONENTS, "UserNameLength", $iURLLen) DllStructSetData($tURL_COMPONENTS, "UserName", DllStructGetPtr($tBuffers[2])) DllStructSetData($tURL_COMPONENTS, "PasswordLength", $iURLLen) DllStructSetData($tURL_COMPONENTS, "Password", DllStructGetPtr($tBuffers[3])) DllStructSetData($tURL_COMPONENTS, "UrlPathLength", $iURLLen) DllStructSetData($tURL_COMPONENTS, "UrlPath", DllStructGetPtr($tBuffers[4])) DllStructSetData($tURL_COMPONENTS, "ExtraInfoLength", $iURLLen) DllStructSetData($tURL_COMPONENTS, "ExtraInfo", DllStructGetPtr($tBuffers[5])) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpCrackUrl", "wstr", $sURL, "dword", $iURLLen, "dword", $iFlag, "struct*", $tURL_COMPONENTS) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Local $aRet[8] = [DllStructGetData($tBuffers[0], 1), DllStructGetData($tURL_COMPONENTS, "Scheme"), DllStructGetData($tBuffers[1], 1), DllStructGetData($tURL_COMPONENTS, "Port"), DllStructGetData($tBuffers[2], 1), DllStructGetData($tBuffers[3], 1), DllStructGetData($tBuffers[4], 1), DllStructGetData($tBuffers[5], 1)] Return $aRet EndFunc ;==>_WinHttpCrackUrl Func _WinHttpOpen($sUserAgent = Default, $iAccessType = Default, $sProxyName = Default, $sProxyBypass = Default, $iFlag = Default) __WinHttpDefault($sUserAgent, __WinHttpUA()) __WinHttpDefault($iAccessType, $WINHTTP_ACCESS_TYPE_NO_PROXY) __WinHttpDefault($sProxyName, $WINHTTP_NO_PROXY_NAME) __WinHttpDefault($sProxyBypass, $WINHTTP_NO_PROXY_BYPASS) __WinHttpDefault($iFlag, 0) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpOpen", "wstr", $sUserAgent, "dword", $iAccessType, "wstr", $sProxyName, "wstr", $sProxyBypass, "dword", $iFlag) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) If $iFlag = $WINHTTP_FLAG_ASYNC Then _WinHttpSetOption($aCall[0], $WINHTTP_OPTION_CONTEXT_VALUE, $WINHTTP_FLAG_ASYNC) Return $aCall[0] EndFunc ;==>_WinHttpOpen Func _WinHttpOpenRequest($hConnect, $sVerb = Default, $sObjectName = Default, $sVersion = Default, $sReferrer = Default, $sAcceptTypes = Default, $iFlags = Default) __WinHttpDefault($sVerb, "GET") __WinHttpDefault($sObjectName, "") __WinHttpDefault($sVersion, "HTTP/1.1") __WinHttpDefault($sReferrer, $WINHTTP_NO_REFERER) __WinHttpDefault($iFlags, $WINHTTP_FLAG_ESCAPE_DISABLE) Local $pAcceptTypes If $sAcceptTypes = Default Or Number($sAcceptTypes) = -1 Then $pAcceptTypes = $WINHTTP_DEFAULT_ACCEPT_TYPES Else Local $aTypes = StringSplit($sAcceptTypes, ",", 2) Local $tAcceptTypes = DllStructCreate("ptr[" & UBound($aTypes) + 1 & "]") Local $tType[UBound($aTypes)] For $i = 0 To UBound($aTypes) - 1 $tType[$i] = DllStructCreate("wchar[" & StringLen($aTypes[$i]) + 1 & "]") DllStructSetData($tType[$i], 1, $aTypes[$i]) DllStructSetData($tAcceptTypes, 1, DllStructGetPtr($tType[$i]), $i + 1) Next $pAcceptTypes = DllStructGetPtr($tAcceptTypes) EndIf Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "handle", "WinHttpOpenRequest", "handle", $hConnect, "wstr", StringUpper($sVerb), "wstr", $sObjectName, "wstr", StringUpper($sVersion), "wstr", $sReferrer, "ptr", $pAcceptTypes, "dword", $iFlags) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return $aCall[0] EndFunc ;==>_WinHttpOpenRequest Func _WinHttpQueryAuthSchemes($hRequest, ByRef $iSupportedSchemes, ByRef $iFirstScheme, ByRef $iAuthTarget) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpQueryAuthSchemes", "handle", $hRequest, "dword*", 0, "dword*", 0, "dword*", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) $iSupportedSchemes = $aCall[2] $iFirstScheme = $aCall[3] $iAuthTarget = $aCall[4] Return 1 EndFunc ;==>_WinHttpQueryAuthSchemes Func _WinHttpQueryDataAvailable($hRequest) Local $sReadType = "dword*" If BitAND(_WinHttpQueryOption(_WinHttpQueryOption(_WinHttpQueryOption($hRequest, $WINHTTP_OPTION_PARENT_HANDLE), $WINHTTP_OPTION_PARENT_HANDLE), $WINHTTP_OPTION_CONTEXT_VALUE), $WINHTTP_FLAG_ASYNC) Then $sReadType = "ptr" Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpQueryDataAvailable", "handle", $hRequest, $sReadType, 0) If @error Then Return SetError(1, 0, 0) Return SetExtended($aCall[2], $aCall[0]) EndFunc ;==>_WinHttpQueryDataAvailable Func _WinHttpQueryHeaders($hRequest, $iInfoLevel = Default, $sName = Default, $iIndex = Default) __WinHttpDefault($iInfoLevel, $WINHTTP_QUERY_RAW_HEADERS_CRLF) __WinHttpDefault($sName, $WINHTTP_HEADER_NAME_BY_INDEX) __WinHttpDefault($iIndex, $WINHTTP_NO_HEADER_INDEX) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpQueryHeaders", "handle", $hRequest, "dword", $iInfoLevel, "wstr", $sName, "wstr", "", "dword*", 65536, "dword*", $iIndex) If @error Or Not $aCall[0] Then Return SetError(1, 0, "") Return SetExtended($aCall[6], $aCall[4]) EndFunc ;==>_WinHttpQueryHeaders Func _WinHttpQueryOption($hInternet, $iOption) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpQueryOption", "handle", $hInternet, "dword", $iOption, "ptr", 0, "dword*", 0) If @error Or $aCall[0] Then Return SetError(1, 0, "") Local $iSize = $aCall[4] Local $tBuffer Switch $iOption Case $WINHTTP_OPTION_CONNECTION_INFO, $WINHTTP_OPTION_PASSWORD, $WINHTTP_OPTION_PROXY_PASSWORD, $WINHTTP_OPTION_PROXY_USERNAME, $WINHTTP_OPTION_URL, $WINHTTP_OPTION_USERNAME, $WINHTTP_OPTION_USER_AGENT, $WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT, $WINHTTP_OPTION_PASSPORT_COBRANDING_URL $tBuffer = DllStructCreate("wchar[" & $iSize + 1 & "]") Case $WINHTTP_OPTION_PARENT_HANDLE, $WINHTTP_OPTION_CALLBACK, $WINHTTP_OPTION_SERVER_CERT_CONTEXT $tBuffer = DllStructCreate("ptr") Case $WINHTTP_OPTION_CONNECT_TIMEOUT, $WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH, $WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW, $WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM, $WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH, $WINHTTP_OPTION_CONNECT_RETRIES, $WINHTTP_OPTION_EXTENDED_ERROR, $WINHTTP_OPTION_HANDLE_TYPE, $WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER, $WINHTTP_OPTION_MAX_CONNS_PER_SERVER, $WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS, $WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT, $WINHTTP_OPTION_RECEIVE_TIMEOUT, $WINHTTP_OPTION_RESOLVE_TIMEOUT, $WINHTTP_OPTION_SECURITY_FLAGS, $WINHTTP_OPTION_SECURITY_KEY_BITNESS, $WINHTTP_OPTION_SEND_TIMEOUT $tBuffer = DllStructCreate("int") Case $WINHTTP_OPTION_CONTEXT_VALUE $tBuffer = DllStructCreate("dword_ptr") Case Else $tBuffer = DllStructCreate("byte[" & $iSize & "]") EndSwitch $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpQueryOption", "handle", $hInternet, "dword", $iOption, "struct*", $tBuffer, "dword*", $iSize) If @error Or Not $aCall[0] Then Return SetError(2, 0, "") Return DllStructGetData($tBuffer, 1) EndFunc ;==>_WinHttpQueryOption Func _WinHttpReadData($hRequest, $iMode = Default, $iNumberOfBytesToRead = Default, $pBuffer = Default) __WinHttpDefault($iMode, 0) __WinHttpDefault($iNumberOfBytesToRead, 8192) Local $tBuffer, $vOutOnError = "" If $iMode = 2 Then $vOutOnError = Binary($vOutOnError) Switch $iMode Case 1, 2 If $pBuffer And $pBuffer <> Default Then $tBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]", $pBuffer) Else $tBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]") EndIf Case Else $iMode = 0 If $pBuffer And $pBuffer <> Default Then $tBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]", $pBuffer) Else $tBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]") EndIf EndSwitch Local $sReadType = "dword*" If BitAND(_WinHttpQueryOption(_WinHttpQueryOption(_WinHttpQueryOption($hRequest, $WINHTTP_OPTION_PARENT_HANDLE), $WINHTTP_OPTION_PARENT_HANDLE), $WINHTTP_OPTION_CONTEXT_VALUE), $WINHTTP_FLAG_ASYNC) Then $sReadType = "ptr" Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpReadData", "handle", $hRequest, "struct*", $tBuffer, "dword", $iNumberOfBytesToRead, $sReadType, 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, "") If Not $aCall[4] Then Return SetError(-1, 0, $vOutOnError) If $aCall[4] < $iNumberOfBytesToRead Then Switch $iMode Case 0 Return SetExtended($aCall[4], StringLeft(DllStructGetData($tBuffer, 1), $aCall[4])) Case 1 Return SetExtended($aCall[4], BinaryToString(BinaryMid(DllStructGetData($tBuffer, 1), 1, $aCall[4]), 4)) Case 2 Return SetExtended($aCall[4], BinaryMid(DllStructGetData($tBuffer, 1), 1, $aCall[4])) EndSwitch Else Switch $iMode Case 0, 2 Return SetExtended($aCall[4], DllStructGetData($tBuffer, 1)) Case 1 Return SetExtended($aCall[4], BinaryToString(DllStructGetData($tBuffer, 1), 4)) EndSwitch EndIf EndFunc ;==>_WinHttpReadData Func _WinHttpReceiveResponse($hRequest) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpReceiveResponse", "handle", $hRequest, "ptr", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return 1 EndFunc ;==>_WinHttpReceiveResponse Func _WinHttpSendRequest($hRequest, $sHeaders = Default, $vOptional = Default, $iTotalLength = Default, $iContext = Default) __WinHttpDefault($sHeaders, $WINHTTP_NO_ADDITIONAL_HEADERS) __WinHttpDefault($vOptional, $WINHTTP_NO_REQUEST_DATA) __WinHttpDefault($iTotalLength, 0) __WinHttpDefault($iContext, 0) Local $pOptional = 0, $iOptionalLength = 0 If @NumParams > 2 Then Local $tOptional $iOptionalLength = BinaryLen($vOptional) $tOptional = DllStructCreate("byte[" & $iOptionalLength & "]") If $iOptionalLength Then $pOptional = DllStructGetPtr($tOptional) DllStructSetData($tOptional, 1, $vOptional) EndIf If Not $iTotalLength Or $iTotalLength < $iOptionalLength Then $iTotalLength += $iOptionalLength Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpSendRequest", "handle", $hRequest, "wstr", $sHeaders, "dword", 0, "ptr", $pOptional, "dword", $iOptionalLength, "dword", $iTotalLength, "dword_ptr", $iContext) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return 1 EndFunc ;==>_WinHttpSendRequest Func _WinHttpSetCredentials($hRequest, $iAuthTargets, $iAuthScheme, $sUserName, $sPassword) Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpSetCredentials", "handle", $hRequest, "dword", $iAuthTargets, "dword", $iAuthScheme, "wstr", $sUserName, "wstr", $sPassword, "ptr", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return 1 EndFunc ;==>_WinHttpSetCredentials Func _WinHttpSetOption($hInternet, $iOption, $vSetting, $iSize = Default) If $iSize = Default Then $iSize = -1 If IsBinary($vSetting) Then $iSize = DllStructCreate("byte[" & BinaryLen($vSetting) & "]") DllStructSetData($iSize, 1, $vSetting) $vSetting = $iSize $iSize = DllStructGetSize($vSetting) EndIf Local $sType Switch $iOption Case $WINHTTP_OPTION_AUTOLOGON_POLICY, $WINHTTP_OPTION_CODEPAGE, $WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH, $WINHTTP_OPTION_CONNECT_RETRIES, $WINHTTP_OPTION_CONNECT_TIMEOUT, $WINHTTP_OPTION_DISABLE_FEATURE, $WINHTTP_OPTION_ENABLE_FEATURE, $WINHTTP_OPTION_ENABLETRACING, $WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER, $WINHTTP_OPTION_MAX_CONNS_PER_SERVER, $WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS, $WINHTTP_OPTION_MAX_HTTP_STATUS_CONTINUE, $WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE, $WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE, $WINHTTP_OPTION_READ_BUFFER_SIZE, $WINHTTP_OPTION_RECEIVE_TIMEOUT, $WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT, $WINHTTP_OPTION_REDIRECT_POLICY, $WINHTTP_OPTION_REJECT_USERPWD_IN_URL, $WINHTTP_OPTION_REQUEST_PRIORITY, $WINHTTP_OPTION_RESOLVE_TIMEOUT, $WINHTTP_OPTION_SECURE_PROTOCOLS, $WINHTTP_OPTION_SECURITY_FLAGS, $WINHTTP_OPTION_SECURITY_KEY_BITNESS, $WINHTTP_OPTION_SEND_TIMEOUT, $WINHTTP_OPTION_SPN, $WINHTTP_OPTION_USE_GLOBAL_SERVER_CREDENTIALS, $WINHTTP_OPTION_WORKER_THREAD_COUNT, $WINHTTP_OPTION_WRITE_BUFFER_SIZE, $WINHTTP_OPTION_DECOMPRESSION, $WINHTTP_OPTION_UNSAFE_HEADER_PARSING $sType = "dword*" $iSize = 4 Case $WINHTTP_OPTION_CALLBACK, $WINHTTP_OPTION_PASSPORT_SIGN_OUT $sType = "ptr*" $iSize = 4 If @AutoItX64 Then $iSize = 8 If Not IsPtr($vSetting) Then Return SetError(3, 0, 0) Case $WINHTTP_OPTION_CONTEXT_VALUE $sType = "dword_ptr*" $iSize = 4 If @AutoItX64 Then $iSize = 8 Case $WINHTTP_OPTION_PASSWORD, $WINHTTP_OPTION_PROXY_PASSWORD, $WINHTTP_OPTION_PROXY_USERNAME, $WINHTTP_OPTION_USER_AGENT, $WINHTTP_OPTION_USERNAME $sType = "wstr" If (IsDllStruct($vSetting) Or IsPtr($vSetting)) Then Return SetError(3, 0, 0) If $iSize < 1 Then $iSize = StringLen($vSetting) Case $WINHTTP_OPTION_CLIENT_CERT_CONTEXT, $WINHTTP_OPTION_GLOBAL_PROXY_CREDS, $WINHTTP_OPTION_GLOBAL_SERVER_CREDS, $WINHTTP_OPTION_HTTP_VERSION, $WINHTTP_OPTION_PROXY $sType = "ptr" If Not (IsDllStruct($vSetting) Or IsPtr($vSetting)) Then Return SetError(3, 0, 0) Case Else Return SetError(1, 0, 0) EndSwitch If $iSize < 1 Then If IsDllStruct($vSetting) Then $iSize = DllStructGetSize($vSetting) Else Return SetError(2, 0, 0) EndIf EndIf Local $aCall If IsDllStruct($vSetting) Then $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpSetOption", "handle", $hInternet, "dword", $iOption, $sType, DllStructGetPtr($vSetting), "dword", $iSize) Else $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpSetOption", "handle", $hInternet, "dword", $iOption, $sType, $vSetting, "dword", $iSize) EndIf If @error Or Not $aCall[0] Then Return SetError(4, 0, 0) Return 1 EndFunc ;==>_WinHttpSetOption Func _WinHttpSimpleFormFill_SetUploadCallback($vCallback = Default, $iNumChunks = 100) If $iNumChunks <= 0 Then $iNumChunks = 100 Local Static $vFunc = Default, $iParts = $iNumChunks If $vCallback <> Default Then $vFunc = $vCallback $iParts = Ceiling($iNumChunks) ElseIf $vCallback = 0 Then $vFunc = Default $iParts = 1 EndIf Local $aOut[2] = [$vFunc, $iParts] Return $aOut EndFunc ;==>_WinHttpSimpleFormFill_SetUploadCallback Func _WinHttpSimpleReadData($hRequest, $iMode = Default) If $iMode = Default Then $iMode = 0 If __WinHttpCharSet(_WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_CONTENT_TYPE)) = 65001 Then $iMode = 1 Else __WinHttpDefault($iMode, 0) EndIf If $iMode > 2 Or $iMode < 0 Then Return SetError(1, 0, '') Local $vData = Binary('') If _WinHttpQueryDataAvailable($hRequest) Then Do $vData &= _WinHttpReadData($hRequest, 2) Until @error Switch $iMode Case 0 Return BinaryToString($vData) Case 1 Return BinaryToString($vData, 4) Case Else Return $vData EndSwitch EndIf Return SetError(2, 0, $vData) EndFunc ;==>_WinHttpSimpleReadData Func _WinHttpSimpleRequest($hConnect, $sType = Default, $sPath = Default, $sReferrer = Default, $sDta = Default, $sHeader = Default, $fGetHeaders = Default, $iMode = Default, $sCredName = Default, $sCredPass = Default) __WinHttpDefault($sType, "GET") __WinHttpDefault($sPath, "") __WinHttpDefault($sReferrer, $WINHTTP_NO_REFERER) __WinHttpDefault($sDta, $WINHTTP_NO_REQUEST_DATA) __WinHttpDefault($sHeader, $WINHTTP_NO_ADDITIONAL_HEADERS) __WinHttpDefault($fGetHeaders, False) __WinHttpDefault($iMode, Default) __WinHttpDefault($sCredName, "") __WinHttpDefault($sCredPass, "") If $iMode > 2 Or $iMode < 0 Then Return SetError(4, 0, 0) Local $hRequest = _WinHttpSimpleSendRequest($hConnect, $sType, $sPath, $sReferrer, $sDta, $sHeader) If @error Then Return SetError(@error, 0, 0) __WinHttpSetCredentials($hRequest, $sHeader, $sDta, $sCredName, $sCredPass) Local $iExtended = _WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_STATUS_CODE) If $fGetHeaders Then Local $aData[3] = [_WinHttpQueryHeaders($hRequest), _WinHttpSimpleReadData($hRequest, $iMode), _WinHttpQueryOption($hRequest, $WINHTTP_OPTION_URL)] _WinHttpCloseHandle($hRequest) Return SetExtended($iExtended, $aData) EndIf Local $sOutData = _WinHttpSimpleReadData($hRequest, $iMode) _WinHttpCloseHandle($hRequest) Return SetExtended($iExtended, $sOutData) EndFunc ;==>_WinHttpSimpleRequest Func _WinHttpSimpleSendRequest($hConnect, $sType = Default, $sPath = Default, $sReferrer = Default, $sDta = Default, $sHeader = Default) __WinHttpDefault($sType, "GET") __WinHttpDefault($sPath, "") __WinHttpDefault($sReferrer, $WINHTTP_NO_REFERER) __WinHttpDefault($sDta, $WINHTTP_NO_REQUEST_DATA) __WinHttpDefault($sHeader, $WINHTTP_NO_ADDITIONAL_HEADERS) Local $hRequest = _WinHttpOpenRequest($hConnect, $sType, $sPath, Default, $sReferrer) If Not $hRequest Then Return SetError(1, @error, 0) If $sType = "POST" And $sHeader = $WINHTTP_NO_ADDITIONAL_HEADERS Then $sHeader = "Content-Type: application/x-www-form-urlencoded" & @CRLF _WinHttpSetOption($hRequest, $WINHTTP_OPTION_DECOMPRESSION, $WINHTTP_DECOMPRESSION_FLAG_ALL) _WinHttpSetOption($hRequest, $WINHTTP_OPTION_UNSAFE_HEADER_PARSING, 1) _WinHttpSendRequest($hRequest, $sHeader, $sDta) If @error Then Return SetError(2, 0 * _WinHttpCloseHandle($hRequest), 0) _WinHttpReceiveResponse($hRequest) If @error Then Return SetError(3, 0 * _WinHttpCloseHandle($hRequest), 0) Return $hRequest EndFunc ;==>_WinHttpSimpleSendRequest Func _WinHttpSimpleSendSSLRequest($hConnect, $sType = Default, $sPath = Default, $sReferrer = Default, $sDta = Default, $sHeader = Default, $iIgnoreAllCertErrors = 0) __WinHttpDefault($sType, "GET") __WinHttpDefault($sPath, "") __WinHttpDefault($sReferrer, $WINHTTP_NO_REFERER) __WinHttpDefault($sDta, $WINHTTP_NO_REQUEST_DATA) __WinHttpDefault($sHeader, $WINHTTP_NO_ADDITIONAL_HEADERS) Local $hRequest = _WinHttpOpenRequest($hConnect, $sType, $sPath, Default, $sReferrer, Default, BitOR($WINHTTP_FLAG_SECURE, $WINHTTP_FLAG_ESCAPE_DISABLE)) If Not $hRequest Then Return SetError(1, @error, 0) If $iIgnoreAllCertErrors Then _WinHttpSetOption($hRequest, $WINHTTP_OPTION_SECURITY_FLAGS, BitOR($SECURITY_FLAG_IGNORE_UNKNOWN_CA, $SECURITY_FLAG_IGNORE_CERT_DATE_INVALID, $SECURITY_FLAG_IGNORE_CERT_CN_INVALID, $SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE)) If $sType = "POST" And $sHeader = $WINHTTP_NO_ADDITIONAL_HEADERS Then $sHeader = "Content-Type: application/x-www-form-urlencoded" & @CRLF _WinHttpSetOption($hRequest, $WINHTTP_OPTION_DECOMPRESSION, $WINHTTP_DECOMPRESSION_FLAG_ALL) _WinHttpSetOption($hRequest, $WINHTTP_OPTION_UNSAFE_HEADER_PARSING, 1) _WinHttpSendRequest($hRequest, $sHeader, $sDta) If @error Then Return SetError(2, 0 * _WinHttpCloseHandle($hRequest), 0) _WinHttpReceiveResponse($hRequest) If @error Then Return SetError(3, 0 * _WinHttpCloseHandle($hRequest), 0) Return $hRequest EndFunc ;==>_WinHttpSimpleSendSSLRequest Func _WinHttpSimpleSSLRequest($hConnect, $sType = Default, $sPath = Default, $sReferrer = Default, $sDta = Default, $sHeader = Default, $fGetHeaders = Default, $iMode = Default, $sCredName = Default, $sCredPass = Default, $iIgnoreCertErrors = 0) __WinHttpDefault($sType, "GET") __WinHttpDefault($sPath, "") __WinHttpDefault($sReferrer, $WINHTTP_NO_REFERER) __WinHttpDefault($sDta, $WINHTTP_NO_REQUEST_DATA) __WinHttpDefault($sHeader, $WINHTTP_NO_ADDITIONAL_HEADERS) __WinHttpDefault($fGetHeaders, False) __WinHttpDefault($iMode, Default) __WinHttpDefault($sCredName, "") __WinHttpDefault($sCredPass, "") If $iMode > 2 Or $iMode < 0 Then Return SetError(4, 0, 0) Local $hRequest = _WinHttpSimpleSendSSLRequest($hConnect, $sType, $sPath, $sReferrer, $sDta, $sHeader, $iIgnoreCertErrors) If @error Then Return SetError(@error, 0, 0) __WinHttpSetCredentials($hRequest, $sHeader, $sDta, $sCredName, $sCredPass) If $fGetHeaders Then Local $aData[3] = [_WinHttpQueryHeaders($hRequest), _WinHttpSimpleReadData($hRequest, $iMode), _WinHttpQueryOption($hRequest, $WINHTTP_OPTION_URL)] _WinHttpCloseHandle($hRequest) Return $aData EndIf Local $sOutData = _WinHttpSimpleReadData($hRequest, $iMode) _WinHttpCloseHandle($hRequest) Return $sOutData EndFunc ;==>_WinHttpSimpleSSLRequest Func _WinHttpWriteData($hRequest, $vData, $iMode = Default) __WinHttpDefault($iMode, 0) Local $iNumberOfBytesToWrite, $tData If $iMode = 1 Then $iNumberOfBytesToWrite = BinaryLen($vData) $tData = DllStructCreate("byte[" & $iNumberOfBytesToWrite & "]") DllStructSetData($tData, 1, $vData) ElseIf IsDllStruct($vData) Then $iNumberOfBytesToWrite = DllStructGetSize($vData) $tData = $vData Else $iNumberOfBytesToWrite = StringLen($vData) $tData = DllStructCreate("char[" & $iNumberOfBytesToWrite + 1 & "]") DllStructSetData($tData, 1, $vData) EndIf Local $aCall = DllCall($hWINHTTPDLL__WINHTTP, "bool", "WinHttpWriteData", "handle", $hRequest, "struct*", $tData, "dword", $iNumberOfBytesToWrite, "dword*", 0) If @error Or Not $aCall[0] Then Return SetError(1, 0, 0) Return SetExtended($aCall[4], 1) EndFunc ;==>_WinHttpWriteData Func __WinHttpCharSet($sContentType) Local $aContentType = StringRegExp($sContentType, "(?i).*?\Qcharset=\E(?U)([^ ]+)(;| |\Z)", 2) If Not @error Then $sContentType = $aContentType[1] If StringLeft($sContentType, 2) = "cp" Then Return Int(StringTrimLeft($sContentType, 2)) If $sContentType = "utf-8" Then Return 65001 EndFunc ;==>__WinHttpCharSet Func __WinHttpSetCredentials($hRequest, $sHeaders = "", $sOptional = "", $sCredName = "", $sCredPass = "", $iFormFill = 0) If $sCredName And $sCredPass Then Local $iStatusCode = _WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_STATUS_CODE) If $iStatusCode = $HTTP_STATUS_DENIED Or $iStatusCode = $HTTP_STATUS_PROXY_AUTH_REQ Then Local $iSupportedSchemes, $iFirstScheme, $iAuthTarget If _WinHttpQueryAuthSchemes($hRequest, $iSupportedSchemes, $iFirstScheme, $iAuthTarget) Then If $iFirstScheme = $WINHTTP_AUTH_SCHEME_PASSPORT And $iStatusCode = $HTTP_STATUS_PROXY_AUTH_REQ Then _WinHttpSetOption($hRequest, $WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH, $WINHTTP_ENABLE_PASSPORT_AUTH) _WinHttpSetOption($hRequest, $WINHTTP_OPTION_PROXY_USERNAME, $sCredName) _WinHttpSetOption($hRequest, $WINHTTP_OPTION_PROXY_PASSWORD, $sCredPass) Else _WinHttpSetCredentials($hRequest, $iAuthTarget, $iFirstScheme, $sCredName, $sCredPass) EndIf If $iFormFill Then __WinHttpFormUpload($hRequest, $sHeaders, $sOptional) Else _WinHttpSendRequest($hRequest, $sHeaders, $sOptional) EndIf _WinHttpReceiveResponse($hRequest) EndIf EndIf EndIf EndFunc ;==>__WinHttpSetCredentials Func __WinHttpFormUpload($hRequest, $sHeaders, $sData) Local $aClbk = _WinHttpSimpleFormFill_SetUploadCallback() If $aClbk[0] <> Default Then Local $iSize = StringLen($sData), $iChunk = Floor($iSize / $aClbk[1]), $iRest = $iSize - ($aClbk[1] - 1) * $iChunk, $iCurCh = $iChunk _WinHttpSendRequest($hRequest, Default, Default, $iSize) For $i = 1 To $aClbk[1] If $i = $aClbk[1] Then $iCurCh = $iRest _WinHttpWriteData($hRequest, StringMid($sData, 1 + $iChunk * ($i - 1), $iCurCh)) Call($aClbk[0], Floor($i * 100 / $aClbk[1])) Next Else _WinHttpSendRequest($hRequest, Default, $sData) EndIf EndFunc ;==>__WinHttpFormUpload Func __WinHttpDefault(ByRef $vInput, $vOutput) If $vInput = Default Or Number($vInput) = -1 Then $vInput = $vOutput EndFunc ;==>__WinHttpDefault Func __WinHttpUA() Local Static $sUA = "Mozilla/5.0 " & __WinHttpSysInfo() & " WinHttp/" & __WinHttpVer() & " (WinHTTP/5.1) like Gecko" Return $sUA EndFunc ;==>__WinHttpUA Func __WinHttpSysInfo() Local $sDta = FileGetVersion("kernel32.dll") $sDta = "(Windows NT " & StringLeft($sDta, StringInStr($sDta, ".", 1, 2) - 1) If StringInStr(@OSArch, "64") And Not @AutoItX64 Then $sDta &= "; WOW64" $sDta &= ")" Return $sDta EndFunc ;==>__WinHttpSysInfo Func __WinHttpVer() Return "1.6.4.1" EndFunc ;==>__WinHttpVer  Edited January 19, 2023 by Trong Update version AutoBert 1 Regards,  Link to comment Share on other sites More sharing options...
AutoBert Posted January 16, 2023 Share Posted January 16, 2023 (edited) Works excelent, but Tidy didn't like it: Quote [Window Title] Tidy your AutoIt3 scripts. [Main Instruction] Tidy your AutoIt3 scripts. funktioniert nicht mehr [Content] Das Programm wird aufgrund eines Problems nicht richtig ausgeführt. Das Programm wird geschlossen und Sie werden benachrichtigt, wenn eine Lösung verfügbar ist. [Programm schließen] Edit: _FTP_Download don't work + FTP Download: ftp://files.trong.live/prv/test.jpg -> C:\Users\(len)Bert\AutoIt\Downloaded\Vip\testB.jpg -File Size: Bytes - Downloading /prv/test.jpg ( Bytes) ... @@ Debug(255) : $iErr = >Error code: 10 + OK ! - Move (1) C:\Users\(LEN)B~1\AppData\Local\Temp\~download-20230116195501-96100967.tmp >TO> C:\Users\(len)Bert\AutoIt\Downloaded\Vip\testB.jpg > Move OK + Save file to: C:\Users\(len)Bert\AutoIt\Downloaded\Vip\testB.jpg OK !  Edited January 16, 2023 by AutoBert Link to comment Share on other sites More sharing options...
noellarkin Posted January 16, 2023 Share Posted January 16, 2023 23 hours ago, VIP said: Standalone code: Isn't it a better idea to just attach the Au3 file for a long UDF? Danp2 1 Link to comment Share on other sites More sharing options...
AutoBert Posted January 16, 2023 Share Posted January 16, 2023 (edited) @noellarkinIf you want to use it as a udf just extract lines 33 to 48 to a new file insert #include-once #include <Autoti.au3> and save old Autoti.au3 (yet without old lines 33 - 48) Edited January 16, 2023 by AutoBert Link to comment Share on other sites More sharing options...
Trong Posted January 16, 2023 Author Share Posted January 16, 2023 46 minutes ago, noellarkin said: Isn't it a better idea to just attach the Au3 file for a long UDF? AutoIT is continuously upgraded, the functions and codes used at Include may have been removed or changed. Putting the standalone script takes that worry away, and you can run the script right away without any additional files! I was having a hard time running an example of Json_UDF I didn't understand what version to download, and I left the JSON function out of my script, and used _StringBetween() SO CRAZY! Â Regards, Â Link to comment Share on other sites More sharing options...
Trong Posted January 19, 2023 Author Share Posted January 19, 2023 On 17.1.2023 at 01:05, AutoBert said: Edit: _FTP_Download don't work + FTP Download: ftp://files.trong.live/prv/test.jpg -> C:\Users\(len)Bert\AutoIt\Downloaded\Vip\testB.jpg -File Size: Bytes - Downloading /prv/test.jpg ( Bytes) ... @@ Debug(255) : $iErr = >Error code: 10 + OK ! - Move (1) C:\Users\(LEN)B~1\AppData\Local\Temp\~download-20230116195501-96100967.tmp >TO> C:\Users\(len)Bert\AutoIt\Downloaded\Vip\testB.jpg > Move OK + Save file to: C:\Users\(len)Bert\AutoIt\Downloaded\Vip\testB.jpg OK !  Error 10 is connect error! With my example server, if you do something suspicious, the connection will be blocked. Please test with your server Regards,  Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now