BtbN's Funktionssammlung Nr.1: HTTP-POST-REQUESTS,Bank

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

BtbN

Betreff: BtbN's Funktionssammlung Nr.1: HTTP-POST-REQUESTS,Bank

BeitragSa, Okt 01, 2005 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type posts
 Field name$
 Field inhalt$
End Type

Function SetPostFieldText(name$,inhalt$)
 name$=Replace$(name$,"%","%25")
 name$=Replace$(name$,"+","%2B")
 name$=Replace$(name$," ","%20")
 name$=Replace$(name$,"@","%40")
 name$=Replace$(name$,"ß","%DF")
 name$=Replace$(name$,"?","%3F")
 name$=Replace$(name$,"=","%3D")
 name$=Replace$(name$,")","%29")
 name$=Replace$(name$,"(","%28")
 name$=Replace$(name$,"/","%2F")
 name$=Replace$(name$,"&","%26")
 name$=Replace$(name$,"$","%24")
 name$=Replace$(name$,"§","%A7")
 name$=Replace$(name$,Chr$(34),"%22")
 name$=Replace$(name$,"!","%21")
 name$=Replace$(name$,"^","%5E")
 name$=Replace$(name$,"#","%23")
 name$=Replace$(name$,"<","%3C")
 name$=Replace$(name$,">","%3E")
 name$=Replace$(name$,"{","%7B")
 name$=Replace$(name$,"}","%7D")
 name$=Replace$(name$,"[","%5B")
 name$=Replace$(name$,"]","%5D")
 inhalt$=Replace$(inhalt$,"%","%25")
 inhalt$=Replace$(inhalt$,"+","%2B")
 inhalt$=Replace$(inhalt$," ","%20")
 inhalt$=Replace$(inhalt$,"@","%40")
 inhalt$=Replace$(inhalt$,"ß","%DF")
 inhalt$=Replace$(inhalt$,"?","%3F")
 inhalt$=Replace$(inhalt$,"=","%3D")
 inhalt$=Replace$(inhalt$,")","%29")
 inhalt$=Replace$(inhalt$,"(","%28")
 inhalt$=Replace$(inhalt$,"/","%2F")
 inhalt$=Replace$(inhalt$,"&","%26")
 inhalt$=Replace$(inhalt$,"$","%24")
 inhalt$=Replace$(inhalt$,"§","%A7")
 inhalt$=Replace$(inhalt$,Chr$(34),"%22")
 inhalt$=Replace$(inhalt$,"!","%21")
 inhalt$=Replace$(inhalt$,"^","%5E")
 inhalt$=Replace$(inhalt$,"#","%23")
 inhalt$=Replace$(inhalt$,"<","%3C")
 inhalt$=Replace$(inhalt$,">","%3E")
 inhalt$=Replace$(inhalt$,"{","%7B")
 inhalt$=Replace$(inhalt$,"}","%7D")
 inhalt$=Replace$(inhalt$,"[","%5B")
 inhalt$=Replace$(inhalt$,"]","%5D")
 For p.posts = Each posts
  If p\name$ = name$ Then
   p\inhalt$ = inhalt$
   Return 2
  EndIf
 Next
 p.posts = New posts
 p\name$ = name$
 p\inhalt$ = inhalt$
 Return 1
End Function

Function DeletePostField(name$)
 name$=Replace$(name$,"%","%25")
 name$=Replace$(name$,"+","%2B")
 name$=Replace$(name$," ","%20")
 name$=Replace$(name$,"@","%40")
 name$=Replace$(name$,"ß","%DF")
 name$=Replace$(name$,"?","%3F")
 name$=Replace$(name$,"=","%3D")
 name$=Replace$(name$,")","%29")
 name$=Replace$(name$,"(","%28")
 name$=Replace$(name$,"/","%2F")
 name$=Replace$(name$,"&","%26")
 name$=Replace$(name$,"$","%24")
 name$=Replace$(name$,"§","%A7")
 name$=Replace$(name$,Chr$(34),"%22")
 name$=Replace$(name$,"!","%21")
 name$=Replace$(name$,"^","%5E")
 name$=Replace$(name$,"#","%23")
 name$=Replace$(name$,"<","%3C")
 name$=Replace$(name$,">","%3E")
 name$=Replace$(name$,"{","%7B")
 name$=Replace$(name$,"}","%7D")
 name$=Replace$(name$,"[","%5B")
 name$=Replace$(name$,"]","%5D")
 For p.posts = Each posts
  If p\name$ = name$
   Delete p.posts
   Return True
  EndIf
 Next
 Return False
End Function

Function FreePostFields()
 Delete Each posts
