warum GET ich nichts ?

Anfängerfragen zum Programmieren mit PureBasic.
OptimusPrime
Beiträge: 43
Registriert: 07.03.2005 16:52

warum GET ich nichts ?

Beitrag 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
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Re: warum GET ich nichts ?

Beitrag 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...
OptimusPrime
Beiträge: 43
Registriert: 07.03.2005 16:52

...

Beitrag 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 !
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag 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.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Nanu, "Verbindung konnte nicht aufgebaut werden"?
Ist ja sehr merkwürdig. Muss man bei den VServern eine spezielle Verbindung aufbauen?

Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag 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.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Antworten