File Download - Bug

Für allgemeine Fragen zur Programmierung mit PureBasic.
pyromane
Beiträge: 276
Registriert: 09.09.2010 14:10

File Download - Bug

Beitrag 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
PureBasic 5.21 LTS auf Windows 7 x64 (Intel i5 2500K, 8GB Ram, Nvidia GTX 780)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: File Download - Bug

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
pyromane
Beiträge: 276
Registriert: 09.09.2010 14:10

Re: File Download - Bug

Beitrag 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!
PureBasic 5.21 LTS auf Windows 7 x64 (Intel i5 2500K, 8GB Ram, Nvidia GTX 780)
Antworten