WinHTTP functions

642 posts in this topic




Posted

nice script thanks :mellow:

Share this post


Link to post
Share on other sites

Posted

Good to hear I inspired you! Would you mind giving an example? Like sending a POST with these parameters

user=admin

pass=admin

post data: restart=Restart?

http://www.autoitscript.com/forum/index.php?showtopic=83971

Or does WinHTTP still need some work in order to accomplish this?

Share this post


Link to post
Share on other sites

Posted (edited)

Good to hear I inspired you! Would you mind giving an example? Like sending a POST with these parameters

user=admin

pass=admin

post data: restart=Restart?

http://www.autoitscript.com/forum/index.php?showtopic=83971

Or does WinHTTP still need some work in order to accomplish this?

Try this:

 #include "WinHTTP.au3"


$LocalIP = "192.168.3.1" 

$hw_open = _WinHttpOpen()

$hw_connect = _WinHttpConnect($hw_open, $LocalIP)

$h_openRequest = _WinHttpOpenRequest($hw_connect, "POST", "restart.cgi")

_WinHttpSetCredentials($h_openRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, "admin", "admin")

_WinHttpSendRequest($h_openRequest)

_WinHttpWriteData($h_openRequest, "restart=Restart?")

_WinHttpReceiveResponse($h_openRequest)

_WinHttpCloseHandle($h_openRequest)

_WinHttpCloseHandle($hw_connect)

_WinHttpCloseHandle($hw_open)




Func _WinHttpWriteData($hRequest, $string)
	
	Local $dwNumberOfBytesToWrite = StringLen($string)  
	
	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpWriteData", _
			"hwnd", $hRequest, _
			"str", $string, _
			"dword", $dwNumberOfBytesToWrite, _
			"ptr", 0)
	
	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, -1)
	EndIf

    Return SetError(0, 0, $a_iCall[0])
	
	
EndFunc   ;==>_WinHttpWriteData

That script have _WinHttpWriteData() that is not in WinHTTP.au3 (I wasn't sure about "str" or "wstr" in dll call).

Edited by trancexx

Share this post


Link to post
Share on other sites

Posted

looks good, will test it a bit later on, thanks for sharing :mellow:

Robjong

Share this post


Link to post
Share on other sites

Posted (edited)

Well, the data type is not too important, because the Data will be sent binary i think. But if you want to send text, ANSI str should be right in most cases :mellow:

This page good for testing, i think :(http://www.snee.com/xml/crud/posttest.html

//Edit: made an working example:) you also have to add the size to sendRewuest :)

 #include "WinHTTP.au3"


$LocalIP = "www.snee.com"

$hw_open = _WinHttpOpen()

$hw_connect = _WinHttpConnect($hw_open, $LocalIP)

$h_openRequest = _WinHttpOpenRequest($hw_connect, "POST", "xml/crud/posttest.cgi?sgs")

;~ _WinHttpSetCredentials($h_openRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, "admin", "admin")

$data = "fname=Rghgt&lname=345"

_WinHttpSendRequest($h_openRequest,$WINHTTP_NO_ADDITIONAL_HEADERS, 0, $WINHTTP_NO_REQUEST_DATA, 0, StringLen($data), 0)

_WinHttpWriteData($h_openRequest, $data)

_WinHttpReceiveResponse($h_openRequest)

MsgBox(0, 'Recived', _WinHttpReadData($h_openRequest))

_WinHttpCloseHandle($h_openRequest)

_WinHttpCloseHandle($hw_connect)

_WinHttpCloseHandle($hw_open)




Func _WinHttpWriteData($hRequest, $string)
   
    Local $dwNumberOfBytesToWrite = StringLen($string) 
   
    Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpWriteData", _
            "hwnd", $hRequest, _
            "str", $string, _
            "dword", $dwNumberOfBytesToWrite, _
            "dword*", 0)
   
    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, -1)
    EndIf

    Return SetError(0, 0, $a_iCall[0])
   
   
EndFunc   ;==>_WinHttpWriteData
Edited by ProgAndy

Share this post


Link to post
Share on other sites

Posted

I think a wrapper for these functions would be helpful... here's my untested take on it

Func WinHttpWrapper($URL, $Type, $Data = "", $username = "", $password = "", $protocall = "HTTP/1.1")
	$temp = SplitURL($URL)
	$Server = $temp[0]
	$Address = $temp[1]
	$hw_open = _WinHttpOpen("WinHTTP Example")
	$hw_connect = _WinHttpConnect($hw_open, $Server)
	$h_openRequest = _WinHttpOpenRequest($hw_connect, $Type, $Address, $protocall)
	_WinHttpSetCredentials($h_openRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, $username, $password)
	_WinHttpSendRequest($h_openRequest)
	_WinHttpWriteData($h_openRequest, $Data)
	$Response = _WinHttpReceiveResponse($h_openRequest)
	_WinHttpCloseHandle($h_openRequest)
	_WinHttpCloseHandle($hw_connect)
	_WinHttpCloseHandle($hw_open)
	Return $Response
EndFunc

Func SplitURL($URL)
	Dim $array[2]
	$split = SplitURLHelper($URL, 3)
	If $split == 0 Then
		$split = SplitURLHelper($URL, 2)
		$URL = StringRight($URL, $split)
		$array[0] = $URL
		Return $array
	EndIf
	
	$left = StringLeft($URL, $split)
	$right = StringRight($URL, $split)
	
	$split = SplitURLHelper($left, 2)
	$left = StringRight($left, $split)
	
	$array[0] = $left
	$array[1] = $right
	Return $array
EndFunc

