Seite 1 von 1

Webseiten auslesen die Zweite..

Verfasst: Di Okt 25, 2011 9:25 pm
von LittleEndian
...und Action!

Hallo zusammen,

ich habe mir eben 'Beej's Guide to Network Programming' duchgelesen und mir sowohl einen kleinen Server als auch einen kleinen Clienten geschrieben, die bereits kurz darauf fröhlich miteinanden kommunizierten. Als nächstes nahm ich dann Kontakt zum Webserver meines Vertrauens auf. Port 80 war der verabredete Treffpunkt, er trug eine rote Rose, ich erkannte ihn sofort und nach kurzer Zeit stand die Verbindung. Tja und wie es beim ersten Date nunmal so ist, herrschte betretenes Schweigen.Ich wusste nicht was ich sagen sollte und er hatte die ganze Zeit diesen "Los frag mich endlich was"-Blick drauf. Gerade als die Situation zu eskalieren drohte fand ich den rettenden Hinweis. "Versuchs mit GET !". Gesagt getan. Die Kommunikation lief im Prinzip auch reibungslos, nur waren die Anworten nicht immer die, die ich mir gewünscht hatte...

Nun konkret zu meiner Frage:

Wie genau muss ich meine GET Anfrage formulieren?

Häufig ist mir "GET /HTTP/1.0" begegnet, allerding liefern mir die meisten Server daraufhin:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at atrops.eu Port 80</address>
</body></html>


Ich habe mir daraufhin den RFC2616 in groben Zügen durchgelesen. Dort heisst es man kann die Anfrage direkt unter Angabe des vollständigen Pfades stellen, also zb "GET http://www.testurl.org/forum/viewtopic.php?f=21&t=4641".
Obwohl ich nicht verstehe warum ich den vollen Pfad angeben muss, wenn bereits eine Verbindung zu http://www.testurl.org:80 besteht, hat das in einigen Fällen funktioniert.

Häufig bekam ich allergings:

<!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://board.anotherfail.de/tn20.htm">here</a>.</p>
</body></html>

obwohl die Adresse sich über einen Browser einwandfrei direkt anwählen lässt.

"GET /forum/irgendeinthread.htm HTTP/1.1"

funtionierte garnicht, obwohl das laut RFC2616 ebenfalls klappen sollte und für mich auch die logischste Variante war.

Sofern ihr wisst wo ich mehr Informationen darüber finde oder ihr ein wenig dazu erzählen möchtet, wäre ich euch sehr dankbar.

Ansonsten eine super Seite hier, muss ich sagen! Es ist schön, wenn man sich mit Gleichgesinnten austauschen kann.

Ich bin zwar erst seit Kurzem dabei, aber C Programmierung macht einfach enorm Spass.

mfG LittleE

Re: Webseiten auslesen die Zweite..

Verfasst: Di Okt 25, 2011 11:25 pm
von Xin
LittleEndian hat geschrieben:...und Action!

Hallo zusammen,
Grüße und willkommen im Forum! :-)
MoonGuy hat geschrieben:Port 80 war der verabredete Treffpunkt, er trug eine rote Rose, ich erkannte ihn sofort und nach kurzer Zeit stand die Verbindung.
:lol:
MoonGuy hat geschrieben:Nun konkret zu meiner Frage:

Wie genau muss ich meine GET Anfrage formulieren?

Häufig ist mir "GET /HTTP/1.0" begegnet, allerding liefern mir die meisten Server daraufhin:
Nach GET folgt der Pfad: "/", dann ein Leerzeichen und dann das Protokol mit Version "HTTP/1.0"
Du kannst mit dem Telnet-Client spielen. Nach der Eingabe von GET musst Du 2x Return drücken. Bitte keine Korrekturen... viele Webserver mögen es nicht, wenn man sich vertippt. ^^

Code: Alles auswählen

ambassador:~ xin$ telnet proggen.org 80
Trying 188.40.193.143...
Connected to proggen.org.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 25 Oct 2011 22:17:42 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze3
Vary: Accept-Encoding
Content-Length: 3447
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">

<HTML>
...usw...
LittleEndian hat geschrieben: Ich habe mir daraufhin den RFC2616 in groben Zügen durchgelesen. Dort heisst es man kann die Anfrage direkt unter Angabe des vollständigen Pfades stellen, also zb "GET http://www.testurl.org/forum/viewtopic.php?f=21&t=4641".
Das geht nicht:
Du kannst nicht den einen Server fragen, was er Dir per http-Protokoll von einem anderen Server holen soll.