End Function

Function CallPostURL(url$,port=80,headerbank=0)
 Local msg1$
 Local server$ = Replace(url$,"http://","")
 server$ = Mid(server$,1,Instr(server$,"/")-1)
 url$ = Replace(url$,"http://","")
 If Instr(url$,"/") Then
  url$ = Mid(url$,Instr(url$,"/"))
 Else
  url$ = "/"
 EndIf
 Local SENDHEADER$ = "POST "+url$+" HTTP/1.1" + Chr$(13)+Chr$(10)
 SENDHEADER$ = SENDHEADER$ + "Host: "+ server$ + Chr$(13)+Chr$(10)
 SENDHEADER$ = SENDHEADER$ + "User-Agent: BlitzBasic"+ Chr$(13)+Chr$(10)
 SENDHEADER$ = SENDHEADER$ + "Connection: close" + Chr$(13)+Chr$(10)
 SENDHEADER$ = SENDHEADER$ + "Content-Type: application/x-www-form-urlencoded" + Chr$(13)+Chr$(10)
 Local POSTDATA$
 For p.posts = Each posts
  If POSTDATA$ <> "" Then
   POSTDATA$ = POSTDATA$ + "&"+p\name$+"="+p\inhalt$
  Else
   POSTDATA$ = p\name$+"="+p\inhalt$
  EndIf
 Next
 SENDHEADER$ = SENDHEADER$ + "Content-length: "+Len(POSTDATA$)+Chr$(13)+Chr$(10)+Chr$(13)+Chr$(10)
 FreePostFields()
 SENDHEADER$ = SENDHEADER$ + POSTDATA$
 Local TCPStream = OpenTCPStream(server$,port)
 If TCPStream = 0 Then Return False
 WriteLine(TCPStream,SENDHEADER$)
 Local headerinfo$
 Repeat
  msg1$ = ReadLine(TCPStream)
  If msg1$ = "" Then Exit
  If Eof(TCPStream) Then Exit
  headerinfo$ = headerinfo$ + msg1$ + Chr(13) + Chr(10)
 Forever
 If headerbank <> 0 Then
  ResizeBank(headerbank,Len(headerinfo$)+20)
  PokeString(headerbank,0,headerinfo$)
 EndIf
 Return TCPStream
End Function

Function PeekString$(bank,offset=0)
 Local outstring$
 Repeat
  If PeekByte(bank,offset) = 7 Then Exit
  outstring$ = outstring$+Chr(PeekByte(bank,offset))
  offset = offset + 1
 Forever
 Return Left(outstring$,Len(outstring$)-2)
End Function

Function PokeString(bank,offset,value$)
 Local o
 For o = 1 To Len(value$)
  PokeByte(bank,offset+o-1,Asc(Mid(value$,o,1)))
 Next
 PokeByte(bank,o+1,7)
End Function


Anwendungsbeispiel:

BlitzBasic: [AUSKLAPPEN]
bank = CreateBank(1)

