#include-once
#include "WinHTTPConstants.au3"

DllOpen("winhttp.dll")



; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpAddRequestHeaders
; Description ...: Adds one or more HTTP request headers to the HTTP request handle.
; Syntax.........: _WinHttpAddRequestHeaders ($hRequest, $sHeaders [, $iModifiers])
; Parameters ....: $hRequest - Handle returned by _WinHttpOpenRequest function.
;                  $sHeader - String that contains the header(s) to append to the request.
;                  $iModifier - Contains the flags used to modify the semantics of this function. Default is $WINHTTP_ADDREQ_FLAG_ADD_IF_NEW.
; Return values .: Success - Returns 1 and Sets
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: In case of multiple additions at once, must use @CRLF to separate each $hRequest and responded $sHeaders and $iModifiers.
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384087(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpAddRequestHeaders($hRequest, $sHeader, $iModifier = $WINHTTP_ADDREQ_FLAG_ADD_IF_NEW)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpAddRequestHeaders", _
			"hwnd", $hRequest, _
			"wstr", $sHeader, _
			"dword", -1, _
			"dword", $iModifier)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpAddRequestHeaders




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpBinaryConcat
; Description ...: Concatenates two binary data returned by _WinHttpReadData() in binary mode.
; Syntax.........: _WinHttpBinaryConcat(ByRef $bBinary1, ByRef $bBinary2)
; Parameters ....: $bBinary1 - Binary data that is to be concatenated.
;                  $bBinary2 - Binary data to concat.
; Return values .: Success - Returns concatenated binary data.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - Invalid input.
; Author ........: ProgAndy
; Modified.......: trancexx
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpBinaryConcat(ByRef $bBinary1, ByRef $bBinary2)

	Switch IsBinary($bBinary1) + 2 * IsBinary($bBinary2)
		Case 0
			Return SetError(1, 0, 0)
		Case 1
			Return SetError(0, 0, $bBinary1)
		Case 2
			Return SetError(0, 0, $bBinary2)
	EndSwitch

	Local $tAuxiliary = DllStructCreate("byte[" & BinaryLen($bBinary1) & "];byte[" & BinaryLen($bBinary2) & "]")
	DllStructSetData($tAuxiliary, 1, $bBinary1)
	DllStructSetData($tAuxiliary, 2, $bBinary2)

	Local $tOutput = DllStructCreate("byte[" & DllStructGetSize($tAuxiliary) & "]", DllStructGetPtr($tAuxiliary))

	Return SetError(0, 0, DllStructGetData($tOutput, 1))

EndFunc   ;==>_WinHttpBinaryConcat




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpCheckPlatform
; Description ...: Determines whether the current platform is supported by this version of Microsoft Windows HTTP Services (WinHTTP).
; Syntax.........: _WinHttpCheckPlatform()
; Parameters ....: None
; Return values .: Success - Returns 1 if current platform is supported
;                          - Returns 0 if current platform is not supported
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384089(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpCheckPlatform()

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpCheckPlatform")

	If @error Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, $a_iCall[0])

