Global Const $iTCP_PORT = 80
Global Const $iTCP_MAXBYTES = 256 * 1024
Global Const $sTCP_USERAGENT = 'Mozilla/5.0 (Windows NT 6.1; rv:27.0) Gecko/20100101 Firefox/27.0'
Global Const $sTCP_HTTP_VER = '1.1'
TCPStartup()
Opt('TCPTimeOut', 5000)
$sURL = 'https://www.autoitscript.com/files/autoit3/autoit-v3-setup.exe'
$sFile = @DesktopDir & '\autoit-v3-setup.exe'
$aSplit = __TCP_SplitURL($sURL)
$sHeader = __TCP_GetHeader($aSplit[0], $aSplit[1], $aSplit[2])
$sLocation = __TCP_GetTagHeader($sHeader, 'Location')
$sLength = InetGetSize($sLocation) ;Number(__TCP_GetTagHeader($sHeader, 'Content-Length'))
If $sLocation <> '' Then
ConsoleWrite('New Location: ' & $sLocation & @LF)
$aSplit = __TCP_SplitURL($sLocation)
$sLength = InetGetSize($sLocation)
EndIf
__TCP_GetFile($aSplit[0], $aSplit[1], $aSplit[2], $sFile)
If $sLength = FileGetSize($sFile) Then
MsgBox(64, 'Title', 'File downloaded')
Else
MsgBox(48, 'Title', 'File NOT downloaded')
EndIf
TCPShutdown()
Func __TCP_Connect($sHost, $iPort = '')
If Not StringIsDigit($iPort) Or $iPort = '' Then
$iPort = $iTCP_PORT
EndIf
Local $sName_To_IP = TCPNameToIP($sHost)
Local $iSocket = TCPConnect($sName_To_IP, $iPort)
If $iSocket = -1 Then
TCPCloseSocket($iSocket)
Return SetError(1, 0, '')
EndIf
Return $iSocket
EndFunc
Func __TCP_Request($sHost, $sPage, $iSocket, $sRequest = 'GET')
Local $sCommand = ''
$sCommand &= $sRequest & ' ' & $sPage & ' HTTP/' & $sTCP_HTTP_VER & @CRLF
$sCommand &= 'Host: ' & $sHost & @CRLF
$sCommand &= 'User-Agent: ' & $sTCP_USERAGENT & @CRLF
$sCommand &= 'Connection: close' & @CRLF & @CRLF
Local $iBytesSent = TCPSend($iSocket, $sCommand)
Return SetError(Int($iBytesSent = 0), @error, $iBytesSent)
EndFunc
Func __TCP_GetFile($sHost, $sPage, $iPort, $sFile)
Local $sData
$iSocket = __TCP_Connect($sHost, $iPort)
If @error Then
Return SetError(1, 0, '')
EndIf
__TCP_Request($sHost, $sPage, $iSocket, 'GET')
If @error Then
TCPCloseSocket($iSocket)
Return SetError(2, 0, '')
EndIf
$hFile = FileOpen($sFile, 18)
While 1
$sData = TCPRecv($iSocket, $iTCP_MAXBYTES, 1)
If @error <> 0 Then
ExitLoop
EndIf
FileWrite($hFile, $sData)
WEnd
FileClose($hFile)
TCPCloseSocket($iSocket)
EndFunc
Func __TCP_GetHeader($sHost, $sPage, $iPort, $iSocket = 0)
Local $sData
If $iSocket = 0 Then
$iSocket = __TCP_Connect($sHost, $iPort)
If @error Then
Return SetError(1, 0, '')
EndIf
__TCP_Request($sHost, $sPage, $iSocket, 'HEAD')
If @error Then
TCPCloseSocket($iSocket)
Return SetError(2, 0, '')
EndIf
EndIf
While 1
$sData &= TCPRecv($iSocket, $iTCP_MAXBYTES)
If @error <> 0 Then
ExitLoop
EndIf
WEnd
TCPCloseSocket($iSocket)
Return $sData
EndFunc
Func __TCP_GetTagHeader($sHeader, $sTag)
Local $aRet = StringRegExp($sHeader, '(?i)' & $sTag & ': ([^\r\n]+)', 3)
If @error Or Not IsArray($aRet) Then
Return SetError(1, 0, '')
EndIf
Return $aRet[0]
EndFunc
Func __TCP_SplitURL($sURL)
Local $aHostPage[3]
Local Const $URL_PART_HOSTNAME = 2, $URL_PART_PASSWORD = 4, $URL_PART_PORT = 5, $URL_PART_QUERY = 6, $URL_PART_SCHEME = 1, $URL_PART_USERNAME = 3
Local $sScheme = __TCP_UrlGetPart($sURL, $URL_PART_SCHEME)
Local $sHost = __TCP_UrlGetPart($sURL, $URL_PART_HOSTNAME)
Local $sPort = __TCP_UrlGetPart($sURL, $URL_PART_PORT)
$aHostPage[0] = $sHost
$aHostPage[1] = '/' & StringRegExpReplace($sURL, '(?is)^' & $sScheme & '://.*?\Q' & $sHost & '\E(?::' & $sPort & ')?(?:/+)?(.*?)$', '\1')
$aHostPage[2] = $sPort
If Not $sPort Then
$aHostPage[2] = $iTCP_PORT
EndIf
Return $aHostPage
EndFunc
Func __TCP_UrlGetPart($sUrl, $iPart)
Local $Ret = DllCall('shlwapi.dll', 'long', 'UrlGetPartW', 'wstr', $sUrl, 'wstr', '', 'dword*', 4096, 'dword', $iPart, 'dword', 0)
If @error Then Return SetError(@error, @extended, '')
If $Ret[0] Then Return SetError(10, $Ret[0], '')
Return $Ret[2]
EndFunc