Es gilt nach GET immer der Pfad der Domain, die Du angesprochen hast.

Nun gibt es aber Virtual Hosts, damit das dann klappt tippst Du Dein GET ein und gibst zusätzlich den Host an, den Du abfragen möchtest.

Code: Alles auswählen

GET /index.html HTTP/1.0
Host: example.com

und nach Host wieder 2x Return.
LittleEndian hat geschrieben:Sofern ihr wisst wo ich mehr Informationen darüber finde oder ihr ein wenig dazu erzählen möchtet, wäre ich euch sehr dankbar.
Da sollten sich antworten finden lassen, da ich selbst mit einem Webserver beschäftigt bin.
LittleEndian hat geschrieben:Ansonsten eine super Seite hier, muss ich sagen! Es ist schön, wenn man sich mit Gleichgesinnten austauschen kann.
:-)
LittleEndian hat geschrieben:Ich bin zwar erst seit Kurzem dabei, aber C Programmierung macht einfach enorm Spass.
Wenn Du erst kurz dabei bist, wie kam es zum Namen 'LittleEndian'?

Willkommen auf proggen.org, Uservorstellungen im entsprechenden Brett und rege Beteiligung sind gerne gesehen. :-)

Re: Webseiten auslesen die Zweite..

Verfasst: Mi Okt 26, 2011 7:08 am
von C@mper
LittleEndian hat geschrieben: Häufig bekam ich allergings:

Code: Alles auswählen

<!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://board.anotherfail.de/tn20.htm">here</a>.</p>
</body></html>
obwohl die Adresse sich über einen Browser einwandfrei direkt anwählen lässt.
'301 Moved Permanently' heisst, dass die angeforderte Ressource ab sofort unter der im "Location"-Header-Feld angegebenen Adresse zu finden ist. Die alte Adresse ist nicht länger gültig. Der Browser folgt dieser Adresse im "Location"-Header. Dein Programm müsste nun diese Adresse auswerten und eine neue Verdindung dahin aufbauen.

Re: Webseiten auslesen die Zweite..

Verfasst: Mi Okt 26, 2011 10:23 pm
von LittleEndian
Xin hat geschrieben: Nach GET folgt der Pfad: "/", dann ein Leerzeichen und dann das Protokol mit Version "HTTP/1.0"
Du kannst mit dem Telnet-Client spielen. Nach der Eingabe von GET musst Du 2x Return drücken.
Ich hatte mehrere Varianten ausprobiert, wobei ich zugeben muss, daß die Version mit dem Leerzeichen auffällig lange brauchte, bis der Server mir schliesslich eine Fehlermeldung lieferte und nun weiss ich auch woran es gelegen hat. Nach einer Weile bin ich nämlich tatsächlich auf die Telnetvariante umgestiegen, um schneller durchprobieren zu können, allerdings ohne ein zweites Mal Return zu drücken. Sehr wertvoller Hinweis, danke.
Xin hat geschrieben:
LittleEndian hat geschrieben: Ich habe mir daraufhin den RFC2616 in groben Zügen durchgelesen. Dort heisst es man kann die Anfrage direkt unter Angabe des vollständigen Pfades stellen, also zb "GET http://www.testurl.org/forum/viewtopic.php?f=21&t=4641".
Das geht nicht:
Du kannst nicht den einen Server fragen, was er Dir per http-Protokoll von einem anderen Server holen soll.
Ich hatte stets die Url desjenigen Servers verwendet, mit dem ich mich zuvor verbunden hatte und wie gesagt, einige Male hat es sogar geklappt (unter anderem zB auf diesem Server hier), aber ich schrieb ja bereits, dass mir das auch ziemlich komisch und unplausibel vorkam.
So wie du es schreibst macht es deutlich mehr Sinn. Übrigens habe ich die Sache mit dem Virtual host ebenfalls probiert gehabt (allerdings ohne zu wissen, dass dies so heisst. Es stand beispielhaft im RFC.) Auch hier fehlte das zweite Return.
Xin hat geschrieben: Wenn Du erst kurz dabei bist, wie kam es zum Namen 'LittleEndian'?
Die Byte Order wird in dem Guide, den ich eingangs erwähnte, erklärt. Ohne dieses Wissen hätte ich meine beiden Testprogramme (Server/Client) auch garnicht schreiben können. Ganz unabhängig davon fand ich das dahinterstehende Wortspiel einfach witzig und da ich mich tatsächlich wie ein kleiner Indianer fühle, der gerade begonnen hat die weite Welt zu erkunden, habe ich mir diesen Namen gegeben.
Xin hat geschrieben: Willkommen auf proggen.org, Uservorstellungen im entsprechenden Brett und rege Beteiligung sind gerne gesehen. :-)
Vielen Dank! Ich fühe mich schon jetzt sehr wohl hier und trage gerne meinen Teil zu diesem wunderbaren Projekt bei.
C@mper hat geschrieben:
'301 Moved Permanently' heisst, dass die angeforderte Ressource ab sofort unter der im "Location"-Header-Feld angegebenen Adresse zu finden ist. Die alte Adresse ist nicht länger gültig. Der Browser folgt dieser Adresse im "Location"-Header. Dein Programm müsste nun diese Adresse auswerten und eine neue Verdindung dahin aufbauen.
Super Hinweis, danke dir!