Func SplitURLHelper($String, $pos)
	$split = StringInStr($String, "/", 0, $pos)
	If $split == 0 Then
		$split = StringInStr($String, "\", 0, $pos)
	EndIf
	Return $split
EndFunc

Share this post


Link to post
Share on other sites

Posted (edited)

Well, the data type is not too important, because the Data will be sent binary i think. But if you want to send text, ANSI str should be right in most cases :mellow:

Yes, ok.

"ptr" to "dword*"?

That parameter is set to 0.

I have made a modification or two to _WinHttpSendRequest() to meat* another (original actually) way of sending aditional data to the sever.

New (modified) _WinHttpSendRequest():

; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSendRequest
; Description ...: Sends the specified request to the HTTP server.
; Syntax.........: _WinHttpSendRequest($hRequest [, $pwszHeaders [, $sOptional [, $dwTotalLength [, $dwContext]]]])
; Parameters ....: $hRequest - Handle returned by _WinHttpOpenRequest().
; $pwszHeaders - 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.
; $dwTotalLength - An unsigned long integer value that contains the length, in bytes, of the total optional data sent. Default is 0.
; $dwContext - 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 -1 and sets @error:
; |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......: Specifying optional data ($sOptional) will cause $dwTotalLength 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, $pwszHeaders = $WINHTTP_NO_ADDITIONAL_HEADERS, $sOptional = $WINHTTP_NO_REQUEST_DATA, $dwTotalLength = 0, $dwContext = 0)

	Local $iOptionalLength = StringLen($sOptional)
	Local $structOptional = DllStructCreate("char[" & $iOptionalLength + 1 & "]")
	DllStructSetData($structOptional, 1, $sOptional)

	If Not $dwTotalLength Or $dwTotalLength < $iOptionalLength Then
		$dwTotalLength += $iOptionalLength
	EndIf
	
	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpSendRequest", _
			"hwnd", $hRequest, _
			"wstr", $pwszHeaders, _
			"dword", 0, _
			"ptr", DllStructGetPtr($structOptional), _
			"dword", $iOptionalLength, _
			"dword", $dwTotalLength, _
			"ptr", $dwContext)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, 0)
	EndIf
	
	Return SetError(0, 0, 1)

EndFunc ;==>_WinHttpSendRequest

@mikeytown2; I can see how can (could) that be useful.

edit: meat* = meet

Edited by Jon

Share this post


Link to post
Share on other sites

Posted (edited)

I'm having problems with this six functions:

No5. WinHttpCrackUrl

No6. WinHttpCreateUrl

...l

No23. WinHttpSetStatusCallback

No27. WinHttpWriteData

WinHttpWriteData has been translated by trancexx and me.

Now, i#ll post WinHttpCrackUrl, WinHttpCreateUrl and WinHttpSetStatusCallback :mellow:

(examples in the files)

WinHTTP_CrackURL.au3

WinHTTPSetStatusCallback.au3

Edited by ProgAndy

Share this post


Link to post
Share on other sites

Posted (edited)

i played a bit with it but could not figure out how to send cookies correctly, any idea?

EDIT:

saw that it handeles cookies automatically GREAT...

now i just have to figure out why i still can't login ....

EDIT2: HEEEEEELLLLLPPPPPPPP

tried everything even fighting through msdn KB but can't figure out how to send a simple post request with a pin=123456 attribut, so that it will allow me to logon :mellow:

with the old winhttp udf powered by tcp open .... it was solved as this:

_HTTPPost('', $sessionid2, '', $fax_device & ":8000", '/login', $socket, 'pin=98765&uri=%2Frps%2F_top.htm')

any nice help appreciated :-)

Edited by JRSmile

Share this post


Link to post
Share on other sites

Posted (edited)

WinHttpWriteData has been translated by trancexx and me.

Now, i#ll post WinHttpCrackUrl, WinHttpCreateUrl and WinHttpSetStatusCallback :mellow:

(examples in the files)

Now that's what I'm talking about!

