Jump to content

WinINet.au3 (FTP/HTTP/HTTPS/Gopher+)


-Ultima-
 Share

Recommended Posts

The file finding functions really need polishing. I implemented them without giving them much of a second though (not even close to anything one might call "testing"). I was planning on giving them an update not unlike the updates I made for the cache enumerating functions (pull the data out of the structures and return an array). Until then, I wouldn't bother trying to use any of the functions that involve "find the first entry, then use another function to enumerate the rest one at a time."

Regarding examples... I do intend on creating tons of examples, but I want to make sure I don't need to make fundamental widespread implementation changes. The reason I'm holding out on that possibility is that I'm not yet intimately familiar with WinINet to really know the best way to do anything. It's a WIP at the moment ;) I'll be working on examples from here on to help me catch bugs and such, though.

As for what advantages these functions have over FTP.au3... Well, I wouldn't say they have too much, other than having a cohesive API across multiple protocols. It's a complete reimplementation of sorts that's slightly more flexible.

Edited by -Ultima-

[ WinINet.au3 | Array.au3 (Optimized) | _UnixTimeParse() ]

Link to comment
Share on other sites

The file finding functions really need polishing. I implemented them without giving them much of a second though (not even close to anything one might call "testing"). I was planning on giving them an update not unlike the updates I made for the cache enumerating functions (pull the data out of the structures and return an array). Until then, I wouldn't bother trying to use any of the functions that involve "find the first entry, then use another function to enumerate the rest one at a time."

Regarding examples... I do intend on creating tons of examples, but I want to make sure I don't need to make fundamental widespread implementation changes. The reason I'm holding out on that possibility is that I'm not yet intimately familiar with WinINet to really know the best way to do anything. It's a WIP at the moment ;) I'll be working on examples from here on to help me catch bugs and such, though.

As for what advantages these functions have over FTP.au3... Well, I wouldn't say they have too much, other than having a cohesive API across multiple protocols. It's a complete reimplementation of sorts that's slightly more flexible.

Ultima,

Thanks for the update. I look forward to your next release. In the meantime, I have been creating some examples of some of your common functions as I worked through them my self. They can be found at the following link for anyone interested:

http://autoit.netfirms.com/public/

Edited by HeidiR
HeidiRFind free applications, code examples and more on my site at:http://heidisdownloads.com/
Link to comment
Share on other sites

You need to call DllOpen("wininet.dll")

You just saved my scalp, as I was almost ripping my hair out. That fixed all of my problems. See, I was working on a script that zipped my website files using 7zip and uploading it via FTP. The 7zip'ing worked fine, but the FTP calls were failing (I ended up switching to the FTP.au3 UDF to see if I had luck with that, but it had the same issue). I read this. I called DLLOpen("wininet.au3") at the beginning of the script, and both FTP.au3 and this UDF worked fine. Sorry, but I still ended up using FTP.au3 ;)

I might post the script later on.

Link to comment
Share on other sites

@ Ultima

Things seems to be moving along nicely and I appriciate all the hard work.

I used the example: _WinINet_FindFirstUrlCacheEntry.au3, and I was surprised to see it stop after just returning 2 files.

It seems that $avCacheEntryInfo = _WinINet_FindNextUrlCacheEntry($hCacheEntry) doesn't always an return an Array so in your example it exists the main loop.

The thing is that my IE cache contains 12 folders, 2922 files which seems to be spread pretty equally across the 12 folders. And there is a total of 254 JPGs.

I modified your example script to count a few things:

;#include <WinINet.au3>
#include "WinINet.au3"

Global $hWinINetDll = DllOpen("wininet.dll")
Global $iPtr, $iLength, $avCacheEntry = _WinINet_FindFirstUrlCacheEntry()

Global $hCacheEntry = $avCacheEntry[0]
Global $avCacheEntryInfo = $avCacheEntry[1]
$avCacheEntry = 0

