Quantcast
Channel: AutoIt v3 - General Help and Support
Viewing all articles
Browse latest Browse all 12506

Sending files using HTTP post: (total bytes written = 0)

$
0
0

Hi everybody,

 

I'm currently working on a script for sending files to a remote server by using the HTTP post method.

It's not my fav. way of sending files, but the remote party only supports this method.

So be it.

 

After digging through many examples over the net, I've managed to create a script that seems to do the trick.

 

There is one issue with my approach.

When I'm checking the returned @extended value from _WinHttpWriteData it always returns 0, despite a 200 OK status code from the remote site.

How come, what am I doing wrong here.

 

The script runs against a public httppost test server, so if needed you can run the script as well.

 

Thanks for your time.

AutoIt         
  1. #include <WinHttp.au3>
  2.  
  3. If FileExists(@ScriptDir & "\a_text_file.txt") Then
  4.     SendFile("a_text_file.txt")
  5.     MsgBox(64,"Error","Unknown file, nothing to do")
  6.  
  7. If FileExists(@ScriptDir & "\another_text_file.txt") Then
  8.     SendFile("another_text_file.txt")
  9.     MsgBox(64,"Error","Unknown file, nothing more to do")
  10.  
  11.  
  12. Func SendFile($sFileName)
  13.  
  14.  
  15.     Local $sFolder = @ScriptDir & "\"
  16.     Local $sFileData = FileRead($sFolder & $sFileName)
  17.     Local $iFileLen = StringLen($sFileData)
  18.  
  19.     Local $bUseProxy = 0
  20.     Local $sProxyIP = "0.0.0.0"
  21.     Local $sProxyPort = "8080"
  22.  
  23.     Local $sUserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"
  24.     Local $sMethod = "POST"
  25.     Local $sHttpVersion = "HTTP/1.1"
  26.  
  27.     Local $iBytesWritten
  28.     Local $sResponseHeader
  29.     Local $sResponseData
  30.     Local $hSession
  31.     Local $hConnect
  32.     Local $hRequest
  33.  
  34.     Local $sUrlPrefix = "http://"
  35.     Local $sHostName = "posttestserver.com"
  36.     Local $sUrlSuffix = "/"
  37.     Local $sPHP_Script = "post.php"
  38.     Local $sPHP_Param = "?dump&html&dir=testing_the_script"
  39.  
  40.     Local $sUserName = ""
  41.     Local $sUserPass = ""
  42.  
  43.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  44.     ; 1) Create/Open a session handle
  45.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  46.  
  47.     ;Depending on using a proxy we use the appropriate function call
  48.     If $bUseProxy = 1 Then
  49.         $hSession = _WinHttpOpen($sUserAgent,$WINHTTP_ACCESS_TYPE_NAMED_PROXY,$sProxyIP & ":" & $sProxyPort,$WINHTTP_NO_PROXY_BYPASS,0)
  50.         If @error Then ConsoleWriteError("Step 1) _WinHttpOpen(" & $sUserAgent & "," & $WINHTTP_ACCESS_TYPE_NAMED_PROXY & "," & $sProxyIP & ":" & $sProxyPort & "," & $WINHTTP_NO_PROXY_BYPASS & ",0) raises error: " & @error & @CRLF)
  51.         ConsoleWrite("Step 1) Proxy ==> $hSession: " & $hSession & @CRLF)
  52.     Else
  53.         $hSession = _WinHttpOpen($sUserAgent, $WINHTTP_ACCESS_TYPE_NO_PROXY,$WINHTTP_NO_PROXY_NAME,$WINHTTP_NO_PROXY_BYPASS,0)
  54.         If @error Then ConsoleWriteError("Step 1) _WinHttpOpen(" & $sUserAgent & "," & $WINHTTP_ACCESS_TYPE_NO_PROXY & "," & $WINHTTP_NO_PROXY_NAME & "," & $WINHTTP_NO_PROXY_BYPASS & ",0) raises error: " & @error & @CRLF)
  55.         ConsoleWrite("Step 1) No proxy ==> $hSession: " & $hSession & @CRLF)
  56.     EndIf
  57.  
  58.  
  59.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  60.     ; 2) Create/Open connection handle
  61.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  62.  
  63.     ; Are we using HTTP or HTTPS?
  64.     If StringInStr($sUrlPrefix,"Https",0) Then  ; HTTPS
  65.         If $hSession Then $hConnect = _WinHttpConnect($hSession,$sURLPrefix & $sHostName & $sUrlSuffix,$INTERNET_DEFAULT_HTTPS_PORT)
  66.         ConsoleWrite("Step 2) Executing function _WinHttpConnect(" & $hSession & "," & $sURLPrefix & $sHostName & $sUrlSuffix & "," & $INTERNET_DEFAULT_HTTPS_PORT & ") " & @CRLF)
  67.         ConsoleWrite("Step 2) $hConnect: " & $hConnect & @CRLF)
  68.  
  69.     Else        ; HTTP
  70.         If $hSession Then $hConnect = _WinHttpConnect($hSession,$sURLPrefix & $sHostName & $sUrlSuffix,$INTERNET_DEFAULT_HTTP_PORT)
  71.         ConsoleWrite("Step 2) Executing function _WinHttpConnect(" & $hSession & "," & $sURLPrefix & $sHostName & $sUrlSuffix & "," & $INTERNET_DEFAULT_HTTP_PORT & ") " & @CRLF)
  72.         ConsoleWrite("Step 2) $hConnect: " & $hConnect & @CRLF)
  73.     EndIf
  74.  
  75.  
  76.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  77.     ; 3a) Create/Open a request handle
  78.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  79.  
  80.     ; Are we using HTTP or HTTPS?
  81.     If StringInStr($sUrlPrefix,"Https",0) Then  ; HTTPS
  82.         If $hConnect Then $hRequest = _WinHttpOpenRequest($hConnect,$sMethod, $sUrlSuffix & $sPHP_Script & $sPHP_Param, $sHttpVersion,$WINHTTP_NO_REFERER, "*/*", $WINHTTP_FLAG_SECURE)
  83.         ConsoleWrite("Step 3a) Executing funcion: _WinHttpOpenRequest(" & $hConnect & "," & $sMethod & "," & $sUrlSuffix & $sPHP_Script & $sPHP_Param & "," & $sHttpVersion & "," & $WINHTTP_NO_REFERER & ",*/*," & $WINHTTP_FLAG_SECURE & ")" & @CRLF)
  84.         ConsoleWrite("Step 3a) $hRequest: " & $hRequest & @CRLF)
  85.     Else        ; HTTP
  86.         If $hConnect Then $hRequest = _WinHttpOpenRequest($hConnect,$sMethod, $sUrlSuffix & $sPHP_Script & $sPHP_Param, $sHttpVersion,$WINHTTP_NO_REFERER, "*/*", Default)
  87.         ConsoleWrite("Step 3a) Executing funcion: _WinHttpOpenRequest(" & $hConnect & "," & $sMethod & "," & $sUrlSuffix & $sPHP_Script & $sPHP_Param & "," & $sHttpVersion & "," & $WINHTTP_NO_REFERER & ",*/*," & Default & ")" & @CRLF)
  88.         ConsoleWrite("Step 3a) $hRequest: " & $hRequest & @CRLF)
  89.     EndIf
  90.  
  91.     If $sUserName <> "" Then
  92.         ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  93.         ; 3b)Pass credentionals before sending a request
  94.         ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  95.         _WinHttpSetCredentials($hRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, $sUserName,$sUserPass)
  96.         If @error Then ConsoleWriteError("Step 3b) _WinHttpSetCredentials raised an error: " & @error & @CRLF)
  97.         ConsoleWrite("Step 3b) Executing funcion: _WinHttpSetCredentials(" & $hRequest & "," & $WINHTTP_AUTH_TARGET_SERVER & "," & $WINHTTP_AUTH_SCHEME_BASIC & "," & $sUserName & "," & $sUserPass & ")" & @CRLF)
  98.  
  99.  
  100.         ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  101.         ; 3c)Send the request
  102.         ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  103.         If $hRequest Then _WinHttpSendRequest($hRequest,$WINHTTP_NO_ADDITIONAL_HEADERS,$WINHTTP_NO_REQUEST_DATA,0,0)
  104.         If @error Then ConsoleWriteError("Step 3c) _WinHttpSendRequest raised an error: " & @error & @CRLF)
  105.         ConsoleWrite("Step 3c) Executing funcion: _WinHttpSendRequest(" & $hRequest & "," & $WINHTTP_NO_ADDITIONAL_HEADERS & "," & $WINHTTP_NO_REQUEST_DATA & ",0,0)" & @CRLF)
  106.         ConsoleWrite("Step 3c) $hRequest: " & $hRequest & @CRLF)
  107.  
  108.  
  109.         ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  110.         ; 3d) End the request
  111.         ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  112.         _WinHttpReceiveResponse($hRequest)
  113.  
  114.         $sResponseHeader = _WinHttpQueryHeaders($hRequest)
  115.         If @error Then ConsoleWriteError("Step 3d) _WinHttpQueryHeaders raised an error: " & @error & @CRLF)
  116.         ConsoleWrite("Step 3d) $sResponseHeader: " & $sResponseHeader & @CRLF)
  117.  
  118.         $iStatusCode = _WinHttpQueryHeaders($hRequest,$WINHTTP_QUERY_STATUS_CODE)
  119.         If @error Then ConsoleWriteError("Step 3d) _WinHttpQueryHeaders raised an error: " & @error & @CRLF)
  120.         ConsoleWrite("Step 3d) $iStatusCode: " & $iStatusCode & @CRLF & @CRLF)
  121.     EndIf
  122.  
  123.  
  124.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  125.     ; 4) Send the next request
  126.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  127.     _WinHttpSendRequest($hRequest,$WINHTTP_NO_ADDITIONAL_HEADERS, $sFileData, $iFileLen,Default)
  128.  
  129.     If @error Then ConsoleWriteError("Step 4) _WinHttpSendRequest raised an error: " & @error & @CRLF)
  130.     ConsoleWrite("Step 4) Executing function _WinHttpSendRequest(" & $hRequest & "," & $WINHTTP_NO_ADDITIONAL_HEADERS & "," &  $sFileData & "," & $iFileLen & ",Default)" & @CRLF)
  131.     ConsoleWrite("Step 4) $hRequest: " & $hRequest & @CRLF)
  132.  
  133.  
  134.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  135.     ; 5) Write data to server
  136.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  137.     _WinHttpWriteData($hRequest,$sFileData,0)
  138.  
  139.     ;Success - Returns 1
  140.     ;- @extended receives the number of bytes written.
  141.  
  142.     $iBytesWritten = @extended
  143.     ;Despite a successful post, @extended remains 0
  144.     ;Why??????
  145.  
  146.     ConsoleWrite("Step 5) Executing function _WinHttpWriteData(" & $hRequest & "," & $sFileData & ",0)" & @CRLF)
  147.     If @error Then
  148.         ConsoleWriteError("Step 5) _WinHttpWriteData raised an error: " & @error & @CRLF)
  149.     Else
  150.         ConsoleWrite("Step 5) File " & $sFolder & $sFileName & " succesfully send to " & $sHostName & " Total bytes written: " & $iBytesWritten & @CRLF)
  151.     EndIf
  152.  
  153.  
  154.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  155.     ; 6) End the request
  156.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  157.     _WinHttpReceiveResponse($hRequest)
  158.  
  159.  
  160.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  161.     ; 7) Show response from server
  162.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  163.     $sResponseHeader = _WinHttpQueryHeaders($hRequest)
  164.     ConsoleWrite("Step 7) $sResponseHeader: " & $sResponseHeader & @CRLF)
  165.  
  166.     $iStatusCode = _WinHttpQueryHeaders($hRequest,$WINHTTP_QUERY_STATUS_CODE)
  167.     ConsoleWrite("Step 7) $iStatusCode: " & $iStatusCode & @CRLF)
  168.     ConsoleWrite("Step 7) Remote server responded with: " & _WinHttpReadData($hRequest) & @CRLF)
  169.  
  170.  
  171.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  172.     ; 8) Close handles
  173.     ; -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  174.     _winHttpCloseHandle($hRequest)
  175.     _winHttpCloseHandle($hConnect)
  176.     _winHttpCloseHandle($hSession)
  177.  

Attached Files


Viewing all articles
Browse latest Browse all 12506

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>