Seite 1 von 2

warum GET ich nichts ?

Verfasst: 15.03.2005 17:33
von OptimusPrime
Diesen (etwas abgewandelten) Code habe ich von einem netten Poster
aus diesem Forum bekommen,
es ging um einen HTTP GET auf beliebige Internetseiten.

Ich habe mittlerweile unzählige Header, Server und Seiten ausprobiert,
das Beste, was ich je als Antwort bekommen habe war :
404 Bad Request...

In diesem Fall versuche ich auf meinen eigenen Server (Localhost) zuzugreifen, erfolglos.

nach etwa 20 sekunden erscheint der Requester - leer.

Was mach ich denn nur Falsch ?

Für die Webseiten habe ich mir Server herausgesucht, genaue Zielpfade für das GET, aber nix.

Code: Alles auswählen

Global a$
a$="GET /index.html HTTP/1.0"
Procedure HTTPRequest()
 InitNetwork()
   ServerID=OpenNetworkConnection("127.0.0.1",80)
     SendNetworkString(ServerID, a$)
     mem=AllocateMemory(10240)
     Repeat
     ReceiveNetworkData(ServerID,mem,10240)
      dat$=PeekS(mem)
      MessageRequester("Received Data: ",dat$,0)
      CloseNetworkConnection(ServerID)
      Break    
    ForEver    
EndProcedure
HTTPRequest()
Edit by NicTheQuick: Code-Tags gesetzt

Re: warum GET ich nichts ?

Verfasst: 15.03.2005 19:09
von traumatic
Ein einfaches GET reicht nicht.
Je nach Server werden weitere Dinge erwartet, z.B. der Host, User-Agent, akzeptierte MIME-Types etc.,
ausserdem sind die CRLFs sehr wichtig...

Hast Du schonmal auf PureArea oder im Forum gesucht?
Da gibt's sicherlich gute Beispiele.

Das Minium dürfte so aussehen:

Code: Alles auswählen

a$ = "GET / HTTP/1.0" + #CRLF$
a$ + "Host: www.purebasic.com" + #CRLF$
a$ + "Referer: www.purebasic.com" + #CRLF$
a$ + #CRLF$
Das wird aber nicht bei jedem Server funktionieren.
Bei www.purebasic.com geht's, kannst Du ja mal Testweise ausprobieren...

...

Verfasst: 15.03.2005 21:07
von OptimusPrime
Nun weiss ich, dass ich schon mal nicht ganz auf dem Holzweg war ;o)))

Danke für die Tipps, die Mime Typen werde ich dann noch anpassen !

Vielen Dank !

Verfasst: 15.03.2005 21:28
von Laurin
Ich muss traumatic zustimmen, GET alleine reicht nicht. Der Server erwartet meist mehr Angaben.

Hier dein Code, den ich etwas umgebaut habe. Er funzt einwandfrei bei mir.

Code: Alles auswählen

Procedure HTTPRequest(a$)
  If InitNetwork()
    Debug "Netzwerk erkannt"
  Else
    Debug "Netzwerkfehler"
    End
  EndIf
  
  ServerID=OpenNetworkConnection("forums.purebasic.com",80)
  If ServerID
    Debug "Verbindung aufgebaut"
  Else
    Debug "Verbindung konnte nicht aufgebaut werden"
    End
  EndIf
  
  SendNetworkString(ServerID, a$)
  Debug "GET-Header gesendet"
  
  *mem=AllocateMemory(10240)
  
  Repeat
    NetworkEvent = NetworkClientEvent(ServerID)
    
    If NetworkEvent = 2
      Debug "Daten empfangen"
      
      Laenge = ReceiveNetworkData(ServerID, *mem, 10240)
      dat$=PeekS(*mem, Laenge)
    
      MessageRequester("Received Data: ",dat$,0)
    
      CloseNetworkConnection(ServerID)
      Debug "Verbindung geschlossen"
      
      Quit = 1
    EndIf 
  Until Quit = 1
EndProcedure

HTTPRequest("GET /index.html HTTP/1.0" + #CRLF$ + "User-Agent: PB/3.93" + #CRLF$ + #CRLF$)
Greetz Laurin

Verfasst: 15.03.2005 21:33
von bluejoke
Es würde mich äußerst Wundern, wenn der Referrer zu dem minimal-header gehört. In meinen logs sind etliche Seitenaufrufe ohne Referrer gespeichert, was immer dann passiert, wenn der Client keinem Link gefolgt ist, sondern die URL irgendwoher selbst wusste.

Verfasst: 15.03.2005 21:39
von Laurin
Habe gerade probiert, den von mir modifizierten Code ohne User-Agent laufen zu lassen. Geht auch.

Damit reduziert sich der minimale GET-Header auf "GET (Datei) HTTP/1.0". Ich erinnere mich aber dunkel, dass man eigendlich mehr Angaben im Header machen soll. Muss wohl nochmal die RFC zu HTTP lesen.

Greetz Laurin

Verfasst: 15.03.2005 22:41
von traumatic
bluejoke hat geschrieben:Es würde mich äußerst Wundern, wenn der Referrer zu dem minimal-header gehört. In meinen logs sind etliche Seitenaufrufe ohne Referrer gespeichert, was immer dann passiert, wenn der Client keinem Link gefolgt ist, sondern die URL irgendwoher selbst wusste.
Yo, referer war natürlich quatsch, wobei

Code: Alles auswählen

a$ + "Referer: " + #CRLF$
harmlos ist und ebenso keinen Eintrag in Deinen Logfiles machen würde.

"Host" scheint aber unabdingbar zu sein, Laurins Code funktioniert z.B.
bei www.pure-board.de nicht für 'ne Mark ;)

Selbiges gilt für alle anderen virtuellen Schlund (1&1, Puretec, etc.) Server.

Verfasst: 16.03.2005 02:59
von Laurin
Nanu, "Verbindung konnte nicht aufgebaut werden"?
Ist ja sehr merkwürdig. Muss man bei den VServern eine spezielle Verbindung aufbauen?

Greetz Laurin

Verfasst: 16.03.2005 10:16
von traumatic
Laurin hat geschrieben:Nanu, "Verbindung konnte nicht aufgebaut werden"?
Ist ja sehr merkwürdig. Muss man bei den VServern eine spezielle Verbindung aufbauen?
Eigentlich sollte die Fehlermeldung eine 500 sein.
Wie dem auch sei, die ganzen Domains werden ja alle zu ein und derselben
IP aufgelöst, das Verzweigen in das entsprechende Verzeichnis läuft über
die Domain-Namen. Deshalb muss hier der Host mit übergeben werden.

Verfasst: 16.03.2005 16:42
von Laurin
Ich hab auf pure-board.com statt auf pure-board.de getestet. Drum konnte er keine Verbindung aufbauen.

Es ist eine 404 Not Found und anschließend ein 500 Internal Server Error.
Der 500 kommt aber nur, weil eine Fehlerseite für 404 nicht existiert /:->

Ich denke, ich werde mich mal nochmal daran ransetzen und schauen, ob ich das nicht doch irgendwie zum Laufen bekommen.