Seite 1 von 1

RAW http-Request mit socket...

Verfasst: Mittwoch 20. Juli 2005, 18:54
von jens
Ich wollte mal nachsehen, wie der Header von einem Server bei einem 404 Fehler aussieht:

Code: Alles auswählen

import socket

#~ host = "www.google.de"
#~ host = "www.heise.de"
host = "www.microsoft.com"
port = 80
#~ url = "/gibt_es_nicht_test"
url = "/"

print "Connecte zu %s:%s..." % (host, port),
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
print "OK"

request = [
    "GET %s HTTP/1.1" % url,
    "Host: %s:%s" % (host, port),
    "User-Agent: Python",
    "Accept: text/*",
    "Accept-Charset: ISO-8859-1,utf-8",
    "Connection: close",
]
request = "\r\n".join(request)
request += "\r\n\r\n"

print "Send Request '%s'..." % request.encode("String_Escape"),
s.send( request )
print "OK"

print "Read data...",
data = ""
while 1:
    block = s.recv(1024)
    if not block:
        break
    data += block
print "OK"

print "_"*80
print data.encode("String_Escape")
print "_"*80
print data

s.close()
Beispiel Ausgabe (bis <head> gekürzt!):
Connecte zu www.google.de:80... OK
Send Request 'GET /gibt_es_nicht_test HTTP/1.1\r\n\r\n'... OK
Read data... OK
________________________________________________________________________________
HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\nServer: GWS/2.1\r\nContent-Length: 1259\r\nDate: Wed, 20 Jul 2005 19:12:07 GMT\r\n\r\n\n\n<html><head>
________________________________________________________________________________
HTTP/1.1 404 Not Found
Content-Type: text/html
Server: GWS/2.1
Content-Length: 1259
Date: Wed, 20 Jul 2005 19:12:07 GMT



<html><head>

Verfasst: Mittwoch 20. Juli 2005, 19:15
von Leonidas
Ist das nicht etwas, was die httplib schon kann?

Verfasst: Mittwoch 20. Juli 2005, 19:27
von jens
Nö, damit sieht man IMHO nicht den zurück geschickten Header vom Sever. Um den geht es mir aber ;)

Verfasst: Mittwoch 20. Juli 2005, 19:33
von Leonidas
Und ich dachte, das geht mit HTTPResponse.getheader :?:

Verfasst: Mittwoch 20. Juli 2005, 19:37
von jens
OK, es geht mit HTTPResponse.getheaders()... Aber man erhält ein Dict mit den Header-Informationen...
Ich möchte aber gern den genauen Aufbau (Reihenfolge, Zeilenendezeichen) sehen :lol:

EDIT: Hab oben mal eine Beispiel Ausgaben hinzugefügt ;)

EDIT2: In dem Zusammenhang habe ich eine Interessante Webseite gefunden: http://www.bolege.de/whoiam/
Im Thread http://www.python-forum.de/viewtopic.php?t=3635 gibt's vom obrigen Skript auch eine Version mit einer POST anfrage...

Verfasst: Donnerstag 23. März 2006, 22:02
von jens
Und noch was interessantes in dem zusammenhang gefunden. Mit LiveHTTPHeaders kann man im Firefox die Header in der Sidebar mitverfolgen:

http://livehttpheaders.mozdev.org

Verfasst: Freitag 24. März 2006, 04:47
von mitsuhiko
Wollte nur mal anmerken, dass das mit Telnet auch einfacher geht. :-)

Verfasst: Freitag 24. März 2006, 08:07
von jens
Und wie füllst du mit telnet ein HTML-Formular aus??? Mit dem Plugin kannst du wirklich Live die HTTP Header sehen... z.B. wenn man irgendwo eingeloggt ist usw.

Probiere es mal aus, ist wirklich nett das Tool...

Verfasst: Freitag 24. März 2006, 11:14
von mitsuhiko
jens hat geschrieben:Probiere es mal aus, ist wirklich nett das Tool...
Ich kenns ja wohl, aber das war auch als Antwort zu deinem _ersten_ Post :-)

Verfasst: Freitag 24. März 2006, 11:44
von modelnine
Unahängig vom Sinn und Zweck des eigentlichen Tools (was ich durchaus als sinnvoll erachte, ich hab mir was ähnliches geschrieben, was ich heute abend mal posten kann): Du weißt dass Du Dich nicht an HTTP/1.1 hälst.

Du mußt mindestens einen Connection: <blah> und einen Host: <blah>-Header mitschicken damit Du Dich als HTTP/1.1-Client melden darfst. Das google.de Dir trotzdem Antwortet ist lieb, müssen sie aber nicht.

Im Endeffekt mußt Du also als Request-Header sowas (mindestens!) mitschicken:

Host: www.google.de:80
Connection: close

Genauso wärs sinnvoll einen Client-Typ zu fälschen, damit Du von der Webseite überhaupt eine Antwort kriegst. Und: man kann noch 'ne ganze Menge mehr finden (wie Content-Transfer-Encoding, etc.), was auch für HTTP/1.1-compliance sinnvoll wäre.

Dementsprechend: sei froh dass es mit google.com funktioniert, mit microsoft.com würde es nicht funktionieren (oder sie haben mittlerweilen viel geändert).

Verfasst: Freitag 24. März 2006, 14:22
von jens
Gute Idee... Ich hab oben mal das Skript erweitert...

Verfasst: Freitag 24. März 2006, 18:26
von Leonidas
jens hat geschrieben:Und wie füllst du mit telnet ein HTML-Formular aus?
Wo ist das Problem? telnet kann das, wobei ich für sowas netcat bevorzugen würde.
Das geht auch ganz einfach, denn bei GET-Formularen gibtst du die Felder in der URL an und bei POST schreibst du sie "einfach" in die Verbindung. :twisted: