Seite 1 von 2

HTTP Request/Response

Verfasst: 20.10.2009 21:51
von tonisarov
Hallo,

habe schon mal bisschen darüber gelesen und auch paar Themen im Forum gelesen, leider passte nichts zu meinem Problem, deswegen neues Thema.

Code: Alles auswählen

CRLF$ = Chr(13) + Chr(10)

toSend$ = "GET / HTTP/1.1" + CRLF$
toSend$ = toSend$ + "Host: welt2.travian.de" + CRLF$
toSend$ = toSend$ + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + CRLF$
toSend$ = toSend$ + "Accept-Language: en-us,en;q=0.5" + CRLF$
toSend$ = toSend$ + "Accept-Encoding: gzip,deflate" + CRLF$
toSend$ = toSend$ + "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7" + CRLF$
toSend$ = toSend$ + "Keep-Alive: 300" + CRLF$
toSend$ = toSend$ + "Connection: keep-alive" + CRLF$
toSend$ = toSend$ + CRLF$

OpenConsole()
Print(toSend$)
Input()
CloseConsole()

InitNetwork()

travi = OpenNetworkConnection("welt2.travian.de", 80)
SendNetworkData(travi, @toSend$, Len(toSend$))
*content = AllocateMemory(5000)
Repeat
      Delay(100)
      Result = NetworkClientEvent(travi)
      Debug Result
     
      Select Result

      Case 2
        ReceiveNetworkData(travi,*content,1000)
        Ok = 1
        CloseNetworkConnection(travi)
     EndSelect

Until Ok = 1 

  If CreateFile(0, "C:/response.txt")
    WriteString(0, PeekS(*content,150), #PB_Unicode)
  EndIf
also ich will einfach das Dokument was auf welt2.travian.de ist. Oben erstelle ich mein HTTP Request - alle Zeilen enden mit CRLF und am Ende das noch mal. Dann neue Verbindung zum Webserver (port 80) herstellen, Request schicken und dann Response lesen.
Alles prima, aber wenn ich die Datei "response.txt" öffne, kommt bisschen HTML, wo zu sehen ist: den Statuscode 400 und Bad request.
Und was mich noch mehr verwirrt - wenn ich das alles via Telnet erledige, dann kriege ich ganz normales Response. Also ich gehe davon aus, mein Request ist fehlerfrei. Sitze schon seit einem Tag daran und habe keine Ideen mehr.
Danke im voraus!

Re: HTTP Request/Response

Verfasst: 20.10.2009 22:06
von Kiffi
Travian Games GmbH-AGB hat geschrieben:(5) Der Nutzer ist lediglich berechtigt, das Spiel über gängige Webbrowser zu nutzen.
Jegliche darüber hinausgehende Nutzung von Zusatzprogrammen, Skripten oder sonstigen
Hilfsmitteln ist ausdrücklich untersagt. Eine Missachtung dieses Verbots kann ebenfalls nach
Abmahnung zur sofortigen Sperrung oder Löschung des betreffenden Accounts führen.
Lass lieber die Finger davon ;-)

Grüße ... Kiffi

Re: HTTP Request/Response

Verfasst: 20.10.2009 22:10
von ts-soft
Schalt mal den Unicode-Modus in den Compileroptionen aus.
response.txt hat geschrieben:H T T P / 1 . 1 2 0 0 O K

S e r v e r : n g i n x

D a t e : T u e , 2 0 O c t 2 0 0 9 2 0 : 0 9 : 1 3 G M T

C o n t e n t - T y p e : t e x t / h t m l ; c h a r s e t = U T F - 8

T r a n s f e r - E n c o d i n g : c h u n k e d

C o n n e c t i o n : k

Re: HTTP Request/Response

Verfasst: 20.10.2009 22:21
von tonisarov
Danke ts-soft, habe den Hacken vor "Create unicode executable" weggenommen, aber das verwirrt mich weiter - was für Einfluss hat das auf den Output. Schließlich kompiliere ich den Code und habe nicht mal "Create executable..." gemacht.

Re: HTTP Request/Response

Verfasst: 20.10.2009 22:35
von ts-soft
tonisarov hat geschrieben:Schließlich kompiliere ich den Code und habe nicht mal "Create executable..." gemacht.
PB erstellt immer eine Executable, in diesem Falle eben temporär. Ist ja schließlich kein Interpreter :)

// Nachtrag:
Ändere den Source mal in:

Code: Alles auswählen

toSend$ = "GET / HTTP/1.1" + #CRLF$
toSend$ = toSend$ + "Host: welt2.travian.de" + #CRLF$
toSend$ = toSend$ + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + #CRLF$
toSend$ = toSend$ + "Accept-Language: en-us,en;q=0.5" + #CRLF$
toSend$ = toSend$ + "Accept-Encoding: gzip,deflate" + #CRLF$
toSend$ = toSend$ + "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7" + #CRLF$
toSend$ = toSend$ + "Keep-Alive: 300" + #CRLF$
toSend$ = toSend$ + "Connection: keep-alive" + #CRLF$
toSend$ = toSend$ + #CRLF$

OpenConsole()
Print(toSend$)
Input()
CloseConsole()

InitNetwork()

travi = OpenNetworkConnection("welt2.travian.de", 80)
SendNetworkData(travi, @toSend$, Len(toSend$))
*content = AllocateMemory(5000)
Repeat
  Delay(100)
  Result = NetworkClientEvent(travi)
  Debug Result

  Select Result

    Case 2
      ReceiveNetworkData(travi, *content, 1000)
      Ok = 1
      CloseNetworkConnection(travi)
  EndSelect

Until Ok = 1

If CreateFile(0, "C:\response.txt")
  WriteString(0, PeekS(*content, -1, #PB_UTF8))
EndIf
ohne Unicode!

Re: HTTP Request/Response

Verfasst: 21.10.2009 01:28
von AND51
Du suchst nicht zufällig ReceiveHTTPFile()?

Re: HTTP Request/Response

Verfasst: 21.10.2009 11:09
von tonisarov
@AND51: ReceiveHTTPFile() wird auch hilfreich sein, aber wenn ich POST requests mache, soll ich es allein schreiben, oder?

Also jetzt kriege ich Response vom Server (Status 200 OK), aber laut HTTP Spezifikation sollte ich auch den Code selber kriegen, ich meine den entsprechenden HTML Dokument was meines Requests entspricht. Wie davor gesagt, klappt das via Telnet prima, aber nicht hier.

Re: HTTP Request/Response

Verfasst: 21.10.2009 12:41
von HeX0R
Vermutlich reichen die 1000 Zeichen nicht aus?

Ausserdem muss man sich beim Daten empfangen schon etwas mehr Mühe geben, als das was da im Code steht...

Re: HTTP Request/Response

Verfasst: 21.10.2009 12:47
von bobobo
guck dir mal den http-requester aus dem codearchiv an
http://www.purearea.net/pb/CodeArchiv/I ... quester.pb
der kann das

Re: HTTP Request/Response

Verfasst: 21.10.2009 21:50
von tonisarov
ich habe den Code bisschen geändert, jetzt liest er meiner Meinung nach alle Symbolen aus dem Response (ist zumindest mit Debug zu sehen), schreibt aber nichts in Datei. Noch ein weiteres Problem ist, dass Response Header - der Teil mit Status code usw ist lesbar, der Body - nicht.

Code: Alles auswählen

*content = AllocateMemory(8000)
Repeat

  Delay(100)
  Result = NetworkClientEvent(travi)

  Select Result
	Case 0
		Break
    Case 2
      ReceiveNetworkData(travi, *content, 500)
      Debug PeekS(*content)
      ;Debug "travi: " + Str(travi)
      ;Debug "result: " + Str(Result)
      If travi = 0
      	Break
      EndIf
  EndSelect

ForEver
CloseNetworkConnection(travi)

If CreateFile(0, "C:\response.txt")
    WriteString(0, PeekS(*content,-1, #PB_UTF8))
EndIf