HTTP Fehler?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

KnorxThieus

Betreff: HTTP Fehler?

BeitragSa, Mai 17, 2014 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich wollte mich mal mit HTTP - was für mich noch Neuland ist - auseinandersetzen, aber bei mir (BlitzPlus) funktioniert nicht mal der Beispielcode:
BlitzBasic: [AUSKLAPPEN]
Print "Verbinde..." 
tcp = OpenTCPStream("www.blitzforum.de", 80)
If Not tcp Print "Fehlgeschlagen": WaitKey : End
Print "Verbunden! Sende Anfrage..."
WriteLine tcp, "GET https://www.blitzforum.de/ HTTP/1.0"
WriteLine tcp, Chr$(10)
If Eof(tcp) Print "Fehlgeschlagen.": WaitKey: End
Print "Anfrage gesendet! Warte auf Antwort..."
While Not Eof(tcp)
Print ReadLine$( tcp )
;Print "Bytes verfügbar:" + ReadAvail(tcp) ;nervt hier nur
Wend
If Eof(tcp) = 1 Then
Print "Erfolgreich!"
Else
Print "Fehler!"
EndIf
CloseTCPStream tcp
WaitKey()
End


Ich bekomme immer nur Code: [AUSKLAPPEN]
Verbinde...
Verbunden! Sende Anfrage...
Anfrage gesendet! Warte auf Antwort...
HTTP/1.1 301 Moved Permanently
Date: Sat, 17 May 2014 15:12:37 GMT
Server: Apache/2.2.22 (Debian)
Location: http://www.blitzforum.de/
Vary: Accept-Encoding
Content-Length: 233
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.blitzforum.de/">here</a>.</p>
</body></html>
Erfolgreich!

Ich bin doch schon bei https://www.blitzforum.de/ !

Was mache ich falsch?

Mit freundlichen Grüßen,
KnorxThieus
Version: BlitzPlus / Blitz+

count-doku

BeitragSa, Mai 17, 2014 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

du darfst erstens nicht die ganze Webadresse bei GET mitsenden, nur die Unterseite.
2. wird im Header die Hostangabe verlangt.
Wenn du das korrigierst, sollte es gehen:
BlitzBasic: [AUSKLAPPEN]
Print "Verbinde..." 
tcp = OpenTCPStream("www.blitzforum.de", 80)
If Not tcp Print "Fehlgeschlagen": WaitKey : End

Print "Verbunden! Sende Anfrage..."
WriteLine tcp, "GET / HTTP/1.0" ; Nur die Unterseite abfragen!
WriteLine tcp, "Host: www.blitzforum.de" ; Hostangabe (also Webseitenadresse ohne http)
WriteLine tcp, Chr(13)+Chr$(10)

If Eof(tcp) Print "Fehlgeschlagen.": WaitKey: End
Print "Anfrage gesendet! Warte auf Antwort..."
While Not Eof(tcp)
Print ReadLine$( tcp )
Wend

If Eof(tcp) = 1 Then
Print "Erfolgreich!"
Else
Print "Fehler!"
EndIf
CloseTCPStream tcp
WaitKey()
End


Vllt sollte da mal die Hilfe ausgebessert werden. Ich sende den Vorschlag gleich mal ab...

lg,
Count-Doku

KnorxThieus

BeitragSa, Mai 17, 2014 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach, vielen Dank! Da war die Hilfe wohl nicht so ganz aktuell...
Und wie war das jetzt noch mal mit Connection? Bei /HTTP/1.1 bleibt sie keep-alive, wie schließt man sie dann?
Version: BlitzPlus / Blitz+

count-doku

BeitragSa, Mai 17, 2014 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch das kannst du im Header mitsenden,
also halt entweder Connection: keep-alive oder Connection: close dann musst du aber
darauf achten, wie der Server antwortet, er muss den gewünschten Verbindungsmodus nicht akzeptieren
und kann dir einen anderen vorschreiben.

Wenn du keep-alive nutzt, denke ich es reicht zum schließen einfach den TCP Stream mit CloseTCPStream zu schließen.