Will add that functions to first post attachments (after I modify them just a bit, hope you wouldn't mind - style differences)

edit:

I like the way you sized the structures in _WinHttpCrackUrl() and stripped output afterwards

Edited by trancexx

Share this post


Link to post
Share on other sites

Posted (edited)

This may come in handy as I've been trying to do HTTP functions (file download) with this UDF WinINet.au3 (FTP/HTTP/HTTPS/Gopher+)

Now, I'm wondering what your thoughts about using WinInet over WinHTTP, WinINet seems more robust as it also includes functions for FTP, HTTPS, and Gopher+. Your UDF; WinHTTP is more tailored for HTTP. I want to know, does it contain more functions for HTTP? Is it faster, what's the reason for reinventing the wheel?

Microsoft insist on making development an arms length in becoming dependent on Tylenol pills. :mellow:

Edited by mrRevoked

Share this post


Link to post
Share on other sites

Posted

Now that's what I'm talking about!

Will add that functions to first post attachments (after I modify them just a bit, hope you wouldn't mind - style differences)

edit:

I like the way you sized the structures in _WinHttpCrackUrl() and stripped output afterwards

You can modify them as much as you want :mellow: I just wanted to create examples, so the code isn't written perfectly... You should also create documentaion for the funcs.

Share this post


Link to post
Share on other sites

Posted

This may come in handy as I've been trying to do HTTP functions (file download) with this UDF WinINet.au3 (FTP/HTTP/HTTPS/Gopher+)

Now, I'm wondering what your thoughts about using WinInet over WinHTTP, WinINet seems more robust as it also includes functions for FTP, HTTPS, and Gopher+. Your UDF; WinHTTP is more tailored for HTTP. I want to know, does it contain more functions for HTTP? Is it faster, what's the reason for reinventing the wheel?

Microsoft insist on making development an arms length in becoming dependent on Tylenol pills. :mellow:

castoff?

Advantages or disadvantages of this or that are yet to be determined.

This is not reinventing the wheel, but offering another option. Something like this:

Beep(400, 200)
DllCall("msvcrt.dll", "int:cdecl", "_beep", "int", 500, "int", 200)
DllCall("kernel32.dll","int", "Beep","int",600,"int",200)
DllCall("pncrt.dll", "int:cdecl", "_beep", "int", 700, "int", 200)

First post updated.

Share this post


Link to post
Share on other sites

Posted

i played a bit with it but could not figure out how to send cookies correctly, any idea?

EDIT:

saw that it handeles cookies automatically GREAT...

now i just have to figure out why i still can't login ....

EDIT2: HEEEEEELLLLLPPPPPPPP

tried everything even fighting through msdn KB but can't figure out how to send a simple post request with a pin=123456 attribut, so that it will allow me to logon :mellow:

with the old winhttp udf powered by tcp open .... it was solved as this:

_HTTPPost('', $sessionid2, '', $fax_device & ":8000", '/login', $socket, 'pin=98765&uri=%2Frps%2F_top.htm')

any nice help appreciated :-)

Just post script with calling _HTTPPost() properly and we'll find the solution, I'm sure.

Few examples using WinHTTP.au3 functions.

#include "WinHTTP.au3"
#include <Array.au3>


;Checking platform:
If _WinHttpCheckPlatform() Then
	MsgBox(0, "WinHTTP checking platform result", "Platform supported")
Else
    MsgBox(0, "WinHTTP checking platform result", "Platform not supported!")
EndIf

; Date and time according to the HTTP version 1.0 specification:
MsgBox(0, "Date and time according to the HTTP version 1.0 specification", _WinHttpTimeFromSystemTime())

; Transforming HTTP/1.0 time format to sistem time format:
$time_array = _WinHttpTimeToSystemTime("Fri, 07 Nov 2010 20:42:16 GMT")
_ArrayDisplay($time_array, "_WinHttpTimeToSystemTime()")

; Cracking URL:
$URL_array = _WinHttpCrackUrl("http://www.autoitscript.com/forum/index.php?showforum=9")
_ArrayDisplay($URL_array, "_WinHttpCrackUrl()")

; Creating URL out of array of components:
Global $URL_array[8] = ["http", 1, "www.autoitscript.com", 80, "Jon", "deadPiXels", "admin.php"]
MsgBox(0, "Created URL", _WinHttpCreateUrl($URL_array))

Share this post


Link to post
Share on other sites

Posted (edited)

Found some problems, if using String as Datatype for ReadData. This does not work, if HTML is in UTF-8 :mellow:

So i made some funcs using byte Structures, which you can convert with BinaryToString. Create Binary with StringToBinary;)

; Prog@ndy
; reads complete HTML response in ASCII and UTF-8 encoding.
Func _WinHttpReadHTML($hRequest)
	Local $data
	While 1
		$chunk = _WinHttpReadDataBin($hRequest)
		If @error <> 0 Then ExitLoop
		$data = _BinaryConcat($data, $chunk)
	WEnd
	$Content_Type = _WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_CONTENT_TYPE)
	Select
		Case StringInStr($Content_Type, "charset=UTF-8")
			$data = BinaryToString($data, 4)
		Case Else
			$data = BinaryToString($data)
	EndSelect
	Return $data
EndFunc   ;==>_WinHttpReadHTML

; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpSendRequestBin
; 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 - Binary Data 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 -1 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 _WinHttpSendRequestBin($hRequest, $sHeaders = $WINHTTP_NO_ADDITIONAL_HEADERS, $sOptional = $WINHTTP_NO_REQUEST_DATA, $iTotalLength = 0, $iContext = 0)

	Local $iOptionalLength = BinaryLen($sOptional)
	Local $structOptional = DllStructCreate("byte[" & $iOptionalLength & "]")
	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   ;==>_WinHttpSendRequestBin
; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpWriteDataBin
; Description ...: Writes request data to an HTTP server.
; Syntax.........: _WinHttpWriteData($hRequest, $string)
; Parameters ....: $hRequest - Valid handle returned by _WinHttpSendRequest().
;                  $binary - Binary data to write.
; Return values .: Success - Returns 1
;                          - Sets @error to 0
;                          - sets @extended to written bytes
;                  Failure - Returns 0 and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx, ProgAndy
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384120(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpWriteDataBin($hRequest, $binary)
	Local $lpBinary
	Local $iNumberOfBytesToWrite
	If IsDllStruct($binary) Then
		$lpBinary = DllStructGetPtr($binary)
		$iNumberOfBytesToWrite = DllStructGetSize($binary)
	Else
		$iNumberOfBytesToWrite = BinaryLen($binary)
		Local $sBinary = DllStructCreate("byte[" & $iNumberOfBytesToWrite & "]")
		DllStructSetData($sBinary, 1, $binary)
		$lpBinary = DllStructGetPtr($binary)
	EndIf
	
	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpWriteData", _
			"hwnd", $hRequest, _
			"ptr", $lpBinary, _
			"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   ;==>_WinHttpWriteDataBin
; #FUNCTION# ;===============================================================================
;
; Name...........: _WinHttpReadDataBin
; Description ...: Reads data from a handle opened by the _WinHttpOpenRequest() function.
; Syntax.........: _WinHttpReadData($hRequest [, $iNumberOfBytesToRead])
; Parameters ....: $hRequest - Valid handle returned from a previous call to _WinHttpOpenRequest().
;                  $iNumberOfBytesToRead - Integer value that contains the number of bytes to read. Default is 8192 bytes.
; Return values .: Success - Returns data read.
;                          - Sets @error to 0
;                  Failure - Returns empty string and sets @error:
;                  |1 - DllCall failed.
; Author ........: trancexx
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; http://msdn.microsoft.com/en-us/library/aa384104(VS.85).aspx
; Example .......; Yes
;
;==========================================================================================
Func _WinHttpReadDataBin($hRequest, $iNumberOfBytesToRead = 8192)

	Local $lpBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]")

	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpReadData", _
			"hwnd", $hRequest, _
			"ptr", DllStructGetPtr($lpBuffer), _
			"ulong", $iNumberOfBytesToRead, _
			"dword*", 0)

	Select
		Case @error Or Not $a_iCall[0]
			Return SetError(1)
		Case $a_iCall[4] = 0
			Return SetError(-1)
		Case $a_iCall[4] < $iNumberOfBytesToRead
			Return BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4])
	EndSelect
	
	Return DllStructGetData($lpBuffer, 1)
	
