Seite 1 von 1

PHP PB

Verfasst: 17.09.2006 18:46
von Mathias-Kwiatkowski
wie kann ich ne verbindung zu einem PHP script aufnehmen und dem php script ne $_POST zukommen lassen?

Verfasst: 17.09.2006 19:12
von edel
Du kannst deinem Script nen Brief schreiben , dann
hat es genug Post, oder die Forensuche bemuehen.

Verfasst: 17.09.2006 19:13
von DarkDragon

Code: Alles auswählen

; HTTP Commands - DarkDragon
; ***************************
; Commands:
; ---------
; HTTPRequest(URL.s, *EndSize.LONG, PacketSize, *Callback) - Result: Pointer to a buffer containing the webdata
; URL.s       - [in]  Nullterminated string with the link to the file
; *EndSize    - [out] Pointer to a long variable which receives the size of the resulting buffer
; PacketSize  - [in]  Long variable containing the size of the packets(steps) to download
; *Callback   - [in]  Pointer to a callback method receiving the following parameters: CurrentDownloadedSize.l, MaximumLength.l

; HTTPRequest_Password(URL.s, *EndSize.LONG, PacketSize, Username.s, Password.s, *Callback) - Result: Pointer to a buffer containing the webdata
; URL.s       - [in]  Nullterminated string with the link to the file
; *EndSize    - [out] Pointer to a long variable which receives the size of the resulting buffer
; PacketSize  - [in]  Long variable containing the size of the packets(steps) to download
; Username.s  - [in]  Nullterminated string containing the username
; Password.s  - [in]  Nullterminated string containing the password(NOT encoded)
; *Callback   - [in]  Pointer to a callback method receiving the following parameters: CurrentDownloadedSize.l, MaximumLength.l

InitNetwork()

#TIMEOUT = 1500

