Seite 1 von 1

File Download - Bug

Verfasst: 09.04.2012 01:05
von pyromane
Hallo liebe Community,
ich sitze schon seit ca. 3 Stunden an diesem Code und erkenne meinen Fehler nicht.

Was will ich mit diesem Code tun? -> Eine File downloaden.
Warum nicht mit GET? -> Ich muss etwas per Post mitsenden um diese File zu bekommen.

Habe meinen Code sehr stark gekürzt und den Fehler auf diesen Beispielcode limitiert.
Wenn man die File mit dem Browser lädt wird man eine 100 kb File bekommen. Hier kriegtman etwas mit einer Random länge raus.

Ich hoffe Ihr könnt mir helfen.

Lg,
pyromane

Code: Alles auswählen

EnableExplicit

InitNetwork()

Define response.s, time.i, Event.i, Size.i, header.s, content.s = "random=stuff&hans=peter", timeout.i = 5000
Define url.s = "http://exesystem.net/example.php"
Define Host.s = GetURLPart(url, #PB_URL_Site) 
Define Path.s = GetURLPart(url, #PB_URL_Path) 
Define ConnectionID = OpenNetworkConnection(Host, 80) 
  If ConnectionID
    Define *Buffer = AllocateMemory(1000)
    
    header = "POST /"+Path+" HTTP/1.1" + #CRLF$
    header + "Host: "+Host + #CRLF$
    header + "Connection: close" + #CRLF$ 
    header + "Accept: */*" + #CRLF$
    header + "Content-type: application/x-www-form-urlencoded" + #CRLF$
    header + "Content-length: " + Str(Len(content)) + #CRLF$+ #CRLF$
    header + content + #CRLF$
    
    SendNetworkString(ConnectionID, header) 
    Time = ElapsedMilliseconds()
    Repeat 
      Delay(10)
      Event = NetworkClientEvent(ConnectionID)
    Until Event Or ElapsedMilliseconds()-Time > timeout
    
    If Event
      Repeat
        Size = ReceiveNetworkData(ConnectionID, *Buffer, MemorySize(*Buffer))
        response + PeekS(*Buffer, Size, #PB_Ascii) 
      Until Not Size
      Debug "Response: "+Str(Len(response))
    EndIf
  EndIf

Re: File Download - Bug

Verfasst: 09.04.2012 03:38
von STARGÅTE
Du machst wie viele den Fehler, das du Binärdaten einfach in einen String schreibst.
Logischerweise wird dieser beim ersten NULL-Zeichen abgeschnitten.

Wenn du Binärdaten erwartest, dann empfange sie auch als solche!
Auch wenn mir der Stil nicht gefällt, hier n lauffähige Version:

Code: Alles auswählen

EnableExplicit

InitNetwork()

#BufferLength = 2048

Define response.s, time.i, Event.i, Size.i, header.s, content.s = "random=stuff&hans=peter", timeout.i = 5000
Define url.s = "http://exesystem.net/example.php"
Define Host.s = GetURLPart(url, #PB_URL_Site) 
Define Path.s = GetURLPart(url, #PB_URL_Path) 
Define ConnectionID = OpenNetworkConnection(Host, 80) 
If ConnectionID
	Define *Buffer, ReceivedLength.i
	
	header = "POST /"+Path+" HTTP/1.1" + #CRLF$
	header + "Host: "+Host + #CRLF$
	header + "Connection: close" + #CRLF$ 
	header + "Accept: */*" + #CRLF$
	header + "Content-type: application/x-www-form-urlencoded" + #CRLF$
	header + "Content-length: " + Str(Len(content)) + #CRLF$+ #CRLF$
	header + content + #CRLF$
	
	SendNetworkString(ConnectionID, header) 
	Time = ElapsedMilliseconds()
	Repeat 
		Delay(10)
		Event = NetworkClientEvent(ConnectionID)
	Until Event Or ElapsedMilliseconds()-Time > timeout
	
	If Event
		Repeat
			*Buffer = ReAllocateMemory(*Buffer, ReceivedLength+#BufferLength)
			Size = ReceiveNetworkData(ConnectionID, *Buffer+ReceivedLength, #BufferLength)
			If Size > 0
				ReceivedLength + Size
			EndIf
		Until Size <= 0
		ReAllocateMemory(*Buffer, ReceivedLength)
		Debug "Response: "+Str(MemorySize(*Buffer))
	EndIf
EndIf 
Kleiner Hinweis noch: Bei den empfangenen Daten steckt noch der HTTP-Header mit drin, den müsstest du also ggf. noch heraus filtern, wenn du nur die Binärdaten haben willst.

Re: File Download - Bug

Verfasst: 09.04.2012 13:32
von pyromane
Vielen vielen Dank STARGÅTE!

Der Code oben war nicht so schön, da er aus einer Funktion kopiert wurde und dann aufs äußerste gekürzt. Den Code zum entfernen des Headers habe ich auch weggelassen, um den Code so kurz wie möglich zu machen.

Nochmals danke für die Erklärung und den Code!