EndFunc   ;==>_WinHttpReadDataBin
;===============================================================================
;
; Function Name:   _BinaryConcat
; Description::    Concatenates 2 binary Variables
; Parameter(s):    2 Binary variables, by reference
; Requirement(s):
; Return Value(s): New Binary data
; Author(s):       Prog@ndy
;
;===============================================================================
;
Func _BinaryConcat(ByRef $Binary1, ByRef $Binary2)
	Select
		Case IsBinary($Binary1) And Not IsBinary($Binary2)
			Return $Binary1
		Case Not IsBinary($Binary1) And IsBinary($Binary2)
			Return $Binary2
		Case Not (IsBinary($Binary1) And IsBinary($Binary2))
			Return SetError(1)
	EndSelect
	Local $Len1 = BinaryLen($Binary1), $Len2 = BinaryLen($Binary2)
	Local $s = DllStructCreate("byte[" & $Len1 & "];byte[" & $Len2 & "]")
	DllStructSetData($s, 1, $Binary1)
	DllStructSetData($s, 2, $Binary2)
	Return DllStructGetData(DllStructCreate("byte[" & $Len1 + $Len2 & "]", DllStructGetPtr($s)), 1)
EndFunc   ;==>_BinaryConcat
Edited by ProgAndy

Share this post


Link to post
Share on other sites

Posted

I wasn't experiencing that difficulties, and was aiming sites with different charsets deliberately.

Will test that.

I was pretty sure that I changed the last parameter of DllCall() in _WinHttpReadData() from "ptr" to "dword*" and throw it out as @extended.

This is not working for you?

#include "WinHTTP.au3"


Global $hw_open = _WinHttpOpen("WinHTTP Example")
If @error Then 
	MsgBox(48, "Error", "Error initializing the usage of WinHTTP functions.")
	Exit
EndIf

Global $hw_connect = _WinHttpConnect($hw_open, "msdn.microsoft.com")
If @error Then 
	MsgBox(48, "Error", "Error specifying the initial target server of an HTTP request.")
	_WinHttpCloseHandle($hw_open)
	Exit
EndIf

Global $h_openRequest = _WinHttpOpenRequest($hw_connect, "GET", "en-us/library/aa384104(VS.85).aspx")
If @error Then 
	MsgBox(48, "Error", "Error creating an HTTP request handle.")
	_WinHttpCloseHandle($hw_connect)
	_WinHttpCloseHandle($hw_open)
	Exit
EndIf

_WinHttpSendRequest($h_openRequest)
If @error Then 
	MsgBox(48, "Error", "Error sending the specified request.")
	_WinHttpCloseHandle($hw_connect)
	_WinHttpCloseHandle($hw_open)
	Exit
EndIf

_WinHttpReceiveResponse($h_openRequest)

If _WinHttpQueryDataAvailable($h_openRequest) Then
	Global $header = _WinHttpQueryHeaders($h_openRequest)
	ConsoleWrite($header & @CRLF & @CRLF)
	Global $data
	While 1
		$data &= X_WinHttpReadData($h_openRequest)
		If Not @extended Then ExitLoop		
	WEnd
	ConsoleWrite($data & @CRLF)
EndIf

_WinHttpCloseHandle($h_openRequest)
_WinHttpCloseHandle($hw_connect)
_WinHttpCloseHandle($hw_open)



Func X_WinHttpReadData($hRequest, $iNumberOfBytesToRead = 8192)

	Local $lpBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]")

	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpReadData", _
			"hwnd", $hRequest, _
			"ptr", DllStructGetPtr($lpBuffer), _
			"ulong", $iNumberOfBytesToRead, _
			"dword*", 0)
	
	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, "")
	EndIf
	
	Return SetError(0, $a_iCall[4], DllStructGetData($lpBuffer, 1))
	
EndFunc

Share this post


Link to post
Share on other sites

Posted (edited)

No. try on Autoit.de:

1) recieving Vorgänge instead of Vorgänge

2) have additional data at the end:

</html>
0

.

second problem can be fixed this way:

Func X_WinHttpReadData($hRequest, $iNumberOfBytesToRead = 8192)

    Local $lpBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]")

    Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpReadData", _
            "hwnd", $hRequest, _
            "ptr", DllStructGetPtr($lpBuffer), _
            "ulong", $iNumberOfBytesToRead, _
            "dword*", 0)
   
    Select 
		Case @error Or Not $a_iCall[0]
			Return SetError(1, 0, "")
		Case Not $a_iCall[4]
			Return SetError(0, 0, "")
		Case $a_iCall[4] < $iNumberOfBytesToRead
			Return SetError(0, $a_iCall[4], StringLeft(DllStructGetData($lpBuffer, 1),$a_iCall[4]))
    EndSelect
   
    Return SetError(0, $a_iCall[4], DllStructGetData($lpBuffer, 1))
   