EndFunc   ;==>_WinHttpCheckPlatform




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpCloseHandle
; Description ...: Closes a single handle.
; Syntax.........: _WinHttpCloseHandle($hInternet)
; Parameters ....: $hInternet - Valid handle to be closed.
; Return values .: Success - Returns 1
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384090(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpCloseHandle($hInternet)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpCloseHandle", "hwnd", $hInternet)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpCloseHandle




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpConnect
; Description ...: Specifies the initial target server of an HTTP request and returns connection handle to an HTTP session for that initial target.
; Syntax.........: _WinHttpConnect($hSession, $sServerName [, $iServerPort])
; Parameters ....: $hSession - Valid WinHTTP session handle returned by a previous call to WinHttpOpen.
;                  $sServerName - String that contains the host name of an HTTP server.
;                  $iServerPort - Integer that specifies the TCP/IP port on the server to which a connection is made (default is $INTERNET_DEFAULT_PORT)
; Return values .: Success - Returns a valid connection handle to the HTTP session
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: $nServerPort can be defined via global constants $INTERNET_DEFAULT_PORT, $INTERNET_DEFAULT_HTTP_PORT or $INTERNET_DEFAULT_HTTPS_PORT
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384091(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpConnect($hSession, $sServerName, $iServerPort = $INTERNET_DEFAULT_PORT)

	Local $a_hCall = DllCall("winhttp.dll", "hwnd", "WinHttpConnect", _
			"hwnd", $hSession, _
			"wstr", $sServerName, _
			"dword", $iServerPort, _
			"dword", 0)

	If @error Or Not $a_hCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, $a_hCall[0])

EndFunc   ;==>_WinHttpConnect




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpCrackUrl
; Description ...: Separates a URL into its component parts such as host name and path.
; Syntax.........: _WinHttpCrackUrl($sURL [, $iFlag])
; Parameters ....: $sURL - String that contains the canonical URL to separate.
;                  $dwFlag - Flag that control the operation. Default is $ICU_ESCAPE
; Return values .: Success - Returns array which first element [0] is scheme name,
;                                        second element [1] is internet protocol scheme.,
;                                        third element [2] is host name,
;                                        fourth element [3] is port number,
;                                        fifth element [4] is user name,
;                                        sixth element [5] is password,
;                                        seventh element [6] is URL path,
;                                        eighth element [7] is extra information.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: ProgAndy
; Modified.......: trancexx
; Remarks .......: $dwFlag is defined in WinHTTPConstants.au3 and can be:
;                  | $ICU_DECODE - Converts characters that are "escape encoded" (%xx) to their non-escaped form.
;                  | $ICU_ESCAPE - Escapes certain characters to their escape sequences (%xx).
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384092(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpCrackUrl($sURL, $iFlag = $ICU_ESCAPE)

	Local $tURL_COMPONENTS = DllStructCreate("dword StructSize;" & _
			"ptr SchemeName;" & _
			"dword SchemeNameLength;" & _
			"int Scheme;" & _
			"ptr HostName;" & _
			"dword HostNameLength;" & _
			"ushort 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 $a_iCall = DllCall("winhttp.dll", "int", "WinHttpCrackUrl", _
			"wstr", $sURL, _
			"dword", $iURLLen, _
			"dword", $iFlag, _
			"ptr", DllStructGetPtr($tURL_COMPONENTS))

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Local $a_Ret[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 SetError(0, 0, $a_Ret)

EndFunc   ;==>_WinHttpCrackUrl




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpCreateUrl
; Description ...: Creates a URL from array of components such as the host name and path.
; Syntax.........: _WinHttpCreateUrl($aURLArray)
; Parameters ....: $sURL - String that contains the canonical URL to separate.
; Return values .: Success - Returns created URL
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - Invalid input.
;                  |2 - Initial DllCall failed.
;                  |3 - Main DllCall failed
; Author ........: ProgAndy
; Modified.......: trancexx
; Remarks .......: Input is one dimensional 8 elements in size array:
;                                        first element [0] is scheme name,
;                                        second element [1] is internet protocol scheme.,
;                                        third element [2] is host name,
;                                        fourth element [3] is port number,
;                                        fifth element [4] is user name,
;                                        sixth element [5] is password,
;                                        seventh element [6] is URL path,
;                                        eighth element [7] is extra information.
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384093(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpCreateUrl($aURLArray)

	If UBound($aURLArray) - 8 Then
		Return SetError(1, 0, "")
	EndIf

	Local $tURL_COMPONENTS = DllStructCreate("dword StructSize;" & _
			"ptr SchemeName;" & _
			"dword SchemeNameLength;" & _
			"int Scheme;" & _
			"ptr HostName;" & _
			"dword HostNameLength;" & _
			"ushort 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][2]

	$tBuffers[0][1] = StringLen($aURLArray[0])
	If $tBuffers[0][1] Then
		$tBuffers[0][0] = DllStructCreate("wchar[" & $tBuffers[0][1] + 1 & "]")
		DllStructSetData($tBuffers[0][0], 1, $aURLArray[0])
	EndIf

	$tBuffers[1][1] = StringLen($aURLArray[2])
	If $tBuffers[1][1] Then
		$tBuffers[1][0] = DllStructCreate("wchar[" & $tBuffers[1][1] + 1 & "]")
		DllStructSetData($tBuffers[1][0], 1, $aURLArray[2])
	EndIf

	$tBuffers[2][1] = StringLen($aURLArray[4])
	If $tBuffers[2][1] Then
		$tBuffers[2][0] = DllStructCreate("wchar[" & $tBuffers[2][1] + 1 & "]")
		DllStructSetData($tBuffers[2][0], 1, $aURLArray[4])
	EndIf

	$tBuffers[3][1] = StringLen($aURLArray[5])
	If $tBuffers[3][1] Then
		$tBuffers[3][0] = DllStructCreate("wchar[" & $tBuffers[3][1] + 1 & "]")
		DllStructSetData($tBuffers[3][0], 1, $aURLArray[5])
	EndIf

	$tBuffers[4][1] = StringLen($aURLArray[6])
	If $tBuffers[4][1] Then
		$tBuffers[4][0] = DllStructCreate("wchar[" & $tBuffers[4][1] + 1 & "]")
		DllStructSetData($tBuffers[4][0], 1, $aURLArray[6])
	EndIf

	$tBuffers[5][1] = StringLen($aURLArray[7])
	If $tBuffers[5][1] Then
		$tBuffers[5][0] = DllStructCreate("wchar[" & $tBuffers[5][1] + 1 & "]")
		DllStructSetData($tBuffers[5][0], 1, $aURLArray[7])
	EndIf

	DllStructSetData($tURL_COMPONENTS, "SchemeNameLength", $tBuffers[0][1])
	DllStructSetData($tURL_COMPONENTS, "SchemeName", DllStructGetPtr($tBuffers[0][0]))
	DllStructSetData($tURL_COMPONENTS, "HostNameLength", $tBuffers[1][1])
	DllStructSetData($tURL_COMPONENTS, "HostName", DllStructGetPtr($tBuffers[1][0]))
	DllStructSetData($tURL_COMPONENTS, "UserNameLength", $tBuffers[2][1])
	DllStructSetData($tURL_COMPONENTS, "UserName", DllStructGetPtr($tBuffers[2][0]))
	DllStructSetData($tURL_COMPONENTS, "PasswordLength", $tBuffers[3][1])
	DllStructSetData($tURL_COMPONENTS, "Password", DllStructGetPtr($tBuffers[3][0]))
	DllStructSetData($tURL_COMPONENTS, "UrlPathLength", $tBuffers[4][1])
	DllStructSetData($tURL_COMPONENTS, "UrlPath", DllStructGetPtr($tBuffers[4][0]))
	DllStructSetData($tURL_COMPONENTS, "ExtraInfoLength", $tBuffers[5][1])
	DllStructSetData($tURL_COMPONENTS, "ExtraInfo", DllStructGetPtr($tBuffers[5][0]))

	DllStructSetData($tURL_COMPONENTS, "Scheme", $aURLArray[1])
	DllStructSetData($tURL_COMPONENTS, "Port", $aURLArray[3])

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpCreateUrl", _
			"ptr", DllStructGetPtr($tURL_COMPONENTS), _
			"dword", $ICU_ESCAPE, _
			"ptr", 0, _
			"dword*", 0)

	If @error Then
		Return SetError(2, 0, "")
	EndIf

	Local $iURLLen = $a_iCall[4]

	Local $URLBuffer = DllStructCreate("wchar[" & ($iURLLen + 1) & "]")

	$a_iCall = DllCall("winhttp.dll", "int", "WinHttpCreateUrl", _
			"ptr", DllStructGetPtr($tURL_COMPONENTS), _
			"dword", $ICU_ESCAPE, _
			"ptr", DllStructGetPtr($URLBuffer), _
			"dword*", $iURLLen)

	If @error Or Not $a_iCall[0] Then
		Return SetError(3, 0, "")
	EndIf

	Return SetError(0, 0, DllStructGetData($URLBuffer, 1))

EndFunc   ;==>_WinHttpCreateUrl




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpDetectAutoProxyConfigUrl
; Description ...: Finds the URL for the Proxy Auto-Configuration (PAC) file.
; Syntax.........: _WinHttpDetectAutoProxyConfigUrl($iAutoDetectFlags)
; Parameters ....: $iAutoDetectFlags - Specifies what protocols to use to locate the PAC file.
; Return values .: Success - Returns URL for the PAC file.
;                          - Sets @error to 0
;                  Failure - Returns empty string and sets @error:
;                  |1 - DllCall failed.
;                  |2 - Internal failure.
; Author ........: trancexx
; Modified.......:
; Remarks .......: $iAutoDetectFlags defined in WinHTTPconstants.au3
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384094(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpDetectAutoProxyConfigUrl($iAutoDetectFlags)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpDetectAutoProxyConfigUrl", _
			"dword", $iAutoDetectFlags, _
			"ptr*", 0)

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, "")
	EndIf

	Local $pString = $a_iCall[2]

	If $pString Then
		Local $iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
		If @error Then
			Return SetError(2, 0, "")
		EndIf
		Local $tString = DllStructCreate("wchar[" & $iLen[0] + 1 & "]", $pString)

		Return SetError(0, 0, DllStructGetData($tString, 1))
	EndIf

	Return SetError(0, 0, "")

EndFunc   ;==>_WinHttpDetectAutoProxyConfigUrl




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpGetDefaultProxyConfiguration
; Description ...: Retrieves the default WinHTTP proxy configuration.
; Syntax.........: _WinHttpGetDefaultProxyConfiguration()
; Parameters ....: None.
; Return values .: Success - Returns array which first element [0] is integer value that contains the access type,
;                                        second element [1] is string value that contains the proxy server list,
;                                        third element [2] is string value that contains the proxy bypass list.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
;                  |2 - Internal failure.
; Author ........: trancexx
; Modified.......:
; Remarks .......: Access types are defined in WinHTTPconstants.au3:
;                  |$WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0
;                  |$WINHTTP_ACCESS_TYPE_NO_PROXY = 1
;                  |$WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384095(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpGetDefaultProxyConfiguration()

	Local $tWINHTTP_PROXY_INFO = DllStructCreate("dword AccessType;" & _
			"ptr Proxy;" & _
			"ptr ProxyBypass")

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpGetDefaultProxyConfiguration", "ptr", DllStructGetPtr($tWINHTTP_PROXY_INFO))

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Local $aArray[3] = [DllStructGetData($tWINHTTP_PROXY_INFO, "AccessType"), _
			DllStructGetData($tWINHTTP_PROXY_INFO, "Proxy"), _
			DllStructGetData($tWINHTTP_PROXY_INFO, "ProxyBypass")]

	If $aArray[1] Then
		Local $iProxyLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $aArray[1])
		If @error Then
			Return SetError(2, 0, 0)
		EndIf
		Local $string_Proxy = DllStructCreate("wchar[" & $iProxyLen[0] + 1 & "]", $aArray[1])
		Local $Proxy = DllStructGetData($string_Proxy, 1)
	Else
		$Proxy = ""
	EndIf

	If $aArray[2] Then
		Local $iProxyBypassLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $aArray[2])
		If @error Then
			Return SetError(2, 0, 0)
		EndIf
		Local $string_ProxyBypass = DllStructCreate("wchar[" & $iProxyBypassLen[0] + 1 & "]", $aArray[2])
		Local $ProxyBypass = DllStructGetData($string_ProxyBypass, 1)
	Else
		$ProxyBypass = ""
	EndIf

	Local $a_Ret[3] = [$aArray[0], $Proxy, $ProxyBypass]

	Return SetError(0, 0, $a_Ret)

EndFunc   ;==>_WinHttpGetDefaultProxyConfiguration




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpGetIEProxyConfigForCurrentUser
; Description ...: Retrieves the Internet Explorer proxy configuration for the current user.
; Syntax.........: _WinHttpGetIEProxyConfigForCurrentUser()
; Parameters ....: None.
; Return values .: Success - Returns array which first element [0] if 1 indicates that the Internet Explorer proxy configuration for the current user specifies "automatically detect settings",
;                                        second element [1] is string that contains the auto-configuration URL if the Internet Explorer proxy configuration for the current user specifies "Use automatic proxy configuration",
;                                        third element [2] is string that contains the proxy URL if the Internet Explorer proxy configuration for the current user specifies "use a proxy server",
;                                        fourth element [3] is string that contains the optional proxy by-pass server list.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
;                  |2 - Internal failure.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384096(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpGetIEProxyConfigForCurrentUser()

	Local $tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG = DllStructCreate("int AutoDetect;" & _
			"ptr AutoConfigUrl;" & _
			"ptr Proxy;" & _
			"ptr ProxyBypass;")

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpGetIEProxyConfigForCurrentUser", "ptr", DllStructGetPtr($tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG))

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Local $aArray[4] = [DllStructGetData($tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG, "AutoDetect"), _
			DllStructGetData($tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG, "AutoConfigUrl"), _
			DllStructGetData($tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG, "Proxy"), _
			DllStructGetData($tWINHTTP_CURRENT_USER_IE_PROXY_CONFIG, "ProxyBypass")]

	Local $sAutoConfigUrl
	If $aArray[1] Then
		Local $aAutoConfigUrlLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $aArray[1])
		If @error Then
			Return SetError(2, 0, 0)
		EndIf
		Local $tAutoConfigUrl = DllStructCreate("wchar[" & $aAutoConfigUrlLen[0] + 1 & "]", $aArray[1])
		$sAutoConfigUrl = DllStructGetData($tAutoConfigUrl, 1)
	Else
		$sAutoConfigUrl = ""
	EndIf

	Local $sProxy
	If $aArray[2] Then
		Local $aProxyLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $aArray[2])
		If @error Then
			Return SetError(2, 0, 0)
		EndIf
		Local $tProxy = DllStructCreate("wchar[" & $aProxyLen[0] + 1 & "]", $aArray[2])
		$sProxy = DllStructGetData($tProxy, 1)
	Else
		$sProxy = ""
	EndIf

	Local $sProxyBypass
	If $aArray[3] Then
		Local $aProxyBypassLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $aArray[3])
		If @error Then
			Return SetError(2, 0, 0)
		EndIf
		Local $tProxyBypass = DllStructCreate("wchar[" & $aProxyBypassLen[0] + 1 & "]", $aArray[3])
		$sProxyBypass = DllStructGetData($tProxyBypass, 1)
	Else
		$sProxyBypass = ""
	EndIf

	Local $aOutput[4] = [$aArray[0], $sAutoConfigUrl, $sProxy, $sProxyBypass]

	Return SetError(0, 0, $aOutput)

