Hallo Folker!
Habe dir hier einen Code geschrieben:
Code: Alles auswählen
EnableExplicit
Define request.s, *response=AllocateMemory(4096), verbindung
request+"HEAD /index.html HTTP/1.0"+#CRLF$
request+"Connection: Close"+#CRLF$
request+#CRLF$
InitNetwork()
verbindung=OpenNetworkConnection("google.de", 80)
SendNetworkData(verbindung, @request, Len(request))
Repeat : Until ReceiveNetworkData(verbindung, *response, 1000) <> 1000
Debug PeekS(*response)
Unnötige If-Abfragen lasse ich bei solchen Präsentationen immer weg.
Also, sagen wir, du willst prüfen, ob
http://www.google.de/index.html existiert. Dann musst du die Domain bei
OpenNetworkConnection() eintragen (HTTP-Server sitzen standardmäßig an Port 80), den Rest des Pfades musst du in der ersten Zeile des Requests (Anfrage) zwischen der Request-Methode (hier HEAD) und der Angabe des HTTP-Protokolls notieren. Ich empfehle HTTP/1.0 statt 1.1 zu verwenden, weil die etwas einfacherer handzuhaben ist.
Content-Type: Bezeichnet den Datentyp, was da gleich ankommt. text/html steht für normnale Webseiten. image/jpeg wäre z. B. eine JPG-Datei.
Weitere Formate findest du hier:
http://de.selfhtml.org/diverses/mimetypen.htm
Content-Length: bezeichnet die 'Länge' der Datei in Bytes(also die Dateigröße)
Server: bezeichnung des Servers, nur zu Informationszwecken.
Das wichtigtste:
Die erste Zeile: Google sandte mir 302 als Statuscode. die beschreeibung dahinter, "Found", geht auch. ich hatte allerdings Code "200 OK" erwartet, aber egal. Auf welche Codes du, Folker, reagierst, bleibt dir überlassen:
http://www.html-world.de/program/http_8.php Im Wesentlichen auf grundlage der zuletzt genannten Seite programmiere ich momentan meinen eigenen HTTP-Webserver
Ich freue mich, Folker, wenn du eines Tages mal auf einem Server mit meiner Software eine solche HEAD-Abfrage machen musst, wenn ich ganz groß damit rauskomme
Auf der zuletzt genannten URL kannst du noch ein bisschen schökern, um zu erfahren, was für Informationen noch in deinem request oder des Server's Response (Antwort) vorkommen können.
Zuletzt noch: Sendest du am Anfang GET statt HEAD, bekommst du zwar auch einen Header, aber gleich die eigentliche Datei mitgeliefert, sofern existent; somit kannst du die Datei direkt runterladen und kannst auf
URLDownloadToFile_() verzichten, dnen der Befehl geht bei mir sowieso nicht immer
Hinweis: Wenn du das machst: nach der letzten zeile des Response und deines requests, die i. d. R. mit "Connection: Close/Keep-Alive" aufhört, folgt immer #CRLF$+#CRLF$ !!
Wichtig! Wenn u also eine Datei runterlädst (der Buffer in meinen beispil sollte vorsichtshalber größer als nur 4 KB sein), trennst du die Daten in 2 Hälften: Einmal den Request, der bis #CRLF$+#CRLF$ geht, der rest nach den Zwei Zeilenumbrüchen sind alles die Dateien, die du mit
WriteData() in eine Datei schreiben musst!
Keine Angst, bei "Content-Length" steht ja immer in Bytes, wie viele Zeichen einzulesen sind!
Tipp: Schau mal auf den zuletzt genannten Link und such mal nach "Ranges". Antwortet der Server im response mit "Accept-Ranges: Bytes", dann ist es möglich, eine Datei teilweise runterzuladen, weil der Server das unterstützt. Klingelts? Richtig, somit kannst du abgebrochene Dateien wieder aufnehmen. Steht alles auf dem zuletzt genannten Link, welches übrigens eine Art Tuitorial zum Thema "HTTP-protokoll" ist.
So. Viel Spaß mit dem Code und den Informationen.