EndFunc

I propose to create two functions. One with char and another with Binary :mellow: So everyone can decide what he needs (e.g. if you want to download (upload) files, Binary is useful, too.)

Edited by ProgAndy

Share this post


Link to post
Share on other sites

Posted

This is great! I think that we'll make something out of this :mellow:

About two functions...

Maybe just one, like this:

#include "WinHTTP.au3"


Global $hw_open = _WinHttpOpen()
If @error Then
	MsgBox(48, "Error", "Error initializing the usage of WinHTTP functions.")
	Exit
EndIf

Global $hw_connect = _WinHttpConnect($hw_open, "www.autoit.de")
If @error Then
	MsgBox(48, "Error", "Error specifying the initial target server of an HTTP request.")
	_WinHttpCloseHandle($hw_open)
	Exit
EndIf

Global $h_openRequest = _WinHttpOpenRequest($hw_connect)
If @error Then
	MsgBox(48, "Error", "Error creating an HTTP request handle.")
	_WinHttpCloseHandle($hw_connect)
	_WinHttpCloseHandle($hw_open)
	Exit
EndIf

_WinHttpSendRequest($h_openRequest)
If @error Then
	MsgBox(48, "Error", "Error sending the specified request.")
	_WinHttpCloseHandle($hw_connect)
	_WinHttpCloseHandle($hw_open)
	Exit
EndIf

_WinHttpReceiveResponse($h_openRequest)

If _WinHttpQueryDataAvailable($h_openRequest) Then
	Global $header = _WinHttpQueryHeaders($h_openRequest)
	ConsoleWrite($header & @CRLF & @CRLF)
	Global $chunk, $data, $extended
	While 1
		$chunk = X_WinHttpReadData($h_openRequest, 2)
		If Not @extended Then ExitLoop
		$data = _WinHttpBinaryConcat($data, $chunk)		
	WEnd
	ConsoleWrite(BinaryToString($data, 4) & @CRLF)
Else
	MsgBox(48, "Error", "Site is experiencing problems.")
EndIf

_WinHttpCloseHandle($h_openRequest)
_WinHttpCloseHandle($hw_connect)
_WinHttpCloseHandle($hw_open)


; #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 taken to be ANSI related).
;                  $iNumberOfBytesToRead - Integer value that contains the number of bytes to read. Default is 8192 bytes.
; Return values .: Success - Returns data read.
;                          - Sets @error to 0
;                  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 X_WinHttpReadData($hRequest, $iMode = 0, $iNumberOfBytesToRead = 8192) 

	Local $lpBuffer
	
	Switch $iMode
		Case 0
			$lpBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]")
		Case 1, 2
			$lpBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]")
	EndSwitch
	
	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpReadData", _
			"hwnd", $hRequest, _
			"ptr", DllStructGetPtr($lpBuffer), _
			"ulong", $iNumberOfBytesToRead, _
			"dword*", 0)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, "")
	EndIf

	Switch $iMode
		Case 0
			Return SetError(0, $a_iCall[4], StringLeft(DllStructGetData($lpBuffer, 1), $a_iCall[4]))
		Case 1
			Return SetError(0, $a_iCall[4], BinaryToString(BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]), 4))
		Case 2
			Return SetError(0, $a_iCall[4], BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]))
	EndSwitch

EndFunc   

; #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) & IsBinary($bBinary2)
		Case 0
			Return SetError(1, 0, 0)
		Case 1
            Return SetError(0, 0, $bBinary2)
        Case 10
            Return SetError(0, 0, $bBinary1)
    EndSwitch			
	
	Local $iLen1 = BinaryLen($bBinary1)
	Local $iLen2 = BinaryLen($bBinary2)
	
	Local $struct = DllStructCreate("byte[" & $iLen1 & "];byte[" & $iLen2 & "]")
	DllStructSetData($struct, 1, $bBinary1)
	DllStructSetData($struct, 2, $bBinary2)
	
	Return DllStructGetData(DllStructCreate("byte[" & $iLen1 + $iLen2 & "]", DllStructGetPtr($struct)), 1)
	