EndFunc   ;==>_WinHttpGetIEProxyConfigForCurrentUser




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpOpen
; Description ...: Initializes the use of WinHTTP functions and returns a WinHTTP-session handle.
; Syntax.........: _WinHttpOpen([$sUserAgent [, $iAccessType [, $sProxyName [, $sProxyBypass [, $iFlags ]]]]])
; Parameters ....: $sUserAgent - String that contains the name of the application or entity calling the WinHTTP functions.
;                  $iAccessType - Type of access required.
;                  $sProxyName - String that contains the name of the proxy server to use when proxy access is specified by setting $iAccessType to $WINHTTP_ACCESS_TYPE_NAMED_PROXY.
;                  $sProxyBypass - String that contains an optional list of host names or IP addresses, or both, that should not be routed through the proxy when $iAccessType is set to $WINHTTP_ACCESS_TYPE_NAMED_PROXY.
;                  $iFlag - Integer that contains the flags that indicate various options affecting the behavior of this function.
; Return values .: Success - Returns valid session handle.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: For asynchronous mode set $iFlag to $WINHTTP_FLAG_ASYNC
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384098(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpOpen($sUserAgent = "AutoIt v3", $iAccessType = $WINHTTP_ACCESS_TYPE_NO_PROXY, $sProxyName = $WINHTTP_NO_PROXY_NAME, $sProxyBypass = $WINHTTP_NO_PROXY_BYPASS, $iFlag = 0)

	Local $a_hCall = DllCall("winhttp.dll", "hwnd", "WinHttpOpen", _
			"wstr", $sUserAgent, _
			"dword", $iAccessType, _
			"wstr", $sProxyName, _
			"wstr", $sProxyBypass, _
			"dword", $iFlag)

	If @error Or Not $a_hCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, $a_hCall[0])