Ansonsten einfach mal die HTTP Definition auf Wikipedia lesen ( http://de.wikipedia.org/wiki/H...r_Protocol )
Ist nicht so lang und das steht eigentlich das meiste drinne. Auch wie du auf die einzelnen Statuscodes reagieren musst/kannst/solltest Very Happy

lg,
Count-Dokz

KnorxThieus

BeitragSa, Mai 17, 2014 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich schon angelesen, auf Wiki, aber was mir da fehlt, ist ein kompletter Übertragungsvorgang...
Danke!
Connection: close

Edit: Ich hoffe, jemand liest das noch... Ist es auch irgendwie möglich, gleich am Anfang die Länge der Seite auszulesen? Brauchte ich für den Fortschritt...
Version: BlitzPlus / Blitz+

Jolinah

BeitragSo, Mai 18, 2014 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Server sendet bei der Antwort im Header "Content-Length" die Länge der Daten in Bytes.

Wenn du den Inhalt noch gar nicht abrufen willst, sondern nur die Kopfdaten (wie die Länge) auslesen willst, kannst du statt GET auch HEAD benutzen. Dann sendet der Server den Antwort-Header ohne den Inhalt.

Das WriteLine tcp, Chr(13) + Chr(10) ist genau genommen nicht ganz richtig. WriteLine schreibt ja bereits ein Zeilenende. Somit werden zwei Zeilen geschrieben. Um nur eine Zeile zu schreiben reicht ein WriteLine tcp, "" Wink

KnorxThieus

BeitragSo, Mai 18, 2014 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank! Ja, das Content-Lenght habe ich auch schon gelesen, aber nach Zählen der danach gesendeten Zeichen blieb noch eine Differenz übrig, woran liegt das?
Danke auch für die beiden anderen Tipps! (-:
Version: BlitzPlus / Blitz+

Eingeproggt

BeitragSo, Mai 18, 2014 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das richtig im Kopf habe, ist die Angabe hexadezimal, müsste man also noch umrechnen.
EDIT: Gerade nachgelesen, ich liege falsch, sorry Sad

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Jolinah

BeitragSo, Mai 18, 2014 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Die zusätzlichen Bytes kommen vom Transfer-Encoding: chunked. Der Inhalt kommt nicht immer in reiner Textform daher. Der Server kennt verschiedene Codierungsverfahren wie chunked, base64 und andere.

Ich habe das vorhin kurz getestet und erhielt bei http://www.blitzforum.de die Antwort als chunked codiert zurück. Wird chunked verwendet, dann sendet der Server kein Content-Length mit der Anzahl Bytes (dezimal). Stattdessen sendet er die Daten codiert. In dieser chunked-Codierung enthalten sind mehrere Chunks (Blöcke). Für jeden Datenblock steht am Anfang eine Zeile mit der Länge des Blocks, diesmal aber in Hexadezimal. Daher kriegt man beim Beispiel mit www.blitzforum.de zuerst mal die Länge 2eeb zurück, was 12011 Bytes entspricht. Danach sollte man exakt diese Anzahl an Bytes lesen und danach kommt ein neuer Block. Beim nächsten Block war bei mir dann eine Länge von 0 drin, was bedeutet dass nun kein Inhalt mehr folgt.

Wie du siehst, ist es leider nicht ganz einfach, einen zuverlässigen HTTP-Client zu schreiben Wink

KnorxThieus

BeitragDi, Mai 20, 2014 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten, hat leider etwas gedauert.

Was heißt das jetzt in der Praxis? Kann ich den Server anweisen, mir alles in einem bestimmten Codierungsverfahren zu schicken?
Version: BlitzPlus / Blitz+

Jolinah

BeitragDo, Mai 22, 2014 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Einige Server unterstützen:

Zitat:
Accept-Encoding: identity


Generell ist es aber am besten gar kein Accept-Encoding zu senden, was schonmal soviel bedeutet wie dass man kein gzip oder deflate haben möchte. Um auch das chunked zu verhindern, muss man offenbar zwingend HTTP/1.0 verwenden statt 1.1. Scheinbar gab es in 1.0 das Connection: keep-alive und somit auch das chunked noch nicht.

Zitat:
GET /pfad HTTP/1.0
Host: www.blitzforum.de
Connection: close


Das hat bei mir jedenfalls funktioniert. Ich konnte den ganzen Inhalt ohne irgendwelche zusätzlichen oder zu wenigen Bytes auslesen Wink

KnorxThieus

BeitragSa, Mai 24, 2014 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, also ein allgemeines Verfahren gibt es nicht...?
Version: BlitzPlus / Blitz+

DAK

BeitragSo, Mai 25, 2014 7:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ein generelles Problem bei solchen sehr alten Standards. Die sind häufig nicht gerade wasserdicht designt worden. Dazu kommt, dass es hunderte verschiedene Implementierungen eines HTTP-Servers gibt, die alle alles ein klein wenig anders machen. Wenn du etwas willst, dass auf jedem Server funktionieren soll, dann musst du es auch so bauen, dass es mit allem klar kommt.
Gewinner der 6. und der 68. BlitzCodeCompo

KnorxThieus

BeitragSo, Mai 25, 2014 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, dann muss ich die Zeitschätzung wohl aufgeben Sad
Trotzdem Danke!
Version: BlitzPlus / Blitz+

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group