Procedure.s ReceiveLine(ConnectionID)
  Text.s = ""
  While char.b <> #LF
    char = 0
    ReceiveNetworkData(ConnectionID, @char, 1)
    If char <> 0
      Text.s + Chr(char)
    EndIf
  Wend
  
  ProcedureReturn RemoveString(RemoveString(Text, #CR$), #LF$)
EndProcedure

Procedure HTTPRequest(URL.s, *EndSize.LONG, PacketSize, *Callback)
  Protected Size.l, Data_.s, s.l, Method.s, File.s, Content.s, Text.s, Length.l, Line.s
  Protected CurSize.l, oSize.l, t.l, ConnectionID.l
  
  If Left(URL, 7) = "http://" : URL = Right(URL, Len(URL)-7) : EndIf
  s = FindString(URL, "/", 1)
  Host.s = "" : File.s = ""
  If s <> 0 : Host.s = Left(URL, s-1) : File.s = Right(URL, Len(URL)-s) : Else : Host = URL : EndIf
  
  s = FindString(File, "?", 1)
  If s <> 0
    Method.s = "POST"
    Content.s = Right(File, Len(File)-s)
    File = Left(File, s-1)
  Else
    Method.s = "GET"
    Content.s = ""
  EndIf
  
  ConnectionID = OpenNetworkConnection(Host, 80)
  If ConnectionID
    Data_.s = Method+" /"+File+" HTTP/1.0"+#CRLF$
    Data_.s + "Host: "+Host+#CRLF$
    Data_.s + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"+#CRLF$
    If Content <> ""
      Data_.s + "Connection: close"+#CRLF$
      Data_.s + "Content-Type: application/x-www-form-urlencoded"+#CRLF$
      Data_.s + "Content-Length: "+Str(Len(Content))+#CRLF$
      Data_.s + #CRLF$ + Content.s + #CRLF$+#CRLF$
    Else
      Data_.s + "Connection: close"+#CRLF$+#CRLF$
    EndIf
    
    SendNetworkString(ConnectionID, Data_)
    While NetworkClientEvent(ConnectionID) <> 2 : Delay(10) : Wend
    
    Length = 0
    Line.s = ""
    Repeat
      Line = ReceiveLine(ConnectionID)
      Select LCase(StringField(Line, 1, ":"))
        Case "content-length"
          
          Length = Val(Trim(StringField(Line, 2, ":")))
      EndSelect
    Until Len(Trim(Line)) <= 4
    
    Size = 0
    If Length <> 0
      
      *Result = AllocateMemory(Length)
      
      While Size < Length
        If CurSize > 0
          Size + CurSize
          If *Callback
            CallFunctionFast(*Callback, Size, Length)
          EndIf
        EndIf
        If Size > (Length-PacketSize)
          PacketSize = Length-Size
        EndIf
        If PacketSize > 0
        CurSize = ReceiveNetworkData(ConnectionID, *Result+Size, PacketSize)
        EndIf
      Wend
      
    Else
      
      *Buffer = AllocateMemory(PacketSize)
      *Result = AllocateMemory(1)
      t = ElapsedMilliseconds()
      While ElapsedMilliseconds()-t <= #TIMEOUT
        If NetworkClientEvent(ConnectionID) = 2
          CurSize = ReceiveNetworkData(ConnectionID, *Buffer, PacketSize)
          If CurSize > 0
            oSize = Size
            Size + CurSize
            *Result = ReAllocateMemory(*Result, Size)
            CopyMemory(*Buffer, *Result+oSize, CurSize)
            If *Callback
              CallFunctionFast(*Callback, Size, 0)
            EndIf
          EndIf
          t = ElapsedMilliseconds()
        EndIf
      Wend
      Length = Size
      
    EndIf
    
    *EndSize\l = Length
    If *Callback
      CallFunctionFast(*Callback, Size, Length)
    EndIf
    
    CloseNetworkConnection(ConnectionID)
    
    ProcedureReturn *Result
  EndIf
EndProcedure

Procedure HTTPRequest_Password(URL.s, *EndSize.LONG, PacketSize, Username.s, Password.s, *Callback)
  Protected Size.l, Data_.s, s.l, Method.s, File.s, Content.s, Text.s, Length.l, Line.s
  Protected CurSize.l, oSize.l, t.l, ConnectionID.l
  
  If Left(URL, 7) = "http://" : URL = Right(URL, Len(URL)-7) : EndIf
  s = FindString(URL, "/", 1)
  Host.s = "" : File.s = ""
  If s <> 0 : Host.s = Left(URL, s-1) : File.s = Right(URL, Len(URL)-s) : Else : Host = URL : EndIf
  
  s = FindString(File, "?", 1)
  If s <> 0
    Method.s = "POST"
    Content.s = Right(File, Len(File)-s)
    File = Left(File, s-1)
  Else
    Method.s = "GET"
    Content.s = ""
  EndIf
  
  InputBuffer.s = Username+":"+Password
  OutputBuffer.s = Space(256)
  Base64Encoder(@InputBuffer, Len(InputBuffer), @OutputBuffer, 255)
  
  ConnectionID = OpenNetworkConnection(Host, 80)
  If ConnectionID
    Data_.s = Method+" /"+File+" HTTP/1.0" + #CRLF$
    Data_.s + "Host: "+Host + #CRLF$
    Data_.s + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7" + #CRLF$
    Data_.s + "Authorization: Basic "+ OutputBuffer + #CRLF$
    If Content <> ""
      Data_.s + "Connection: close" + #CRLF$
      Data_.s + "Content-Type: application/x-www-form-urlencoded"+#CRLF$
      Data_.s + "Content-Length: "+Str(Len(Content))+#CRLF$
      Data_.s + #CRLF$ + Content.s + #CRLF$+#CRLF$
    Else
      Data_.s + "Connection: close" + #CRLF$ + #CRLF$
    EndIf
    
    SendNetworkString(ConnectionID, Data_)
    While NetworkClientEvent(ConnectionID) <> 2 : Delay(10) : Wend
    
    Length = 0
    Line.s = ""
    Repeat
      Line = ReceiveLine(ConnectionID)
      Select LCase(StringField(Line, 1, ":"))
        Case "content-length"
          
          Length = Val(Trim(StringField(Line, 2, ":")))
      EndSelect
    Until Len(Trim(Line)) <= 4
    
    Size = 0
    If Length <> 0
      
      *Result = AllocateMemory(Length)
      
      While Size < Length
        If CurSize > 0
          Size + CurSize
          If *Callback
            CallFunctionFast(*Callback, Size, Length)
          EndIf
        EndIf
        If Size > (Length-PacketSize)
          PacketSize = Length-Size
        EndIf
        If PacketSize > 0
        CurSize = ReceiveNetworkData(ConnectionID, *Result+Size, PacketSize)
        EndIf
      Wend
      
    Else
      
      *Buffer = AllocateMemory(PacketSize)
      *Result = AllocateMemory(1)
      t = ElapsedMilliseconds()
      While ElapsedMilliseconds()-t <= #TIMEOUT
        If NetworkClientEvent(ConnectionID) = 2
          CurSize = ReceiveNetworkData(ConnectionID, *Buffer, PacketSize)
          If CurSize > 0
            oSize = Size
            Size + CurSize
            *Result = ReAllocateMemory(*Result, Size)
            CopyMemory(*Buffer, *Result+oSize, CurSize)
            If *Callback
              CallFunctionFast(*Callback, Size, 0)
            EndIf
          EndIf
          t = ElapsedMilliseconds()
        EndIf
      Wend
      Length = Size
      
    EndIf
    
    *EndSize\l = Length
    If *Callback
      CallFunctionFast(*Callback, Size, Length)
    EndIf
    
    CloseNetworkConnection(ConnectionID)
    
    ProcedureReturn *Result
  EndIf
EndProcedure

; Example:

; *Buffer = HTTPRequest("http://www.bradan.net/", @Size, 16, 0)
; Debug Size
; Debug PeekS(*Buffer, Size)
; FreeMemory(*Buffer)

Verfasst: 20.09.2006 16:56
von Mathias-Kwiatkowski
ui danke des is etwas kompli, habe es so geht aber leider nicht, nur warum?

Code: Alles auswählen

ConnectionID = OpenNetworkConnection("purechannel.ath.cx", 80) 
  If ConnectionID = 0
    MessageRequester("Error", "keine verbindung !", 0)
    End
  EndIf  
  
  Repeat
    EventID=WindowEvent()
    
    
    If EventGadgetID() = #send
      If EventType() = #PB_EventType_LeftClick
        Text$="chat/chtterphp.php?mess="+GetGadgetText(#eingabe) 
        SendNetworkString(ConnectionID, "GET /"+Text$+" HTTP/1.1" ) 
        SendNetworkString(ConnectionID, "Host: "+"purechannel.ath.cx"  ) 
        SendNetworkString(ConnectionID, "" ) 
      EndIf
    EndIf
das ist nur ein ausschnitt von meinem prog, aber das ist ja eigentlich auch das wichtigste

Verfasst: 20.09.2006 17:52
von DarkDragon
Bei dir fehlt erstens #CRLF$ nach jedem String den du Sendest und zweitens müssen es beim letzten 2 sein, soviel ich weiß.

[EDIT]
Versuchs auch mal mit HTTP/1.0, das hat keine Chunks, ist somit einfacher hand zu haben.

Verfasst: 02.10.2006 22:24
von Mathias-Kwiatkowski
also ich versteh es nicht, es muss doch auch so gehen das mein php script das empfängt oder?

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Verbindung = OpenNetworkConnection("purechannel.ath.cx", 80 , #PB_Network_TCP)
If Verbindung
  SendNetworkString(Verbindung, "GET http://adresse.php?mess=mathiasisback")
  
EndIf

Verfasst: 04.10.2006 11:49
von KeyPusher
wenn ich das richtig verstehe, dann liegt dein php-script bei einem http-server, richtig? "OpenNetworkConnection("purechannel.ath.cx", 80 , #PB_Network_TCP)" lässt zumindestens darauf schliessen.

das problem ist dann, das du php nicht direkt was schicken kannst, sondern den "umweg" durch den http-server gehen und auch seine "sprache" das "http" (hypertext transfer protocol) sprechen musst. normaler weise macht das der browser für uns. der würde jetzt aus "http://purechannel.ath.cx/adresse.php?m ... hiasisback" folgendes machen:
zum einen baut er eine verbindung nach "purechannel.ath.cx" port 80 (port 80 ist bei http der standard).
dann würde er folgende "zeilen" senden wobei jede einzelne zeile mit einem EOL endet:

GET /adresse.php?mess=mathiasisback HTTP/1.1
Host: purechannel.ath.cx

jetzt würden noch ein paar zeilen kommen, die für dein problem aber nicht so wichtig sind. die erste zeile die mit dem "GET" ist mit die wichtigste "zeile". hier steht das, was du vom http-server möchtest, dass er das script "adresse.php" aufruft und "mess=mathiasisback" an das script weiterleitet.
als letztes, damit der http-server weiss, das der "request" beendet ist, muss der browser oder wir eine "leere", d.h. ein einzelnes EOL senden. dann heisst es auf eine antwort vom server bzw. vom php-script warten.

wenn ich das richtig sehe, fehlem in deinem code nur die EOL's.

so sollte es dann eigentlich klappen:

Code: Alles auswählen

ConnectionID = OpenNetworkConnection("purechannel.ath.cx", 80)
  If ConnectionID = 0
    MessageRequester("Error", "keine verbindung !", 0)
    End
  EndIf 

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

  Repeat
    EventID=WindowEvent()
   
   
    If EventGadgetID() = #send
      If EventType() = #PB_EventType_LeftClick
        Text$="chat/chtterphp.php?mess="+GetGadgetText(#eingabe)
        SendNetworkString(ConnectionID, "GET /"+Text$+" HTTP/1.1"+EOL$ )
        SendNetworkString(ConnectionID, "Host: "+"purechannel.ath.cx"+EOL$)
        SendNetworkString(ConnectionID, EOL$ )
      EndIf
    EndIf