EndFunc   ;==>_WinHttpOpen




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpOpenRequest
; Description ...: Creates an HTTP request handle.
; Syntax.........: _WinHttpOpenRequest($hConnect [, $sVerb [, $sObjectName[, $sVersion [, $sReferrer [, $ppwszAcceptTypes [, $iFlags]]]]]])
; Parameters ....: $hConnect - Handle to an HTTP session returned by _WinHttpConnect().
;                  $sVerb - String that contains the HTTP verb to use in the request. Default is "GET".
;                  $sObjectName - String that contains the name of the target resource of the specified HTTP verb.
;                  $sVersion - String that contains the HTTP version. Default is "HTTP/1.1"
;                  $sReferrer - String that specifies the URL of the document from which the URL in the request $sObjectName was obtained. Default is $WINHTTP_NO_REFERER.
;                  $sAcceptTypes - String that specifies media types accepted by the client. Default is $WINHTTP_DEFAULT_ACCEPT_TYPES
;                  $iFlags - Integer that contains the Internet flag values. Default is $WINHTTP_FLAG_ESCAPE_DISABLE
; Return values .: Success - Returns valid session handle.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384099(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpOpenRequest($hConnect, $sVerb = "GET", $sObjectName = "", $sVersion = "HTTP/1.1", $sReferrer = $WINHTTP_NO_REFERER, $sAcceptTypes = $WINHTTP_DEFAULT_ACCEPT_TYPES, $iFlags = $WINHTTP_FLAG_ESCAPE_DISABLE)

	Local $a_hCall = DllCall("winhttp.dll", "hwnd", "WinHttpOpenRequest", _
			"hwnd", $hConnect, _
			"wstr", StringUpper($sVerb), _
			"wstr", $sObjectName, _
			"wstr", StringUpper($sVersion), _
			"wstr", $sReferrer, _
			"wstr*", $sAcceptTypes, _
			"dword", $iFlags)

	If @error Or Not $a_hCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, $a_hCall[0])

EndFunc   ;==>_WinHttpOpenRequest




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpQueryDataAvailable
; Description ...: Returns the availability to be read with WinHttpReadData.
; Syntax.........: _WinHttpQueryDataAvailable($hRequest)
; Parameters ....: $hRequest - handle returned by _WinHttpOpenRequest().
; Return values .: Success - Returns 1 if data is available.
;                          - Returns 0 if no data is available.
;                          - @extended receives the number of available bytes.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: _WinHttpReceiveResponse() must have been called for this handle and have completed before _WinHttpQueryDataAvailable is called.
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384101(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpQueryDataAvailable($hRequest)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpQueryDataAvailable", _
			"hwnd", $hRequest, _
			"dword*", 0)

	If @error Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, $a_iCall[2], $a_iCall[0])

EndFunc   ;==>_WinHttpQueryDataAvailable




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpQueryHeaders
; Description ...: Retrieves header information associated with an HTTP request.
; Syntax.........: _WinHttpQueryHeaders($hRequest, $iInfoLevel, $sName)
; Parameters ....: $hRequest - handle returned by _WinHttpOpenRequest().
;                  $iInfoLevel - Specifies a combination of attribute and modifier flags. Default is $WINHTTP_QUERY_RAW_HEADERS_CRLF.
;                  $sName - String that contains the header name. Default is $WINHTTP_HEADER_NAME_BY_INDEX.
; Return values .: Success - Returns string that contains header.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - Initial DllCall failed.
;                  |2 - Main DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384102(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpQueryHeaders($hRequest, $iInfoLevel = $WINHTTP_QUERY_RAW_HEADERS_CRLF, $sName = $WINHTTP_HEADER_NAME_BY_INDEX)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpQueryHeaders", _
			"hwnd", $hRequest, _
			"dword", $iInfoLevel, _
			"wstr", $sName, _
			"ptr", 0, _
			"dword*", 0, _
			"dword*", 0)

	If @error Or $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Local $iSize = $a_iCall[5]

	If Not $iSize Then
		Return SetError(0, 0, "")
	EndIf

	Local $tBuffer = DllStructCreate("wchar[" & $iSize + 1 & "]")

	$a_iCall = DllCall("winhttp.dll", "int", "WinHttpQueryHeaders", _
			"hwnd", $hRequest, _
			"dword", $iInfoLevel, _
			"wstr", $sName, _
			"ptr", DllStructGetPtr($tBuffer), _
			"dword*", $iSize, _
			"dword*", 0)

	If @error Or Not $a_iCall[0] Then
		Return SetError(2, 0, 0)
	EndIf

	Return SetError(0, 0, DllStructGetData($tBuffer, 1))