Local $sExtension = "jpg"
Local $iJPG = 0
Local $iNotJPG = 0
Local $iNotArray = 0
Local $iNotArrayTotal = 0
Local $iTotalLoops = 0

While Not @error
    
    $iTotalLoops = $iTotalLoops + 1
    
    If IsArray($avCacheEntryInfo) Then
        If StringLower(StringRight($avCacheEntryInfo[2], StringLen($sExtension))) = StringLower($sExtension) Then
            $iJPG = $iJPG + 1
        Else
            $iNotJPG = $iNotJPG + 1
        EndIf
    EndIf
    
    $avCacheEntryInfo = _WinINet_FindNextUrlCacheEntry($hCacheEntry)
    
    If NOT IsArray($avCacheEntryInfo) Then
        $iNotArray = $iNotArray + 1
    ElseIf $iNotArray > 0 Then
        ConsoleWrite("$iNotArray: " & $iNotArray & @CRLF)
        $iNotArrayTotal = $iNotArrayTotal + $iNotArray
        $iNotArray = 0
    EndIf
    
    If $iNotArray = 2000 Then   ; after 2000 I don't expect any more results
        ConsoleWrite("$iNotArray: " & $iNotArray & @CRLF)
        ExitLoop
    EndIf
    
WEnd

_WinINet_FindCloseUrlCache($hCacheEntry)
DllClose($hWinINetDll)

$iTotalLoops = $iTotalLoops - $iNotArray + 1

ConsoleWrite("----------" & @CRLF)
ConsoleWrite("$iTotalLoops: " & $iTotalLoops & @CRLF)
ConsoleWrite("$iTotalEmpy: " & $iNotArrayTotal & @CRLF)
ConsoleWrite("$iJPG: " & $iJPG & @CRLF)
ConsoleWrite("$iNotJPG: " & $iNotJPG & @CRLF)
ConsoleWrite("----------" & @CRLF)

In the end this is the result:

$iTotalLoops: 1565 << expected : 2922

$iTotalEmpy: 791

$iJPG: 151 << expected : 254

$iNotJPG: 623

I'm not sure if this is a problem in _WinINet_FindNextUrlCacheEntry(), or a problem with my cache (I'll clean it up and will try again), or may be me who don't understand everything yet.

Edited by uteotw
Link to comment
Share on other sites

Are you sure you're looking at Start > Run > %tmp%\..\Tempor~1 for comparison? As well, keep in mind that these cache entries enumerations will also list more than actual cache files -- it'll list those "Visited: " entries that don't necessarily have a real file listed in the Temporary Internet Files directory. Your script doesn't seem to show anything unexpected for me (31 cache entries, 7 "Visited: " URLs, for a total of 38 in $iTotalLoops).

Edit: As well, your While loop doesn't break out properly because you're using the wrong stop condition... The loop will never break out even if _WinINet_FindNextUrlCacheEntry() returns with a non-zero @error because you're calling other functions after calling _WinINet_FindNextUrlCacheEntry(), which resets @error.

Edited by -Ultima-

[ WinINet.au3 | Array.au3 (Optimized) | _UnixTimeParse() ]

Link to comment
Share on other sites

your While loop doesn't break out properly because you're using the wrong stop condition... The loop will never break out even if _WinINet_FindNextUrlCacheEntry() returns with a non-zero @error because you're calling other functions after calling _WinINet_FindNextUrlCacheEntry(), which resets @error.

D'oh! forgot to change it to just "While 1"

Are you sure you're looking at Start > Run > %tmp%\..\Tempor~1 for comparison?

Yep, actually I was looking into "C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files\Content.IE5"

So far I had tried on a WinXP x86 and x64, both with IE6.

I've just tried it on a 3rd machine (Win2008 x64 - IE7) with which I don't browse much and your script worked fine.

In the cache folder Windows explorer show 909 files in total, of which 367 are JPGs.