Re: Webseiten auslesen die Zweite..

Verfasst: Do Okt 27, 2011 9:26 am
von Xin
LittleEndian hat geschrieben:Nach einer Weile bin ich nämlich tatsächlich auf die Telnetvariante umgestiegen, um schneller durchprobieren zu können, allerdings ohne ein zweites Mal Return zu drücken. Sehr wertvoller Hinweis, danke.
Das zweite Return (also eine Zeile ohne Inhalt) schließt den HTTP-Header ab. Erst nachdem der komplette Header gesendet wurde, reagiert der HTTP-Server.
Außer natürlich, Du tippst zu langsam und der Server kappt dann irgendwann die Verbindung. => Fehlermeldung.
LittleEndian hat geschrieben:
Xin hat geschrieben: Wenn Du erst kurz dabei bist, wie kam es zum Namen 'LittleEndian'?
Die Byte Order wird in dem Guide, den ich eingangs erwähnte, erklärt. Ohne dieses Wissen hätte ich meine beiden Testprogramme (Server/Client) auch garnicht schreiben können.
LittleEndian und BigEndian ist für einen Anfänger schon recht spezielles Wissen.
Ich habe gerade mal nachgeschaut, ein Endianess-Artikel steht sogar schon auf der Todo-Liste, dazu haben wir also auch noch gar nix.
LittleEndian hat geschrieben:Ganz unabhängig davon fand ich das dahinterstehende Wortspiel einfach witzig und da ich mich tatsächlich wie ein kleiner Indianer fühle, der gerade begonnen hat die weite Welt zu erkunden, habe ich mir diesen Namen gegeben.
Wo kommt denn der Indianer her? ^^
Das ist eher ein Denglisches Wortspiel ;-)

"Endian" kommt vom Ende. Ein "Indian" ist ein Inder. Du fühlst Dich wie ein LittleNativeAmerican. ;-)
Aber auch kleine Inder entdecken die Welt. ;-)
LittleEndian hat geschrieben:
Xin hat geschrieben: Willkommen auf proggen.org, Uservorstellungen im entsprechenden Brett und rege Beteiligung sind gerne gesehen. :-)
Vielen Dank! Ich fühe mich schon jetzt sehr wohl hier und trage gerne meinen Teil zu diesem wunderbaren Projekt bei.
Wenn Du irgendwann Dein Wissen im Wiki mit uns Teilen magst und darüber schreiben möchtest, schreib mich wegen des Accounts an.
LittleEndian hat geschrieben:
C@mper hat geschrieben: '301 Moved Permanently' heisst, dass die angeforderte Ressource ab sofort unter der im "Location"-Header-Feld angegebenen Adresse zu finden ist. Die alte Adresse ist nicht länger gültig. Der Browser folgt dieser Adresse im "Location"-Header. Dein Programm müsste nun diese Adresse auswerten und eine neue Verdindung dahin aufbauen.
Super Hinweis, danke dir!
Jow... @Camper, den Part habe ich geschickt weggequotet und dann vergessen zu beantworten.

Re: Webseiten auslesen die Zweite..

Verfasst: Do Okt 27, 2011 12:54 pm
von LittleEndian
Xin hat geschrieben:
LittleEndian hat geschrieben: Die Byte Order wird in dem Guide, den ich eingangs erwähnte, erklärt. Ohne dieses Wissen hätte ich meine beiden Testprogramme (Server/Client) auch garnicht schreiben können.
LittleEndian und BigEndian ist für einen Anfänger schon recht spezielles Wissen.
Ich habe gerade mal nachgeschaut, ein Endianess-Artikel steht sogar schon auf der Todo-Liste, dazu haben wir also auch noch gar nix.
Ich bin mir gerade nicht ganz sicher ob wir uns missverstehen.
LittleEndian hat geschrieben:
Hallo zusammen,

ich habe mir eben 'Beej's Guide to Network Programming' duchgelesen [...]
Das ist der Guide auf den ich mich die ganze Zeit beziehe und aus dem ich mein Wissen über Netzwerkprogrammierung habe (zu deren Grundvorraussetzungen eben auch Kenntnis und Umgang mit der Byte Order gehören). Vielleicht war dir das aber auch längst klar und dein Satz über den 'Endianess-Artikel' war eher als Anregung gemeint einen solchen zu verfassen.
Xin hat geschrieben: Wo kommt denn der Indianer her? ^^
Das ist eher ein Denglisches Wortspiel ;-)

"Endian" kommt vom Ende. Ein "Indian" ist ein Inder. Du fühlst Dich wie ein LittleNativeAmerican. ;-)
Aber auch kleine Inder entdecken die Welt. ;-)
Das stimmt so nur zum Teil. Das Oxford English Dictionary (schweres Geschütz, ich weiss), sagt hierzu Folgendes:
http://oxforddictionaries.com/definition/Indian

Insbesondere über den Gebrauch des Wortes stellt es fest:
Oxford English Dictionary hat geschrieben: Usage

The native peoples of America came to be described as Indian as a result of Christopher Columbus and other voyagers in the 15th -16th centuries believing that, when they reached the east coast of America, they had reached part of India by a new route. The terms Indian and Red Indian are today regarded as old-fashioned and inappropriate, recalling, as they do , the stereotypical portraits of the Wild West. American Indian, however , is well established, although the preference where possible is to make reference to specific peoples, such as Apache, Delaware, and so on. See also American Indian (usage) and Native American
Zum Glück brauchen wir uns in C mit solchen Vieldeutigkeiten nicht herumzuschlagen. :D

Zurück zur Byte Order. Je nach Order wird ein numerischer Wert im Speicher beginnend mit dem LittleEnd oder eben dem BigEnd abgelegt. (Edit: Natürlich werden sämtliche Daten auf diese Weise abgelegt, die Namensgebung wird bei der Speicherung numerischer Werte aber besonders deutlich (man, jetzt könnte ich eine echt verschachtelte Erklärung anfangen..(verdammt, was passiert hier gerade))). Damit wäre die Namensgebung bereits eindeutig und völlig ausreichend. Das eigentliche Wortspiel entsteht nun durch das Anhängen des 'ian' (das ist ja schon wieder ein Wortspiel in sich, fällt mir gerade auf). Naja, jedenfalls wird ein 'LittleEndian' damit zu einer Person mit gleich 3 verschiedenen Bedeutungen. Alle in einer Person vereinigt könnte man sagen, ein LittleEndian ist ein kleiner Indianer, der sein weich gekochtes Frühstücksei von der Spitze her pellt und vorzugsweise auf Intel 80x86 Architekturen beheimatet ist. :)

Das du mich nicht für einen Anfänger hälst (ich hätte so gerne 'hellst' geschrieben, aber ich schätze dafür kennen wir uns noch nicht lange genug ^^) schmeichelt mir zwar, aber es impliziert auch, dass ich hier irgendwen täuschen oder mich kleiner machen wollte als ich bin und das ist wirklich nicht der Fall. Sobald ich etwas Zeit finde, werde ich mich mal kurz an entsprechender Stelle vorstellen, vielleicht hilft das.
Xin hat geschrieben: Wenn Du irgendwann Dein Wissen im Wiki mit uns Teilen magst und darüber schreiben möchtest, schreib mich wegen des Accounts an.
Das werde ich auf jeden Fall tun, sobald ich das Gefühl habe etwas Konstruktives beitragen zu können.

Re: Webseiten auslesen die Zweite..

Verfasst: Do Okt 27, 2011 1:25 pm
von Xin
LittleEndian hat geschrieben: Ich bin mir gerade nicht ganz sicher ob wir uns missverstehen.
> 'Beej's Guide to Network Programming' duchgelesen [...]