EndFunc   ;==>_WinHttpBinaryConcatoÝ÷ Ù8Z¶+(¥éâaÊh²ÈX­É«­¢+Ø¥¹±ÕÅÕ½Ðí]¥¹!QQ@¹ÔÌÅÕ½Ðì(()±½°ÀÌØí¡Ý}½Á¸ô}]¥¹!ÑÑÁ=Á¸ ¤)%ÉɽÈQ¡¸(%5Í	½à Ðà°ÅÕ½ÐíÉɽÈÅÕ½Ðì°ÅÕ½ÐíÉɽȥ¹¥Ñ¥±¥é¥¹Ñ¡Õͽ]¥¹!QQ@չѥ½¹Ì¸ÅÕ½Ðì¤(%á¥Ð)¹%()±½°ÀÌØí¡Ý}½¹¹Ðô}]¥¹!ÑÑÁ
½¹¹Ð ÀÌØí¡Ý}½Á¸°ÅÕ½ÐíÝÝܹÕѽ¥Ð¹ÅÕ½Ðì¤)%ÉɽÈQ¡¸(%5Í	½à Ðà°ÅÕ½ÐíÉɽÈÅÕ½Ðì°ÅÕ½ÐíÉɽÈÍÁ¥å¥¹Ñ¡¥¹¥Ñ¥°ÑÉÐÍÉÙȽ¸!QQ@ÉÅÕÍиÅÕ½Ðì¤(%}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½Á¸¤(%á¥Ð)¹%()±½°ÀÌØí¡}½Á¹IÅÕÍÐô}]¥¹!ÑÑÁ=Á¹IÅÕÍÐ ÀÌØí¡Ý}½¹¹Ð¤)%ÉɽÈQ¡¸(%5Í	½à Ðà°ÅÕ½ÐíÉɽÈÅÕ½Ðì°ÅÕ½ÐíÉɽÈÉÑ¥¹¸!QQ@ÉÅÕÍС¹±¸ÅÕ½Ðì¤(%}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½¹¹Ð¤(%}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½Á¸¤(%á¥Ð)¹%()}]¥¹!ÑÑÁM¹IÅÕÍÐ ÀÌØí¡}½Á¹IÅÕÍФ)%ÉɽÈQ¡¸(%5Í	½à Ðà°ÅÕ½ÐíÉɽÈÅÕ½Ðì°ÅÕ½ÐíÉɽÈ͹¥¹Ñ¡ÍÁ¥¥ÉÅÕÍиÅÕ½Ðì¤(%}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½¹¹Ð¤(%}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½Á¸¤(%á¥Ð)¹%()}]¥¹!ÑÑÁI¥ÙIÍÁ½¹Í ÀÌØí¡}½Á¹IÅÕÍФ()%}]¥¹!ÑÑÁEÕÉåÑÙ¥±± ÀÌØí¡}½Á¹IÅÕÍФQ¡¸(%±½°ÀÌØí¡Èô}]¥¹!ÑÑÁEÕÉå!ÉÌ ÀÌØí¡}½Á¹IÅÕÍФ(%
½¹Í½±]É¥Ñ ÀÌØí¡ÈµÀì
I1µÀì
I1¤(%±½°ÀÌØí¡Õ¹¬°ÀÌØíÑ°ÀÌØíáѹ(%]¡¥±Ä($$ÀÌØí¡Õ¹¬ôa}]¥¹!ÑÑÁIÑ ÀÌØí¡}½Á¹IÅÕÍаĤ($%%9½ÐáѹQ¡¸á¥Ñ1½½À($$ÀÌØíѵÀìôÀÌØí¡Õ¹¬$(%]¹(%
½¹Í½±]É¥Ñ ÀÌØíѵÀì
I1¤)±Í(%5Í	½à Ðà°ÅÕ½ÐíÉɽÈÅÕ½Ðì°ÅÕ½ÐíM¥Ñ¥ÌáÁÉ¥¹¥¹Áɽ±µÌ¸ÅÕ½Ðì¤)¹%()}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡}½Á¹IÅÕÍФ)}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½¹¹Ð¤)}]¥¹!ÑÑÁ
±½Í!¹± ÀÌØí¡Ý}½Á¸¤(((ìU9
Q%=8ìôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôô(ì(ì9µ¸¸¸¸¸¸¸¸¸¸¸è}]¥¹!ÑÑÁIÑ(ìÍÉ¥ÁÑ¥½¸¸¸¸èIÌÑɽ´¡¹±½Á¹äÑ¡}]¥¹!ÑÑÁ=Á¹IÅÕÍÐ ¤Õ¹Ñ¥½¸¸(ìMå¹Ñุ¸¸¸¸¸¸¸è}]¥¹!ÑÑÁIÑ ÀÌØí¡IÅÕÍÐl°¥5½l°ÀÌØí¥9ÕµÉ=	åÑÍQ½Iut¤(ìAɵÑÉ̸¸¸¸èÀÌØí¡IÅÕÍдY±¥¡¹±ÉÑÕɹɽ´ÁÉÙ¥½Õ̱°Ñ¼}]¥¹!ÑÑÁ=Á¹IÅÕÍÐ ¤¸(ìÀÌØí¥5½´%¹ÑÈÉÁÉ͹ѥ¹É¥¹µ½¸Õ±Ð¥ÌÀ¡¡ÉÍÐ¥ÌÑ­¸Ñ¼9M$ɱѤ¸(ìÀÌØí¥9ÕµÉ=	åÑÍQ½I´%¹ÑÈÙ±Õѡн¹Ñ¥¹ÌÑ¡¹ÕµÈ½åÑÌѼɸձХÌàÄäÈåÑ̸(ìIÑÕɸٱÕ̸èMÕÍÌ´IÑÕɹÌÑɸ(ì´MÑÌÉɽÈѼÀ(쥱ÕÉ´IÑÕɹ̵ÁÑäÍÑÉ¥¹¹ÍÑÌÉɽÈè(ìðÄ´±±
±°¥±¸(ìÕÑ¡½È¸¸¸¸¸¸¸¸èÑɹáà°Aɽ¹ä(ì5½¥¥¸¸¸¸¸¸¸è(ìIµÉ­Ì¸¸¸¸¸¸¸è¥5½¸¡ÙÑ¡ÍÙ±ÕÌè(ìðÀ´9M$(ìðÄ´UQà(ìðÈ´	¥¹Éä(ìI±Ñ¸¸¸¸¸¸¸è(ì1¥¹¬¸¸¸¸¸¸¸¸¸¸ì¡ÑÑÀè¼½µÍ¸¹µ¥É½Í½Ð¹½´½¸µÕ̽±¥ÉÉä½ÌàÐÄÀСYL¸àÔ¤¹ÍÁà(ìáµÁ±¸¸¸¸¸¸¸ìeÌ(ì(ìôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôô)Õ¹a}]¥¹!ÑÑÁIÑ ÀÌØí¡IÅÕÍаÀÌØí¥5½ôÀ°ÀÌØí¥9ÕµÉ=	åÑÍQ½IôàÄäȤ((%1½°ÀÌØí±Á	ÕÈ($(%MÝ¥Ñ ÀÌØí¥5½($%
ÍÀ($$$ÀÌØí±Á	ÕÈô±±MÑÉÕÑ
ÉÑ ÅÕ½Ðí¡ÉlÅÕ½ÐìµÀìÀÌØí¥9ÕµÉ=	åÑÍQ½IµÀìÅÕ½ÐítÅÕ½Ðì¤($%
ÍÄ°È($$$ÀÌØí±Á	ÕÈô±±MÑÉÕÑ
ÉÑ ÅÕ½ÐíåÑlÅÕ½ÐìµÀìÀÌØí¥9ÕµÉ=	åÑÍQ½IµÀìÅÕ½ÐítÅÕ½Ðì¤(%¹MÝ¥Ñ ($(%1½°ÀÌØí}¥
±°ô±±
±° ÅÕ½Ðí]¥¹¡ÑÑÀ¹±°ÅÕ½Ðì°ÅÕ½Ðí¥¹ÐÅÕ½Ðì°ÅÕ½Ðí]¥¹!ÑÑÁIÑÅÕ½Ðì°|($$$ÅÕ½Ðí¡Ý¹ÅÕ½Ðì°ÀÌØí¡IÅÕÍа|($$$ÅÕ½ÐíÁÑÈÅÕ½Ðì°±±MÑÉÕÑÑAÑÈ ÀÌØí±Á	ÕȤ°|($$$ÅÕ½ÐíÕ±½¹ÅÕ½Ðì°ÀÌØí¥9ÕµÉ=	åÑÍQ½I°|($$$ÅÕ½ÐíݽɨÅÕ½Ðì°À¤((%%ÉɽÈ=È9½ÐÀÌØí}¥
±±lÁtQ¡¸($%MÑÉÉ½È Ä°À°ÅÕ½ÐìÅÕ½Ðì¤(%¹%((%MÝ¥Ñ ÀÌØí¥5½($%
ÍÀ($$%IÑÕɸMÑÉÉ½È À°ÀÌØí}¥
±±lÑt°MÑÉ¥¹1С±±MÑÉÕÑÑÑ ÀÌØí±Á	ÕȰĤ°ÀÌØí}¥
±±lÑt¤¤($%
ÍÄ($$%IÑÕɸMÑÉÉ½È À°ÀÌØí}¥
±±lÑt°	¥¹ÉåQ½MÑÉ¥¹¡	¥¹Éå5¥¡±±MÑÉÕÑÑÑ ÀÌØí±Á	ÕȰĤ°Ä°ÀÌØí}¥
±±lÑt¤°Ð¤¤($%
ÍÈ($$%IÑÕɸMÑÉÉ½È À°ÀÌØí}¥
±±lÑt°	¥¹Éå5¥¡±±MÑÉÕÑÑÑ ÀÌØí±Á	ÕȰĤ°Ä°ÀÌØí}¥
±±lÑt¤¤(%¹MÝ¥Ñ ()¹Õ¹

Prefix "X" is used not to colide with current _WinHttpReadData() function

Find flaw, if any.

Maybe to set UTF-8 as default?

Share this post


Link to post
Share on other sites

Posted (edited)

Good idea :mellow: But it would be faster, if it doesn't use BinaryMid/StringLeft when it is not needed:

...
	Select
		Case @error Or Not $a_iCall[0]
			Return SetError(1)
		Case Not $a_iCall[4]
			Return SetError(0)
		Case $a_iCall[4] < $iNumberOfBytesToRead
			Switch $iMode
				Case 0
					Return SetError(0, $a_iCall[4], StringLeft(DllStructGetData($lpBuffer, 1), $a_iCall[4]))
				Case 1
					Return SetError(0, $a_iCall[4], BinaryToString(BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]), 4))
				Case 2
					Return SetError(0, $a_iCall[4], BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]))
			EndSwitch
	EndSelect
   
			Switch $iMode
				Case 0,2
					Return SetError(0, $a_iCall[4], DllStructGetData($lpBuffer, 1), $a_iCall[4])
				Case 1
					Return SetError(0, $a_iCall[4], BinaryToString(DllStructGetData($lpBuffer, 1), 4))
			EndSwitch
Edited by ProgAndy

Share this post


Link to post
Share on other sites

Posted

Good idea :mellow: But it would be faster, if it doesn't use BinaryMid/StringLeft when it is not needed:

...
	Select
		Case @error Or Not $a_iCall[0]
			Return SetError(1)
		Case Not $a_iCall[4]
			Return SetError(0)
		Case $a_iCall[4] < $iNumberOfBytesToRead
			Switch $iMode
				Case 0
					Return SetError(0, $a_iCall[4], StringLeft(DllStructGetData($lpBuffer, 1), $a_iCall[4]))
				Case 1
					Return SetError(0, $a_iCall[4], BinaryToString(BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]), 4))
				Case 2
					Return SetError(0, $a_iCall[4], BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]))
			EndSwitch
	EndSelect
   
			Switch $iMode
				Case 0,2
					Return SetError(0, $a_iCall[4], DllStructGetData($lpBuffer, 1), $a_iCall[4])
				Case 1
					Return SetError(0, $a_iCall[4], BinaryToString(DllStructGetData($lpBuffer, 1), 4))
			EndSwitch
Considering speed, would this be the fastest way?

Func _WinHttpReadData($hRequest, $iMode = 0, $iNumberOfBytesToRead = 8192) 

	Local $lpBuffer
	
	Switch $iMode
		Case 1, 2
			$lpBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]")
		Case Else
			$iMode = 0
			$lpBuffer = DllStructCreate("char[" & $iNumberOfBytesToRead & "]")
	EndSwitch
	
	Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpReadData", _
			"hwnd", $hRequest, _
			"ptr", DllStructGetPtr($lpBuffer), _
			"ulong", $iNumberOfBytesToRead, _
			"dword*", 0)

	If @error Or Not $a_iCall[0] Then
		SetError(1, 0, "")
	EndIf

    Switch ($a_iCall[4] < $iNumberOfBytesToRead) & $iMode
		Case 0,2
			Return SetError(0, $a_iCall[4], DllStructGetData($lpBuffer, 1))
		Case 1
			Return SetError(0, $a_iCall[4], BinaryToString(DllStructGetData($lpBuffer, 1), 4))
		Case 10
			Return SetError(0, $a_iCall[4], StringLeft(DllStructGetData($lpBuffer, 1), $a_iCall[4]))
		Case 11
			Return SetError(0, $a_iCall[4], BinaryToString(BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]), 4))
		Case 12
			Return SetError(0, $a_iCall[4], BinaryMid(DllStructGetData($lpBuffer, 1), 1, $a_iCall[4]))
	EndSwitch

EndFunc

Share this post


Link to post
Share on other sites

Posted

I think compare strings and converting is slower :mellow:.. just test it ( TimerInit, TimerDiff :(

Share this post


Link to post
Share on other sites

Posted

I think compare strings and converting is slower :mellow:.. just test it ( TimerInit, TimerDiff :(

If I'm not making any mistake and if producing same conditions test would look like this:

Global $end1, $end2, $res_prog, $res_tran

For $i = 1 To 30000

$error_ = Random(0, 1, 1)
$a_iCall_0_ = Random(0, 1, 1)
$a_iCall_4_ = Random(0, 1, 1)
$iNumberOfBytesToRead_ = Random(0, 8192, 1)
$iMode_ = Random(0, 2, 1)

$start1 = TimerInit()
$res_tran += tran($error_, $a_iCall_0_, $a_iCall_4_, $iNumberOfBytesToRead_, $iMode_)
$end1 += TimerDiff($start1)


$start2 = TimerInit()
$res_prog += Prog($error_, $a_iCall_0_, $a_iCall_4_, $iNumberOfBytesToRead_, $iMode_)
$end2 += TimerDiff($start2)

Next

$speed1 = 1000 * $end1 / ($i - 1)
$speed2 = 1000 * $end2 / ($i - 1)


ConsoleWrite("tran = " & $speed1 & " per sec. Result to verify $res_tran = " & $res_tran & @CRLF)
ConsoleWrite("Prog = " & $speed2 & " per sec. Result to verify $res_prog = " & $res_prog & @CRLF)



Func tran($error, $a_iCall_0, $a_iCall_4, $iNumberOfBytesToRead, $iMode)

	Switch $iMode
		Case 1, 2
		Case Else
			$iMode = 0
	EndSwitch

	If $error Or Not $a_iCall_0 Then
		Return SetError(1, 0, 0)
	EndIf

	If Not $a_iCall_4 Then
		Return SetError(0, 0, 0)
	EndIf
	
	Switch ($a_iCall_4 < $iNumberOfBytesToRead) & $iMode
		Case 0, 2
			Return SetError(0, $a_iCall_4, 1)
		Case 1
			Return SetError(0, $a_iCall_4, 3)
		Case 10
			Return SetError(0, $a_iCall_4, 5)
		Case 11
			Return SetError(0, $a_iCall_4, 7)
		Case 12
			Return SetError(0, $a_iCall_4, 9)
	EndSwitch
	
EndFunc   



Func Prog($error, $a_iCall_0, $a_iCall_4, $iNumberOfBytesToRead, $iMode)
	
	Switch $iMode
		Case 1, 2
		Case Else
			$iMode = 0
	EndSwitch
	
	Select
		Case $error Or Not $a_iCall_0
			Return SetError(1, 0, 0)
		Case Not $a_iCall_4
			Return SetError(0, 0, 0)
		Case $a_iCall_4 < $iNumberOfBytesToRead
			Switch $iMode
				Case 0
					Return SetError(0, $a_iCall_4, 5)
				Case 1
					Return SetError(0, $a_iCall_4, 7)
				Case 2
					Return SetError(0, $a_iCall_4, 9)
			EndSwitch
	EndSelect

	Switch $iMode
		Case 0, 2
			Return SetError(0, $a_iCall_4, 1)
		Case 1
			Return SetError(0, $a_iCall_4, 3)
	EndSwitch
	
EndFunc

I'm getting slightly better results using "&" metod.

Doing that test I found that returning empty string is for some reason done faster than returning 0. (Maybe what comes after it is faster, didn't test that)

Share this post


Link to post
Share on other sites

Posted

Example of two more functions. One to get IE proxy configuration and other for current WinHTTP proxy configuration:

#include "WinHTTP.au3"
#include <Array.au3>


; Internet Explorer proxy configuration for the current user:
$IEproxy_array = _WinHttpGetIEProxyConfigForCurrentUser()
_ArrayDisplay($IEproxy_array, "Internet Explorer proxy configuration")

; Current WinHTTP proxy configuration:
$proxy_array = _WinHttpGetDefaultProxyConfiguration()
_ArrayDisplay($proxy_array, "Current WinHTTP proxy configuration")

Share this post


Link to post
Share on other sites

Posted

Is it possible to use this to upload an image? If so... how do I do it?

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.