When I tried my script returned:

$iTotalLoops: 978 << 69 more loops than expected and this is explained by what you said "keep in mind that these cache entries enumerations will also list more than actual cache files"

$iTotalEmpy: 0 << good

$iJPG: 367 << as expected

$iNotJPG: 611

I've tried on a 4th machine (XP x86 - IE6) with which I do a lot of browsing and again your example scripts exits before going through all the files and my script returned:

$iTotalLoops: 24773

$iTotalEmpy: 7889

$iJPG: 4580

$iNotJPG: 12304

In the end, I don't know what it is, IE cache becoming corrupt over time or after a certain size?

All I can say is that may be you could try to have more files in your cache. I usually set the cache size to 200MB.

Anyways, I can work around it and still get the info I'm looking for.

Thanks again for the UDF.

Link to comment
Share on other sites

I think there may be a bug in the _WinINet_InternetFindNextFile code. The current code below sets @error to 0 on an error and returns true as if it succeeded.

; Return response

If @error Or Not $avResult[0] Then SetError(1, 0, 0)

Return True

So I just found a little bit of time to work on these UDFs today, and was rereading the comments again... Regarding this, indeed, there was a bug with _WinINet_InternetFindNextFile(). It should read:

If @error Or Not $avResult[0] Then Return SetError(1, 0, False)
Return True

You can return SetError()'s return value immediately, so there's no reason to call SetError() before returning. As such, _WinINet_FtpFindFirstFile() doesn't actually suffer from this issue. I took a look at the functions and decided to create an example:

#Include <WinINet.au3>

; Set variables
Global $sServerName = ""
Global $sDirectory = ""
Global $sFilenameFilter = "*.*"

; Open the WinINet DLL and create handles
Global $hWinINetDll = DllOpen("wininet.dll")
Global $hInternetOpen = _WinINet_InternetOpen("AutoIt/" & @AutoItVersion)
Global $hInternetConnect = _WinINet_InternetConnect($hInternetOpen, $INTERNET_SERVICE_FTP, $sServerName)

; Enumerate directory files
If _WinINet_FtpSetCurrentDirectory($hInternetConnect, $sDirectory) Then
    Global $avFtpFile = _WinINet_FtpFindFirstFile($hInternetConnect, $sFilenameFilter)
    While Not @error
        ConsoleWrite(DllStructGetData($avFtpFile[1], "FileName") & @CRLF)
        _WinINet_InternetFindNextFile($avFtpFile[0], DllStructGetPtr($avFtpFile[1]))
    WEnd
EndIf

; Close handles
_WinINet_InternetCloseHandle($hInternetConnect)
_WinINet_InternetCloseHandle($hInternetOpen)
DllClose($hWinINetDll)

I've updated my copy of WinINet.au3 with minor changes (didn't upload it yet), but the above example should work with the copy I previously uploaded as is. You'll need to change the server name, directory, and optionally, the filename filter to suit your needs.

Edited by -Ultima-

[ WinINet.au3 | Array.au3 (Optimized) | _UnixTimeParse() ]

Link to comment
Share on other sites

So I just found a little bit of time to work on these UDFs today, and was rereading the comments again... Regarding this, indeed, there was a bug with _WinINet_InternetFindNextFile(). It should read:

If @error Or Not $avResult[0] Then Return SetError(1, 0, False)
Return True

You can return SetError()'s return value immediately, so there's no reason to call SetError() before returning. As such, _WinINet_FtpFindFirstFile() doesn't actually suffer from this issue. I took a look at the functions and decided to create an example:

#Include <WinINet.au3>

; Set variables
Global $sServerName = ""
Global $sDirectory = ""
Global $sFilenameFilter = "*.*"

; Open the WinINet DLL and create handles
Global $hWinINetDll = DllOpen("wininet.dll")
Global $hInternetOpen = _WinINet_InternetOpen("AutoIt/" & @AutoItVersion)
Global $hInternetConnect = _WinINet_InternetConnect($hInternetOpen, $INTERNET_SERVICE_FTP, $sServerName)