EndFunc   ;==>_WinHttpQueryHeaders




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpQueryOption
; Description ...: Queries an Internet option on the specified handle.
; Syntax.........: _WinHttpQueryOption($hInternet, $iOption)
; Parameters ....: $hInternet - Handle on which to query information.
;                  $iOption - Integer value that contains the Internet option to query.
; Return values .: Success - Returns data containing requested information.
;                          - Sets @error to 0
;                  Failure - Returns empty string and sets @error:
;                  |1 - Initial DllCall failed.
;                  |2 - Main DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: Type of the returned data varies on request.
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384103(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpQueryOption($hInternet, $iOption)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpQueryOption", _
			"hwnd", $hInternet, _
			"dword", $iOption, _
			"ptr", 0, _
			"dword*", 0)

	If @error Or $a_iCall[0] Then
		Return SetError(1, 0, "")
	EndIf

	Local $iSize = $a_iCall[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
			$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 Else
			DllStructCreate("byte[" & $iSize & "]")
	EndSwitch

	$a_iCall = DllCall("winhttp.dll", "int", "WinHttpQueryOption", _
			"hwnd", $hInternet, _
			"dword", $iOption, _
			"ptr", DllStructGetPtr($tBuffer), _
			"dword*", $iSize)

	If @error Or Not $a_iCall[0] Then
		Return SetError(2, 0, "")
	EndIf

	Return SetError(0, 0, DllStructGetData($tBuffer, 1))

EndFunc   ;==>_WinHttpQueryOption




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpReadData
; Description ...: Reads data from a handle opened by the _WinHttpOpenRequest() function.
; Syntax.........: _WinHttpReadData($hRequest [, iMode [, $iNumberOfBytesToRead]])
; Parameters ....: $hRequest - Valid handle returned from a previous call to _WinHttpOpenRequest().
;                  $iMode - Integer representing reading mode. Default is 0 (charset is decoded as it is ANSI).
;                  $iNumberOfBytesToRead - Integer value that contains the number of bytes to read. Default is 8192 bytes.
; Return values .: Success - Returns data read.
;                          - @extended receives the number of bytes read.
;                          - Sets @error to 0
;                  Special: Sets @error to -1 if no more data to read (end reached).
;                  Failure - Returns empty string and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx, ProgAndy
; Modified.......:
; Remarks .......: iMode can have these values:
;                  |0 - ANSI
;                  |1 - UTF8
;                  |2 - Binary
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384104(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpReadData($hRequest, $iMode = 0, $iNumberOfBytesToRead = 8192)

	Local $tBuffer

	Switch $iMode
		Case 1, 2
			$tBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]")
		Case Else
			$iMode = 0
			$tBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]")
	EndSwitch

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpReadData", _
			"hwnd", $hRequest, _
			"ptr", DllStructGetPtr($tBuffer), _
			"ulong", $iNumberOfBytesToRead, _
			"dword*", 0)

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, "")
	EndIf

	If Not $a_iCall[4] Then
		Return SetError(-1, 0, "")
	EndIf

	Switch $a_iCall[4] < $iNumberOfBytesToRead
		Case True
			Switch $iMode
				Case 0
					Return SetError(0, $a_iCall[4], StringLeft(DllStructGetData($tBuffer, 1), $a_iCall[4]))
				Case 1
					Return SetError(0, $a_iCall[4], BinaryToString(BinaryMid(DllStructGetData($tBuffer, 1), 1, $a_iCall[4]), 4))
				Case 2
					Return SetError(0, $a_iCall[4], BinaryMid(DllStructGetData($tBuffer, 1), 1, $a_iCall[4]))
			EndSwitch
		Case Else
			Switch $iMode
				Case 0, 2
					Return SetError(0, $a_iCall[4], DllStructGetData($tBuffer, 1))
				Case 1
					Return SetError(0, $a_iCall[4], BinaryToString(DllStructGetData($tBuffer, 1), 4))
			EndSwitch
	EndSwitch