SetPostFieldText(\"testparam\",\"sd&lol2=asd\")
strm = CallPostURL(\"deine_url_hier\",80,bank) ;Parameter: url$,[port=80,bank=0]
Print PeekString(bank)

Repeat
Print ReadLine(strm)
Until Eof(strm)

CloseTCPStream(strm)
FreeBank(bank)

WaitKey()

End


Also:

Funktion: SetPostFieldText
Fügt ein neues POST-Feld hinzu, welches zum senden gespeichert wird
Parameter:
name$ : Der Name des Feldes
inhalt$ : Der Inhalt des Feldes

Funktion: DeletePostField
Löscht ein POST-Feld, anhand des Namens
Parameter:
name$ : Der Name des Feldes, was gelöscht werden soll
Rückgabe:
True wenn gelöscht, ansonsten False

Funktion: FreePostFields
Löscht alle bereits eingetragenen POST-Felder

Funktion: CallPostURL
Ruft eine URL auf, dabei muss man die URL nicht zerteilen oder sonstiges, GET-Variablen können wie im Browser an die URL angehangen werden, die POST-Variablen über die POST-Variablen Befehle. Dies kann natürlich auch zum simplen aufrufen einer URL verwendet werden. Die HTTP-Header werden auch weggeschnitten, man ließt direkt am beginn des Dokuments.
Parameter:
url$: Die komplette URL, inklusive GET-Werten
[port] : Der Server Port, Kann ausgelsaaen werden, dann 80
[headerbank] : Hier kann ein Handle einer Bank angegeben werden, in die die HTTP-Heder gespeichert werden, die größe der Bank ist egal, sie wird automatisch angepasst. Mit dem Befehl PeekString kann der Header dann aus der Bank ausgelesen werden. Dieser Parameter is ebenfals optional.

Funktion: PeekString
Ein erweiterter Bank-Befehl, mit ihm kann man einen String aus einer Bank lesen.
ACHTUNG: Wenn vorher kein String mit PokeString geschreiben wurde, führ dies zu einem Error!
Parameter:
bank: Das Bank-Handle
[offset]: Start-Position des Strings. Standart ist 0
Rückgabe: Der String

Funktion PokeString
Ein erweiterter Bank-Befehl, schreibt einen String in eine Bank, wenn die Bank zu klein ist, führt dies zu einem Error. Der String kann mit PeekString wieder ausgelesen werden.
Parameter:
bank: Das bank-Handle
offset: Start-Position des Strings
value$: Der String, der geschreiben werden soll


Mfg,
BORNtobeNAMELESS

x-pressive

BeitragSa, Dez 10, 2005 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Super-nützlich! Very Happy

Zwei Punkte dazu:

1. Mir ist irgendwie noch nicht so ganz klar, wozu du die Bank brauchst? So wie ich das verstehe, stopfst du da den zurückkommenden Standard-Header vom Server rein -aber wozu?

2. Übersichtlicher wäre es vielleicht, wenn du eine eigene Funktion zum URL-Encoden benutzt, dann muß man das nicht dreimal schreiben:


BlitzBasic: [AUSKLAPPEN]

Function URLEncode$ (txt$)
txt$=Replace$(txt$,\"%\",\"%25\")
txt$=Replace$(txt$,\"+\",\"%2B\")
txt$=Replace$(txt$,\" \",\"%20\")
txt$=Replace$(txt$,\"@\",\"%40\")
txt$=Replace$(txt$,\"ß\",\"%DF\")
txt$=Replace$(txt$,\"?\",\"%3F\")
txt$=Replace$(txt$,\"=\",\"%3D\")
txt$=Replace$(txt$,\")\",\"%29\")
txt$=Replace$(txt$,\"(\",\"%28\")
txt$=Replace$(txt$,\"/\",\"%2F\")
txt$=Replace$(txt$,\"&\",\"%26\")
txt$=Replace$(txt$,\"$\",\"%24\")
txt$=Replace$(txt$,\"§\",\"%A7\")
txt$=Replace$(txt$,Chr$(34),\"%22\")
txt$=Replace$(txt$,\"!\",\"%21\")
txt$=Replace$(txt$,\"^\",\"%5E\")
txt$=Replace$(txt$,\"#\",\"%23\")
txt$=Replace$(txt$,\"<\",\"%3C\")
txt$=Replace$(txt$,\">\",\"%3E\")
txt$=Replace$(txt$,\"{\",\"%7B\")
txt$=Replace$(txt$,\"}\",\"%7D\")
txt$=Replace$(txt$,\"[\",\"%5B\")
txt$=Replace$(txt$,\"]\",\"%5D\")
Return txt$
End Function
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BtbN

BeitragSa, Dez 10, 2005 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese bank is dazu gedacht, das man, wenn man will, die Header des server bekommen kann.
Einfach da nen bank-Handle rein, und er haut die Header in die Bank.

x-pressive

BeitragSa, Dez 10, 2005 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist mir schon klar -aber welche Vorteile hat es, dafür eine Bank zu benutzen? Ist das persönliche Vorliebe oder habe ich da einen Vorteil übersehen?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BtbN

BeitragSa, Dez 10, 2005 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Nenn mir ne alternative!
Ich geba ja schon den TCP-Stream zurück...

x-pressive

BeitragSa, Dez 10, 2005 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich ignoriere den zurückgesendeten Header eigentlich komplett. Wenn es einen Datenbankfehler o.ä. gab, sendet mein Script auf dem Server eine Zeile zurück, die am Anfang "ERROR: ..." enthält. Das ganze blah-blah vom Server schenke ich mir in dem Fall, es genügt ja, zu wissen, wo die eigentlichen Ausgabewerte des Script anfangen.

Meine Frage war eher so gemeint, welche Gründe es geben könnte, den Header zu speichern und wozu man diese Daten noch verwenden kann.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Justus

BeitragSa, Dez 10, 2005 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie ich BtbN kenne, ist es reine Neugier Very Happy

Es hat eigentlich keinen praktischen Nutzen...

BtbN

BeitragSa, Dez 10, 2005 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein gutes Beispiel, wenn man nen eigenen Renderer/Browser schreiben will ist ja, dass die Cookies in ner Header-Zeile gesendet werden.
Wenn man nun also diese Cookie verarbeiten möchte, muss man ja die Heder haben.
Oder wenn man wissen will, ob die Seite ein Passwort braucht, kommt das auch über die Header...

x-pressive

BeitragSa, Dez 10, 2005 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Seltsam -mein Programm empfängt keine Daten mehr vom Script, seitdem ich es jetzt von GET (HTTP 1.0) mittels obiger Methode auf POST (HTTP 1.1) geändert habe. Der Header (in dem Fall doch sinnvoll! Very Happy) meldet ein OK - document follows, aber nach der leeren Zeile kommt nichts mehr.

Woran könnte das denn liegen?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BtbN

BeitragSa, Dez 10, 2005 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
da drinne steht nix? ^^
Achja:
Bei HTTP 1.0 konnte man GET http://test.de/123.html
machn, bei HTTP 1.1 muss man GET /123.html

x-pressive

BeitragSa, Dez 10, 2005 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das habe ich berücksichtigt. So sieht das nun aus:

BlitzBasic: [AUSKLAPPEN]

path$ = \"/scripts/test.php\"
server$ = \"localhost\"
serverPort = 80
postData$ = \"test1=blah&test2=blubb&test3=blobb\"
lineFeed$ = Chr(13) + Chr(10)

; CREATE HEADER
Local header$
header$ = \"POST \" + path$ + \" HTTP/1.1\" + lineFeed$
header$ = header$ + \"Host: \" + server$ + lineFeed$
header$ = header$ + \"User-Agent: \" + USERAGENT$ + lineFeed$
header$ = header$ + \"Connection: close\" + lineFeed$
header$ = header$ + \"Content-Type: application/x-www-form-urlencoded\" + lineFeed$
header$ = header$ + \"Content-length: \" + Len(postData$) + lineFeed$ + lineFeed$
header$ = header$ + postData$

; SEND TO SERVER
Stream = OpenTCPStream(server$, serverPort) : If Stream = 0 Then Notify \"Das war nix.\" : End
WriteLine (Stream, header$)

; CONNECTION FAILED?
If Eof(Stream) Then Notify \"Irgendwas ist furchtbar schief gelaufen.\" : Return False


Die Verbindung wird ja hergestellt -der Server antwortet ja mit OK und gibt auch kein "not found" oder so zurück. Aber ausser Header und der Leerzeile kommen einfach keine Daten mehr vom Script zurück. Shocked
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BtbN

BeitragSa, Dez 10, 2005 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
kanns sein, der er schlicht nichts sendet?
Versuch ma, das über meine Lib zu machen.
  • Zuletzt bearbeitet von BtbN am Sa, Dez 10, 2005 18:23, insgesamt einmal bearbeitet

x-pressive

BeitragSa, Dez 10, 2005 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso aufspalten, denke schon, daß das direkt damit zu tun hat und sicher für alle hilfreich ist, die ebenfalls damit arbeiten möchten.

Das Testscript besteht aus einem simplen echo"BLAH" und gibt auf jeden Fall etwas aus. Es muß irgendwie an der POST-Methode oder dem Header wie oben angegeben liegen, denke ich.

Hast du den Code mal auf einem lokalen Windows-Server getestet? Könnte es sein, daß sich das unter Windows irgendwie anders verhält? In meinem vorigen Code hatte ich z.B. auch keine LineFeeds bentutzt. Da sah der Header so aus (und es hat funktioniert):

BlitzBasic: [AUSKLAPPEN]

gStream = OpenTCPStream(gServer$, gServerPort) : If gStream = 0 Then Notify BreakText(TXT_CANTCONNECT$,50) : End
WriteLine gStream,\"GET /\" + path$ + \"test.php?action=\" + action$ + params$ + \" HTTP/1.0\"
WriteLine gStream,\"Host: \" + gServer$
WriteLine gStream,\"User-Agent: \" + USERAGENT$
WriteLine gStream,\"Accept: */*\"
WriteLine gStream,\"\"


Es muß wohl irgendwie am Header liegen, wenn ich nicht irgendwo einen Fehler reingehauen habe...
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

BtbN

BeitragSa, Dez 10, 2005 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Grundsätzlich:
HTTP bleibt HTTP, egal ob Windows oder Linux.

Ich seh da überhaupt keinen Fehler, ka, worans liegt.

x-pressive

BeitragSa, Dez 10, 2005 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast recht, hast recht! War mein Fehler -ich habe jetzt stundenlang im Code rumgegraben -es lag mal wieder an irgendeinem miesen, kleinen, erbärmlichen Flüchtigkeitsfehler Evil or Very Mad

Funktioniert -danke euch Wink
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group