; Enumerate directory files
If _WinINet_FtpSetCurrentDirectory($hInternetConnect, $sDirectory) Then
    Global $avFtpFile = _WinINet_FtpFindFirstFile($hInternetConnect, $sFilenameFilter)
    While Not @error
        ConsoleWrite(DllStructGetData($avFtpFile[1], "FileName") & @CRLF)
        _WinINet_InternetFindNextFile($avFtpFile[0], DllStructGetPtr($avFtpFile[1]))
    WEnd
EndIf

; Close handles
_WinINet_InternetCloseHandle($hInternetConnect)
_WinINet_InternetCloseHandle($hInternetOpen)
DllClose($hWinINetDll)

I've updated my copy of WinINet.au3 with minor changes (didn't upload it yet), but the above example should work with the copy I previously uploaded as is. You'll need to change the server name, directory, and optionally, the filename filter to suit your needs.

Hi Ultima,

Thanks for the update. One more question on _WinINet_InternetFindNextFile(). I have successfully implemented your _WinINet_InternetFindNextFile() code in a test application and noticed that _WinINet_InternetFindNextFile() returns an error (SetError(1, 0, 0)) when no more file or directories exist in the directory path or I presume a real error occured. Is there any way to know which error occured after calling _WinINet_InternetFindNextFile()?

Example1:

dir path = \xyz\ (which contains 10 files)

call _WinINet_InternetFindNextFile() to get files

On the tenth call, _WinINet_InternetFindNextFile() returns 1 (error), which means no more files

Example2:

dir path = \xyz\ (which contains 10 files)

call _WinINet_InternetFindNextFile() to get files

On the third call, _WinINet_InternetFindNextFile() returns 1 (error), which means a real error occured and there more files to be read

Your thoughts???

HeidiRFind free applications, code examples and more on my site at:http://heidisdownloads.com/
Link to comment
Share on other sites

_WinAPI_GetLastError() and _WinAPI_GetLastErrorMessage() should get the error code/message for you for the last error that occurred. You'll need to call it as soon as the error is detected, though, because as soon as another error occurs, the last error message will be overwritten.

[ WinINet.au3 | Array.au3 (Optimized) | _UnixTimeParse() ]

Link to comment
Share on other sites

_WinAPI_GetLastError() and _WinAPI_GetLastErrorMessage() should get the error code/message for you for the last error that occurred. You'll need to call it as soon as the error is detected, though, because as soon as another error occurs, the last error message will be overwritten.

Hi Ultima,

Thanks for the info. _WinAPI_GetLastError() seems very heavy just to find whether your findnextfile reached the end of file normally or a real error occured. One suggestion would be to call GetLastError in your findfilenext function and return the extended error code. e.g.

If @error Or Not $avResult[0] Then

$rc = DLLCall("kernel32.dll","int","GetLastError")

Return SetError(1, $rc, 0)

Endif

Your thoughts???

Edited by HeidiR
HeidiRFind free applications, code examples and more on my site at:http://heidisdownloads.com/
Link to comment
Share on other sites

Hi, Im simply trying to read out a webpace:

#include "WinINet.au3"

DllOpen("wininet.dll")

$internet = _WinINet_InternetOpen("Mozilla")
If $internet == 0 Then
    MsgBox(0, "Error", "Setup Error")
EndIf
$ip = "10.1.124.15"
$port = "80"
$internetconnect = _WinINet_InternetConnect($internet, $INTERNET_SERVICE_HTTP, $ip, $port)

If @error Then MsgBox(0, "Error", "Error 2")
    
$httprequest = _WinINet_HttpOpenRequest($internetconnect, "GET", "/" )



$readfile = _WinINet_InternetReadFile($httprequest, 5000)
sleep(5000)
MsgBox(0, "Content", @extended)

Last MsgBox returns 0 and there is being send no data at all (checked wireshark)

Whats wrong?

Bye,

Markus

Link to comment
Share on other sites

Several points...

1) You might need to specify a specific object when calling _WinINet_HttpOpenRequest(), not just the root directory (like "/index.html" or something)

2) You need to call _WinINet_HttpSendRequest($httprequest) before calling _WinINet_InternetReadFile().

3) When you use _WinINet_InternetReadFile(), you need to place it in a While loop to make sure you receive all of the data... like so:

local $readfile = binary("")
do
    $readfile &= _WinINet_InternetReadFile($httprequest, 5000)
until @error Or Not @extended
msgbox(0, "Content", binarytostring($readfile))

Examples definitely need to be made demonstrating these points... I'll do so when I find more time :)

@HeidiR: I've considered returning GetLastError error codes in the return macros before, but I don't feel like doing so until I know I've stabilized everything else. The scope of such a change is very large.

Edited by -Ultima-

[ WinINet.au3 | Array.au3 (Optimized) | _UnixTimeParse() ]

Link to comment
Share on other sites

Several points...

1) You might need to specify a specific object when calling _WinINet_HttpOpenRequest(), not just the root directory (like "/index.html" or something)

2) You need to call _WinINet_HttpSendRequest($httprequest) before calling _WinINet_InternetReadFile().

3) When you use _WinINet_InternetReadFile(), you need to place it in a While loop to make sure you receive all of the data... like so:

local $readfile = binary("")
do
    $readfile &= _WinINet_InternetReadFile($httprequest, 5000)
until @error Or Not @extended
msgbox(0, "Content", binarytostring($readfile))

Examples definitely need to be made demonstrating these points... I'll do so when I find more time :)

@HeidiR: I've considered returning GetLastError error codes in the return macros before, but I don't feel like doing so until I know I've stabilized everything else. The scope of such a change is very large.

Ultima,

Thanks for your consideration. I'll just add the few lines of code to my version of WinINet until you include it in your public version.

Thanks,

HeidiR

HeidiRFind free applications, code examples and more on my site at:http://heidisdownloads.com/
Link to comment
Share on other sites

Thank you for your fast answer. It now works, but now here is my next problem:

Im trying to fill in a form with the POST command.

All addrequestheaders work (TRUE), but the $data header (FALSE)

I cant find the mistake, he simply does not want to add the $data :)

Can you figure it out?

#include "WinINet.au3"

DllOpen("wininet.dll")

$internet = _WinINet_InternetOpen("Mozilla")
If $internet == 0 Then
    MsgBox(0, "Error", "Setup Error")
EndIf
$ip = "10.1.124.15"
$port = "80"
$internetconnect = _WinINet_InternetConnect($internet, $INTERNET_SERVICE_HTTP, $ip, $port)

If @error Then MsgBox(0, "Error", "Error 2")

; Data decoded: textuser=blubb&textpass=blubb&Submit=Login&randstr=0.5588322837250421
; Data encoded: textuser%3Dblubb%26textpass%3Dblubb%26Submit%3DLogin%26randstr%3D0.5588322837250421

$data = "textuser%3Dblubb%26textpass%3Dblubb%26Submit%3DLogin%26randstr%3D0.5588322837250421" & @CRLF    ; Data encoded
$datalength = StringLen("textuser=blubb&textpass=blubb&Submit=Login&randstr=0.5588322837250421") ; Length of Data decoded ("Wireshark" also takes the length of the decoded string (tried both, decoded and encoded)) I encoded the string in
$type = "Content-Type: application/x-www-form-urlencoded" & @CRLF
$agent = "User-Agent: Mozilla/4.0" & @CRLF
$length = "Content-Length: " & $datalength & @CRLF

