Seite 1 von 2

[Gelöst] HTTP Request

Verfasst: 04.01.2010 15:29
von Tur0k
Hallo Community!

Ich beschäftige mich seit heute mit HTTP Request.
Mein Code funktioniert, aber liefert mir ständig ein anderes Resultat.
Ich bekomme einpaar mal in buffer.htm mehrfach komische Zeichen wie: �������������... usw
oder der HTML Code hört bei einem Punkt auf. (Nicht komplett geladen)

Ich glaube es liegt an: *Buffer = AllocateMemory(10000)
Leider habe ich keine Lösung gefunden... :freak:

Code: Alles auswählen

InitNetwork()
header.s
info.s
id.l
result.s
*Buffer = AllocateMemory(10000)
id = OpenNetworkConnection("Seite", 80)
info = "Daten"

If id

   header + "POST /index.php HTTP/1.1" + #CRLF$
   header + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + #CRLF$
   header + "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" + #CRLF$
   header + "Host: Seite" + #CRLF$
   header + "Content-Length: "+Str(Len(info)) + #CRLF$
   header + "Content-Type: application/x-www-form-urlencoded" + #CRLF$
   header + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" + #CRLF$
   header + "Cache-Control: no-cache" + #CRLF$
   header + "Cookie: keep-alive" + #CRLF$ + #CRLF$
   
   header + info + #CRLF$
   
   SendNetworkString(id, header)
   
   Repeat
      Delay(10)
      Until NetworkClientEvent(id)

   
   ReceiveNetworkData(id, *Buffer, MemorySize(*Buffer))
   result = PeekS(*Buffer)
   
   If CreateFile(0, "buffer.htm")
    WriteData(0, *Buffer, MemorySize(*Buffer))
    CloseFile(0)
    RunProgram("buffer.htm")
   EndIf
   
   CloseNetworkConnection(id)
EndIf
End
*Den Code hab ich mal irgendwo im Forum gefunden und bisschen verändert*

Mit einem HTTP Request Generator hatte ich keine Probleme. Er erzeugte mir immer den vollständigen Quellcode der Seite.
Hier, falls jemand ihn braucht (inkl. Source): http://www.softpedia.com/get/Internet/O ... ator.shtml


Ich bedanke mich schon jetzt für eure Hilfe! :)

Re: HTTP Request

Verfasst: 04.01.2010 15:31
von Kiffi
Du solltest 'result' in die Datei schreiben und nicht den kompletten Buffer ;-)

Grüße ... Kiffi

Re: HTTP Request

Verfasst: 04.01.2010 15:40
von Tur0k
Danke für deine Antwort, Kiffi.

Wäre doch dann: WriteString(0, result) ?

Funktioniert leider irgendwie nicht.
Die Seite ladet wieder bis zur hälfte oder weniger.

Re: HTTP Request

Verfasst: 04.01.2010 15:47
von Kiffi
Tur0k hat geschrieben:Wäre doch dann: WriteString(0, result) ?
korrekt.
Tur0k hat geschrieben:Die Seite ladet wieder bis zur hälfte oder weniger.
Wie groß ist denn diese Hälfte? 10000 Bytes?

Grüße ... Kiffi

Re: HTTP Request

Verfasst: 04.01.2010 15:55
von Tur0k
Wie meinst du das? :shock:

Die HTM Datei ist 2.83

Auch wenn ich: AllocateMemory(10000) erhöhe, bekomme ich unterschiedliche Resultate... :freak:

Re: HTTP Request

Verfasst: 04.01.2010 15:55
von HeX0R
Tur0k hat geschrieben: Funktioniert leider irgendwie nicht.
Die Seite ladet wieder bis zur hälfte oder weniger.
Natürlich lädt sie nahezu niemals vollständig, meinst du in 10ms ist die ganze Seite bereits da?
1.) Musst du den Rückgabewert von ReceiveNetworkData() auch VERWENDEN.
2.) Wirst du feststellen, dass du mehrere Aufrufe benötigst, bis die ganze Seite da ist. Das muss also in eine Schleife (oder die ganz ganz schlechte Variante ein Delay(2000) vor den ReceiveNetworkData()-Aufruf).

Re: HTTP Request

Verfasst: 04.01.2010 18:34
von Tur0k
Vielen Dank.

Welche Schleife wäre da am besten geeignet?

Edit: Mit ReceiveNetworkData bekomme ich die zurzeit geladene Bytes im Speicher, die muss ich vergleichen mit der index.php Grösse?

Re: HTTP Request

Verfasst: 04.01.2010 19:04
von edel
Nein, du vergleichst lediglich die gelesenen Bytes mit der Memoryblockgroesse, ist der Block groesser als die gelesenen Bytes, hast du alles geladen.

Re: HTTP Request

Verfasst: 04.01.2010 19:17
von Tur0k
Danke für deine Antwort.

Ich hab den original Code gefunden: http://forums.purebasic.com/german/view ... tp+request

Code: Alles auswählen

  Repeat
   
    size = ReceiveNetworkData(id, *buffer, MemorySize(*buffer))
    result + PeekS(*buffer)
   
   For index = 1 To  CountString(result, #CRLF$)+1
    Debug StringField(result,index, #CRLF$)
  Next

  ; bzw einfach nur debug result

  Until size<MemorySize(*buffer)
ist doch korrekt? Trotzdem wird nicht alles geladen :S

Re: HTTP Request

Verfasst: 04.01.2010 21:11
von Kiffi
Tur0k hat geschrieben:ist doch korrekt?
nein. Du führst so lange ReceiveNetworkData() in einer
Schleife aus, bis 'size' kleiner als 'MemorySize(*Buffer)' ist.

Innerhalb dieser Schleife fügst Du das PeekS() an das 'result' an.

Grüße ... Kiffi