EndFunc   ;==>_WinHttpReadData




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpReceiveResponse
; Description ...: Waits to receive the response to an HTTP request initiated by WinHttpSendRequest().
; Syntax.........: _WinHttpReceiveResponse($hRequest)
; Parameters ....: $hRequest - Handle returned by _WinHttpOpenRequest() and sent by _WinHttpSendRequest().
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: Must call _WinHttpReceiveResponse() before _WinHttpQueryDataAvailable() and _WinHttpReadData().
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384105(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpReceiveResponse($hRequest)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpReceiveResponse", _
			"hwnd", $hRequest, _
			"ptr", 0)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpReceiveResponse




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSendRequest
; Description ...: Sends the specified request to the HTTP server.
; Syntax.........: _WinHttpSendRequest($hRequest [, $sHeaders [, $sOptional [, $iTotalLength [, $iContext]]]])
; Parameters ....: $hRequest - Handle returned by _WinHttpOpenRequest().
;                  $sHeaders - String that contains the additional headers to append to the request. Default is $WINHTTP_NO_ADDITIONAL_HEADERS.
;                  $sOptional - String that contains any optional data to send immediately after the request headers. Default is $WINHTTP_NO_REQUEST_DATA.
;                  $iTotalLength - An unsigned long integer value that contains the length, in bytes, of the total optional data sent. Default is 0.
;                  $iContext - A pointer to a pointer-sized variable that contains an application-defined value that is passed, with the request handle, to any callback functions. Default is 0.
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: Specifying optional data ($sOptional) will cause $iTotalLength to receive the size of that data if left default value.
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384110(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpSendRequest($hRequest, $sHeaders = $WINHTTP_NO_ADDITIONAL_HEADERS, $sOptional = $WINHTTP_NO_REQUEST_DATA, $iTotalLength = 0, $iContext = 0)

	Local $iOptionalLength = StringLen($sOptional)
	Local $structOptional = DllStructCreate("char[" & $iOptionalLength + 1 & "]")
	DllStructSetData($structOptional, 1, $sOptional)

	If Not $iTotalLength Or $iTotalLength < $iOptionalLength Then
		$iTotalLength += $iOptionalLength
	EndIf

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpSendRequest", _
			"hwnd", $hRequest, _
			"wstr", $sHeaders, _
			"dword", 0, _
			"ptr", DllStructGetPtr($structOptional), _
			"dword", $iOptionalLength, _
			"dword", $iTotalLength, _
			"ptr", $iContext)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpSendRequest




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSetCredentials
; Description ...: Passes the required authorization credentials to the server.
; Syntax.........: _WinHttpSetCredentials($hRequest, $iAuthTargets, $iAuthScheme, $sUserName, $sPassword)
; Parameters ....: $hRequest - Valid handle returned by _WinHttpOpenRequest().
;                  $iAuthTargets - Integer that specifies a flag that contains the authentication target.
;                  $iAuthScheme - Integer that specifies a flag that contains the authentication scheme.
;                  $sUserName - String that contains a valid user name.
;                  $sPassword - String that contains a valid password.
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384112(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpSetCredentials($hRequest, $iAuthTargets, $iAuthScheme, $sUserName, $sPassword)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpSetCredentials", _
			"hwnd", $hRequest, _
			"dword", $iAuthTargets, _
			"dword", $iAuthScheme, _
			"wstr", $sUserName, _
			"wstr", $sPassword, _
			"ptr", 0)

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpSetCredentials




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSetDefaultProxyConfiguration
; Description ...: Sets the default WinHTTP proxy configuration.
; Syntax.........: _WinHttpSetDefaultProxyConfiguration($iAccessType, $Proxy, $ProxyBypass)
; Parameters ....: $iAccessType - Integer value that contains the access type.
;                  $Proxy - String value that contains the proxy server list.
;                  $ProxyBypass - String value that contains the proxy bypass list.
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384113(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpSetDefaultProxyConfiguration($iAccessType, $Proxy, $ProxyBypass)

	Local $tProxy = DllStructCreate("wchar[" & StringLen($Proxy) + 1 & "]")
	DllStructSetData($tProxy, 1, $Proxy)

	Local $tProxyBypass = DllStructCreate("wchar[" & StringLen($ProxyBypass) + 1 & "]")
	DllStructSetData($tProxyBypass, 1, $ProxyBypass)

	Local $tWINHTTP_PROXY_INFO = DllStructCreate("dword AccessType;" & _
			"ptr Proxy;" & _
			"ptr ProxyBypass")

	DllStructSetData($tWINHTTP_PROXY_INFO, "AccessType", $iAccessType)
	DllStructSetData($tWINHTTP_PROXY_INFO, "Proxy", DllStructGetPtr($tProxy))
	DllStructSetData($tWINHTTP_PROXY_INFO, "ProxyBypass", DllStructGetPtr($tProxyBypass))

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpSetDefaultProxyConfiguration", "ptr", DllStructGetPtr($tWINHTTP_PROXY_INFO))

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpSetDefaultProxyConfiguration




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSetOption
; Description ...: Sets an Internet option.
; Syntax.........: _WinHttpSetOption($hInternet, $iOption, $sSetting)
; Parameters ....: $hInternet - Handle on which to set data.
;                  $iOption - Integer value that contains the Internet option to set.
;                  $sSetting - String value that contains desired setting.
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384114(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpSetOption($hInternet, $iOption, $sSetting)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpSetOption", _
			"hwnd", $hInternet, _
			"dword", $iOption, _
			"wstr", $sSetting, _
			"dword", StringLen($sSetting))

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpSetOption




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSetStatusCallback
; Description ...: Sets up a callback function that WinHTTP can call as progress is made during an operation.
; Syntax.........: _WinHttpSetStatusCallback($hInternet, $pInternetCallback, $iNotificationFlags)
; Parameters ....: $hInternet - Handle for which the callback is to be set.
;                  $fInternetCallback - Callback function to call when progress is made.
;                  $iNotificationFlags - Integer value that specifies flags to indicate which events activate the callback function. Default is $WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS.
; Return values .: Success - Returns a pointer to the previously defined status callback function or NULL if there was no previously defined status callback function.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: ProgAndy
; Modified.......: trancexx
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384115(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpSetStatusCallback($hInternet, $fInternetCallback, $iNotificationFlags = $WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS)

	Local $a_pCall = DllCall("winhttp.dll", "ptr", "WinHttpSetStatusCallback", _
			"hwnd", $hInternet, _
			"ptr", DllCallbackGetPtr($fInternetCallback), _
			"dword", $iNotificationFlags, _
			"ptr", 0)

	If @error Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, $a_pCall[0])

EndFunc   ;==>_WinHttpSetStatusCallback




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSetTimeouts
; Description ...: Sets time-outs involved with HTTP transactions.
; Syntax.........: _WinHttpSetTimeouts($hInternet, $iResolveTimeout, $iConnectTimeout, $iSendTimeout, $iReceiveTimeout)
; Parameters ....: $hInternet - Handle returned by _WinHttpOpen() or _WinHttpOpenRequest().
;                  $iResolveTimeout - Integer that specifies the time-out value, in milliseconds, to use for name resolution.
;                  $iConnectTimeout - Integer that specifies the time-out value, in milliseconds, to use for server connection requests.
;                  $iSendTimeout - Integer that specifies the time-out value, in milliseconds, to use for sending requests.
;                  $iReceiveTimeout - integer that specifies the time-out value, in milliseconds, to receive a response to a request.
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: Initial values are: - $iResolveTimeout = 0
;                                      - $iConnectTimeout = 60000
;                                      - $iSendTimeout = 30000
;                                      - $iReceiveTimeout = 30000
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384116(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpSetTimeouts($hInternet, $iResolveTimeout, $iConnectTimeout, $iSendTimeout, $iReceiveTimeout)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpSetTimeouts", _
			"hwnd", $hInternet, _
			"int", $iResolveTimeout, _
			"int", $iConnectTimeout, _
			"int", $iSendTimeout, _
			"int", $iReceiveTimeout)

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>_WinHttpSetTimeouts




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpTimeFromSystemTime
; Description ...: Formats a system date and time according to the HTTP version 1.0 specification.
; Syntax.........: _WinHttpTimeFromSystemTime()
; Parameters ....: None.
; Return values .: Success - Returns 1.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - Initial DllCall failed.
;                  |2 - Main DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384117(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpTimeFromSystemTime()

	Local $SYSTEMTIME = DllStructCreate("ushort Year;" & _
			"ushort Month;" & _
			"ushort DayOfWeek;" & _
			"ushort Day;" & _
			"ushort Hour;" & _
			"ushort Minute;" & _
			"ushort Second;" & _
			"ushort Milliseconds")

	DllCall("kernel32.dll", "none", "GetSystemTime", "ptr", DllStructGetPtr($SYSTEMTIME))

	If @error Then
		Return SetError(1, 0, 0)
	EndIf

	Local $sTime = DllStructCreate("wchar[62]")

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpTimeFromSystemTime", _
			"ptr", DllStructGetPtr($SYSTEMTIME), _
			"ptr", DllStructGetPtr($sTime))

	If @error Or Not $a_iCall[0] Then
		Return SetError(2, 0, 0)
	EndIf

	Return SetError(0, 0, DllStructGetData($sTime, 1))

EndFunc   ;==>_WinHttpTimeFromSystemTime




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpTimeToSystemTime
; Description ...: Takes an HTTP time/date string and converts it to array (SYSTEMTIME structure values).
; Syntax.........: _WinHttpTimeToSystemTime($sHttpTime)
; Parameters ....: $sHttpTime - Date/time string to convert.
; Return values .: Success - Returns array which first element [0] is Year,
;                                        second element [1] is Month,
;                                        third element [2] is DayOfWeek,
;                                        fourth element [3] is Day,
;                                        fifth element [4] is Hour,
;                                        sixth element [5] is Minute,
;                                        seventh element [6] is Second.,
;                                        eighth element [7] is Milliseconds.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384118(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpTimeToSystemTime($sHttpTime)

	Local $SYSTEMTIME = DllStructCreate("ushort Year;" & _
			"ushort Month;" & _
			"ushort DayOfWeek;" & _
			"ushort Day;" & _
			"ushort Hour;" & _
			"ushort Minute;" & _
			"ushort Second;" & _
			"ushort Milliseconds")

	Local $sTime = DllStructCreate("wchar[62]")
	DllStructSetData($sTime, 1, $sHttpTime)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpTimeToSystemTime", _
			"ptr", DllStructGetPtr($sTime), _
			"ptr", DllStructGetPtr($SYSTEMTIME))

	If @error Or Not $a_iCall[0] Then
		Return SetError(2, 0, 0)
	EndIf

	Local $a_Ret[8] = [DllStructGetData($SYSTEMTIME, "Year"), _
			DllStructGetData($SYSTEMTIME, "Month"), _
			DllStructGetData($SYSTEMTIME, "DayOfWeek"), _
			DllStructGetData($SYSTEMTIME, "Day"), _
			DllStructGetData($SYSTEMTIME, "Hour"), _
			DllStructGetData($SYSTEMTIME, "Minute"), _
			DllStructGetData($SYSTEMTIME, "Second"), _
			DllStructGetData($SYSTEMTIME, "Milliseconds")]

	Return SetError(0, 0, $a_Ret)

EndFunc   ;==>_WinHttpTimeToSystemTime




; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpWriteData
; Description ...: Writes request data to an HTTP server.
; Syntax.........: _WinHttpWriteData($hRequest, $data [, $iMode])
; Parameters ....: $hRequest - Valid handle returned by _WinHttpSendRequest().
;                  $data - Data to write.
;                  $iMode - Integer representing writing mode. Default is 0 - write ANSI string.
; Return values .: Success - Returns 1
;                          - @extended receives the number of bytes written.
;                          - Sets @error to 0
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx, ProgAndy
; Modified.......:
; Remarks .......: $data variable is either string or binary data to write.
;                  $iMode can have these values:
;                  |0 - to write ANSI string
;                  |1 - to write binary data
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384120(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpWriteData($hRequest, $data, $iMode = 0)

	Local $iNumberOfBytesToWrite, $tData
	Switch $iMode
		Case 1
			$iNumberOfBytesToWrite = BinaryLen($data)
			$tData = DllStructCreate("byte[" & $iNumberOfBytesToWrite & "]")
		Case Else
			$iNumberOfBytesToWrite = StringLen($data)
            $tData = DllStructCreate("char[" & $iNumberOfBytesToWrite + 1 & "]")
	EndSwitch

	DllStructSetData($tData, 1, $data)

	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpWriteData", _
			"hwnd", $hRequest, _
			"ptr", DllStructGetPtr($tData), _
			"dword", $iNumberOfBytesToWrite, _
			"dword*", 0)

	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, $a_iCall[4], 1)


EndFunc   ;==>_WinHttpWriteData