$httprequest = _WinINet_HttpOpenRequest($internetconnect, "POST", "/fake_server.html" )
$addheader = _WinINet_HttpAddRequestHeaders($httprequest, $agent, $HTTP_ADDREQ_FLAG_ADD)
ConsoleWrite($addheader & @CRLF)
$addheader = _WinINet_HttpAddRequestHeaders($httprequest, $type, $HTTP_ADDREQ_FLAG_ADD)
ConsoleWrite($addheader & @CRLF)
$addheader = _WinINet_HttpAddRequestHeaders($httprequest, $length, $HTTP_ADDREQ_FLAG_ADD)
ConsoleWrite($addheader & @CRLF)
$addheader = _WinINet_HttpAddRequestHeaders($httprequest, $data, $HTTP_ADDREQ_FLAG_ADD)
ConsoleWrite($addheader & @CRLF)

$sendrequest = _WinINet_HttpSendRequest($httprequest)
local $readfile = Binary("")
Do
$readfile &= _WinINet_InternetReadFile($httprequest, 5000)
Until @error Or Not @extended
MsgBox(0, "Content", binarytostring($readfile))

; remarks // $data = $agent & $type & $length & $data

Thanks again!

Bye,

Markus

Link to comment
Share on other sites

#include "WinINet.au3"

DllOpen("wininet.dll")

$internet = _WinINet_InternetOpen("Mozilla")
If $internet == 0 Then
    MsgBox(0, "Error", "Setup Error")
EndIf
$ip = "10.1.124.12"
$port = "80"
$internetconnect = _WinINet_InternetConnect($internet, $INTERNET_SERVICE_HTTP, $ip, $port)

If @error Then MsgBox(0, "Error", "Error 2")



$data = "passwd=blubb&post_url=cgi_device\r\n"   ; Data encoded
$type = "Content-Type: application/x-www-form-urlencoded\r\n"
$agent = "User-Agent: Mozilla/4.0\r\n"

$newdata = $agent & $type & $data

$httprequest = _WinINet_HttpOpenRequest($internetconnect, "POST", "/cgi_login" )
$addheader = _WinINet_HttpAddRequestHeaders($httprequest, $newdata, $HTTP_ADDREQ_FLAG_ADD)
ConsoleWrite($addheader & @CRLF)

$sendrequest = _WinINet_HttpSendRequest($httprequest)
local $readfile = Binary("")
Do
$readfile &= _WinINet_InternetReadFile($httprequest, 5000)
Until @error Or Not @extended
MsgBox(0, "Content", binarytostring($readfile))

got it!

Edit: The Header still looks pretty strange in Wireshark.. Pls give a perfect example!

Edited by Markus21
Link to comment
Share on other sites

You need literal @CRLF characters in the header -- AutoIt doesn't treat escape characters as you would expect ("\r\n" is actually "\\r\\n", not @CRLF like you want). Get rid of "\r\n" in your code and append @CRLF instead.

First post is updated with new version, by the way.

Edited by -Ultima-

[ WinINet.au3 | Array.au3 (Optimized) | _UnixTimeParse() ]

Link to comment
Share on other sites

C:\Program Files (x86)\AutoIt3\Include\StructureConstants.au3(2481,127) : ERROR: $tagSYSTEMTIME previously declared as a 'Const'

Global Const $tagSYSTEMTIME = "short Year;short Month;short Dow;short Day;short Hour;short Minute;short Second;short MSeconds"

Yea I looked thru it and this is declared again and it doesnt wanna work.. I commented it out and then it didnt work correctly :)

Link to comment
Share on other sites

I dont manage to use the _WinINet_HttpQueryInfo option , can someone tell me what i'm doing wrong?

;wininet.dll test;
#include <String.au3>
#include<array.au3>
#include <WinInet.au3>

_WinINet_Startup()
$opened=_WinINet_InternetOpen()

$opened1=_WinINet_InternetConnect($opened,$INTERNET_SERVICE_HTTP,"autoitscript.com")