Das ist der Guide auf den ich mich die ganze Zeit beziehe und aus dem ich mein Wissen über Netzwerkprogrammierung habe (zu deren Grundvorraussetzungen eben auch Kenntnis und Umgang mit der Byte Order gehören). Vielleicht war dir das aber auch längst klar und dein Satz über den 'Endianess-Artikel' war eher als Anregung gemeint einen solchen zu verfassen.
Das ist mir klar, ich konnte mich halt nur nicht zurückhalten darauf hinzuweisen, dass Endians keine Indianer sind.

Es sollte auch keine Aufforderung sein, einen solchen Artikel zu schreiben - was Dich auf keine Fall davon abhalten sollte - ich habe lediglich gemeint, dass das Wissen für einen Einsteiger recht speziell ist. Deswegen wollte ich einen solchen Artikel auf die Todo-Liste setzen, wo ich allerdings bereits einen Eintrag für einen solchen Artikel fand.
LittleEndian hat geschrieben:
Xin hat geschrieben: Wo kommt denn der Indianer her? ^^
Das ist eher ein Denglisches Wortspiel ;-)

"Endian" kommt vom Ende. Ein "Indian" ist ein Inder. Du fühlst Dich wie ein LittleNativeAmerican. ;-)
Aber auch kleine Inder entdecken die Welt. ;-)
Das stimmt so nur zum Teil. Das Oxford English Dictionary (schweres Geschütz, ich weiss), sagt hierzu Folgendes:
http://oxforddictionaries.com/definition/Indian

Insbesondere über den Gebrauch des Wortes stellt es fest:
Oxford English Dictionary hat geschrieben: Usage

The native peoples of America came to be described as Indian as a result of Christopher Columbus and other voyagers in the 15th -16th centuries believing that, when they reached the east coast of America, they had reached part of India by a new route. The terms Indian and Red Indian are today regarded as old-fashioned and inappropriate, recalling, as they do , the stereotypical portraits of the Wild West. American Indian, however , is well established, although the preference where possible is to make reference to specific peoples, such as Apache, Delaware, and so on. See also American Indian (usage) and Native American
Vom Oxford English Dictionary erschlagen... ^^

Nun gut, kleiner, amerikanischer Inder. Erinnere mich daran, Dich Rajesh zu nennen. ;-D
LittleEndian hat geschrieben:Zurück zur Byte Order. Je nach Order wird ein numerischer Wert im Speicher beginnend mit dem LittleEnd oder eben dem BigEnd abgelegt. (Edit: Natürlich werden sämtliche Daten auf diese Weise abgelegt, die Namensgebung wird bei der Speicherung numerischer Werte aber besonders deutlich (man, jetzt könnte ich eine echt verschachtelte Erklärung anfangen..(verdammt, was passiert hier gerade))). Damit wäre die Namensgebung bereits eindeutig und völlig ausreichend. Das eigentliche Wortspiel entsteht nun durch das Anhängen des 'ian' (das ist ja schon wieder ein Wortspiel in sich, fällt mir gerade auf). Naja, jedenfalls wird ein 'LittleEndian' damit zu einer Person mit gleich 3 verschiedenen Bedeutungen. Alle in einer Person vereinigt könnte man sagen, ein LittleEndian ist ein kleiner Indianer, der sein weich gekochtes Frühstücksei von der Spitze her pellt und vorzugsweise auf Intel 80x86 Architekturen beheimatet ist. :)
Ich hab kein Wort verstanden. ^^
LittleEndian hat geschrieben:Das du mich nicht für einen Anfänger hälst (ich hätte so gerne 'hellst' geschrieben, aber ich schätze dafür kennen wir uns noch nicht lange genug ^^)
<ächz>...

Es gibt da ja noch eine dritte Schreibweise, eher selten verwendet, fast schon "Alternativ". Was hältst Du so von dieser?
LittleEndian hat geschrieben:schmeichelt mir zwar, aber es impliziert auch, dass ich hier irgendwen täuschen oder mich kleiner machen wollte als ich bin und das ist wirklich nicht der Fall. Sobald ich etwas Zeit finde, werde ich mich mal kurz an entsprechender Stelle vorstellen, vielleicht hilft das.
Auf jeden Fall. ^^

Kann natürlich auch vorkommen, dass ich Informationen von Leuten, die gerade erst hier eingeschlagen sind, mal durcheinander werfe.
LittleEndian hat geschrieben:
Xin hat geschrieben: Wenn Du irgendwann Dein Wissen im Wiki mit uns Teilen magst und darüber schreiben möchtest, schreib mich wegen des Accounts an.
Das werde ich auf jeden Fall tun, sobald ich das Gefühl habe etwas Konstruktives beitragen zu können.
*thumbs up*