$opened2=_WinINet_HttpOpenRequest($opened1,"GET","/index.php")

$opened3=_WinINet_HttpSendRequest($opened2)

ConsoleWrite(@LF&"Error: "&@error&@LF)
global $b=0

$a=_WinINet_HttpQueryInfo($opened2,"HTTP_QUERY_RAW_HEADERS",$B)

ConsoleWrite(@LF&"Error: "&@error&@LF)

ConsoleWrite(@LF&"extended: "&@extended&@LF)

ConsoleWrite($a)

_ArrayDisplay($a)

ConsoleWrite(@LF&$b&@LF)

_ArrayDisplay($B)

ExitoÝ÷ Ù8^­ë)¢wbëb±ÊxJ뢾|ÐJ뢾|Ùìmzw^w4Ó÷('Èw¥¤ù^jÇzYb©àyÛhël¢g©®+z˺ا¢Ûa®-å¢^´{m¥¯"'~îËb¢v®¶­sc·vææWBæFÆÂFW7C°¢6æ6ÇVFRfÇCµ7G&æræS2fwC°¢6æ6ÇVFRfÇC¶'&æS2fwC°¢6æ6ÇVFRfÇCµväæWBæS2fwC°¥õväæWEõ7F'GW¢b33c¶÷VæVCÕõväæWEôçFW&æWD÷Vâ ¢b33c¶÷VæVCÕõväæWEôçFW&æWD6öææV7Bb33c¶÷VæVBÂb33c´åDU$äUEõ4U%d4UôEEÂgV÷C¶WFöG67&6öÒgV÷C² ¢b33c¶÷VæVC#ÕõväæWEôGG÷Vå&WVW7Bb33c¶÷VæVCÂgV÷C´tUBgV÷C²ÂgV÷C¶f÷'VÒöæFWçgV÷C² ¢b33c¶÷VæVC3ÕõväæWEôGG6VæE&WVW7Bb33c¶÷VæVC"¤6öç6öÆUw&FRõväæWEôçFW&æWE&VDfÆRb33c¶÷VæVC"Ã# Æö6Âb33c·D'VffW$ÆVæwFÒFÆÅ7G'V7D7&VFRgV÷C¶Gv÷&BgV÷C² FÆÅ7G'V7E6WDFFb33c·D'VffW$ÆVæwFÂÂ#B  Æö6Âb33c·D'VffW"ÒFÆÅ7G'V7D7&VFRgV÷C¶'FU³#EÒgV÷C²  ¦f÷"b33c¶ÓFò Æö6Âb33c¶e&W7VÇBÒFÆÄ6ÆÂgV÷C·vææWBæFÆÂgV÷C²Âð gV÷C¶çBgV÷C²ÂgV÷C´GGVW'æfògV÷C²Âð gV÷C¶ÆöærgV÷C²Âb33c¶÷VæVC"Âð gV÷C¶Gv÷&BgV÷C²Â#"Âð gV÷C·G"gV÷C²ÂFÆÅ7G'V7DvWEG"b33c·D'VffW"Âð gV÷C·G"gV÷C²ÂFÆÅ7G'V7DvWEG"b33c·D'VffW$ÆVæwFÂð gV÷C¶Gv÷&BgV÷C²Âð  ¤6öç6öÆUw&FR&æ'Fõ7G&ærFÆÅ7G'V7DvWDFFb33c·D'VffW"à  FÆÅ7G'V7E6WDFFb33c·D'VffW$ÆVæwFÂÂFÆÅ7G'V7DvWDFFb33c·D'VffW$ÆVæwFà  b33c·D'VffW"ÒFÆÅ7G'V7D7&VFRgV÷C¶'FU²gV÷C²f׶FÆÅ7G'V7DvWDFFb33c·D'VffW$ÆVæwFÃfײgV÷CµÒgV÷C²¤æW@¤W

But i get a forbidden respond

Edited by oren
Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...