Seite 1 von 2

CGI für XAMPP

Verfasst: 21.05.2005 21:39
von bluejoke
Hallo!

Ich hab die Frage zwar schon im Tips&Tricks bereich gestellt, da sie dort allerdings ignoriert wird, möchte ich hier nochmal ganz konkret fragen:
Was muss ich tun, damit ich mit einem Browser über einen Webserver (im konkreten Fall die Windows-Version von Xampp - Standardinstallation) so auf die Datei zugreifen kann, dass diese mir Daten ausgeben kann, also bspw. HTML-Seiten, Bilder, egal was...

Vielen Dank,
Simon

Verfasst: 21.05.2005 22:31
von zigapeda
http://localhost/test.php - müsste gehen wenn du in apachefriends\xampp\htdocs\ eine datei namens test.php hast. du kannst auch eine htmldatei hineinspeichern o.ä.
du meinst schon das oder?

Verfasst: 21.05.2005 23:20
von traumatic
zigapeda hat geschrieben:du meinst schon das oder?
Nein, meint er nicht. Er möchte CGI-Skripte bzw. in seinem Fall wahrscheinlich
eine durch PB erstellte CGI-EXE ausführen.

Sorry, ich weiß nicht was Xampp ist, aber 'normalerweise' kann man bestimmten
Verzeichnissen (/cgi-bin/) einfach Ausführungs-Rechte geben, hierdurch wird
die EXE dann dementsprechend nicht zum Download angeboten sonder ausgeführt,
ergo würdest Du (bei entsprechender Programmierung der EXE) die Ausgabe
im Browser sehen.

Naja, vielleicht hilft diese Antwort wenigstens anderen Dir zu helfen... ;)

Verfasst: 21.05.2005 23:45
von bluejoke
Jau, also PHP ist nicht so ganz das, was ich meine, traumatic hat dafür voll und ganz ins schwarze getroffen.

XAMPP ist einfach ein für mich sehr geniales Softwarepaket, dass mir Apache, MySQL, PHP, Pear und 'n FTP und nen Mailserver (Mercury) installiert - per Installer, und ziemlich up to date. Es gibt einen cgi-bin, ich dachte, dass ich vielleicht irgendwas anderes noch beachten muss. Die Ausgabe erfolgt irgendwie über Print, oder? Muss ich bei den Compiler-Options "Console" einstellen? Und muss ich zuerst OpenConsole ausführen?
Und gibts irgendwo ein Tutorial zu den Headern? Was muss ich denn senden, bevor es zum eigentlichen Content kommt?

Simon

Deine Antwort, traumatic, hat mir auf jeden Fall schon mal geholfen, ich probiers jetzt einfach mal aus. Irgendwann wird auch try&error zum Erfolg führen...

Verfasst: 22.05.2005 00:57
von traumatic
Diese Seite sollte helfen: http://httpd.apache.org/docs/howto/cgi.html

OpenConsole() ist AFAIK keine so gute Idee, da PureBasic den "graphic
console mode" benutzt. Hier also entweder El_Chonis CGI-Library benutzen
(kommt mit Source und Beispiel-Code) oder per API selbst eine Console
im Textmode initialisieren (ist nichts schlimmes, siehe Win32API-Docs).

Header-mäßig gilt in jedem Fall das selbe wie auch für Perl CGIs, also am
besten mal in Perl-Tutorials stöbern, auch in der PHP und Apache Doku
sind viele Infos zum Thema versteckt. Nachdem Du einen validen Header
gesendet hast, kannst Du im Grunde machen, was Du willst...

Desweiteren hat DarkDragon hier mal ein kleines Beispiel gepostet.

Trial&Error ist übrigens immer gut! :)


EDIT: Ich sehe gerade, den letzten Link kanntest Du ja schon ;)

Verfasst: 22.05.2005 01:35
von Deeem2031
Ich hab früher auch ein paar CGIs für Windows geproggt, hab leider alles aus diesen einen Code verloren:

Code: Alles auswählen

Procedure.l Send_Html(htmlcontent.s)
  htmlcontent = "Content-Type: text/html"+Chr(13)+Chr(10)+Chr(13)+Chr(10)+htmlcontent
  ProcedureReturn WriteFile_(getStdHandle_(#STD_OUTPUT_HANDLE),@htmlcontent,Len(htmlcontent),@xx,0)
EndProcedure
Procedure.s Get_Request()
  string.s=Space(1024*5)
  GetEnvironmentVariable_("QUERY_STRING",@string,1024*5)
  ProcedureReturn string
EndProcedure
Procedure.s Get_Post()
  ContentLength.s=Space(100)
  GetEnvironmentVariable_("CONTENT_LENGTH",@ContentLength,100)
  If Val(ContentLength)=0
    ProcedureReturn ""
  EndIf
  string.s = Space(Val(ContentLength)+1)
  ReadFile_(getStdHandle_(#STD_INPUT_HANDLE),@string,Val(ContentLength),@xx,0)
  ProcedureReturn string
EndProcedure
Procedure.s Umformen(string.s)
  tmp = FindString(string,"%",0)
  While tmp
    string= Left(string,tmp-1)+Chr(HexToVal(Mid(string,tmp+1,2)))+Right(string,Len(string)-(tmp+2))
    tmp = FindString(string,"%",tmp+1)
  Wend
  ProcedureReturn string
EndProcedure
Procedure.s StringtoHtmlHex(string.s)
  For i = 1 To Len(string)
    tmps.s = Hex(Asc(Mid(string,i,1)))
    If Len(tmps) = 1
      tmps = "0"+tmps
    EndIf
    Result.s + "%" +tmps
  Next
  ProcedureReturn Result
EndProcedure
Procedure.s StringtoHtmlHex_2(string.s,zeichen.s)
  tmps.s = Hex(Asc(zeichen))
  If Len(tmps) = 1
    tmps = "0"+tmps
  EndIf
  ProcedureReturn ReplaceString(string,zeichen,"%"+tmps)
EndProcedure
Procedure.s HtmlHextoString(string.s)
  string = ReplaceString(string,"%0D%0A",Chr(13)+Chr(10))
  string = ReplaceString(string,"+"," ")
  For i = 0 To 255
    string = ReplaceString(string,"%"+Right("0"+Hex(i),2),Chr(i))
  Next
  ProcedureReturn string
EndProcedure
Procedure.s Get_Val(string.s,var.s)
  tmp = FindString("&"+string,"&"+var+"=",1)
  If tmp
    tmp2= FindString(string+"&","&",tmp)
    If tmp2 > Len(string):tmp2-1:EndIf
    tmp+Len(var)+1
    ProcedureReturn Mid(string,tmp,tmp2-tmp)
  EndIf
  ProcedureReturn ""
EndProcedure

;---SendMail by stbi---
Global res.s, cr.s, ConnID.l 
cr.s=Chr(13)+Chr(10) 
Procedure Send(msg.s) 
  SendNetworkData(ConnID,@msg,Len(msg)) 
EndProcedure 
Procedure.s wait() 
  res="" 
  For tmp=1 To 4999 
    res+" " 
  Next 
  ReceiveNetworkData(ConnID,@res,4999) 
  res=Left(res,3) 
  ProcedureReturn res 
EndProcedure 
Procedure.l sendmail(mailserver.s,mailto.s,mailfrom.s,subject.s,msgbody.s) 
  If InitNetwork() 
    ConnID = OpenNetworkConnection(mailserver,25) 
    If ConnID 
      wait() 
      error=0 
      If res="220" 
        Send("HELO CGIapp"+cr) 
        wait()    
        If res="250" 
          Delay(100) 
          Send("MAIL FROM: <"+mailfrom+">"+cr) 
          wait() 
          If res="250" 
            Send("RCPT TO: <"+mailto+">"+cr) 
            wait() 
            If res="250" 
              Send("DATA"+cr) 
              wait() 
              If res="354" 
                Delay(100) 
                Send("Date: "+cr) 
                Send("From: <"+mailfrom+">"+cr) 
                Send("To: <"+mailto+">"+cr) 
                Send("Subject: "+subject+cr) 
                Send("X-Mailer: PBMailer"+cr) 
                Delay(100) 
                Send(msgbody) 
                Delay(100) 
                Send(""+cr) 
                Send("."+cr) 
                wait() 
                If res="250" 
                  Delay(100) 
                  Send("QUIT"+cr) 
                  wait() 
                  ProcedureReturn 1 
                EndIf 
              EndIf 
            EndIf 
          EndIf 
        EndIf 
      EndIf 
      CloseNetworkConnection(ConnID) 
    EndIf 
  EndIf  
EndProcedure


;---Main---

Post.s = Get_Post()

If sendmail(HtmlHextoString(Get_Val(Post,"mailserver")),HtmlHextoString(Get_Val(Post,"mailto")),HtmlHextoString(Get_Val(Post,"mailfrom")),HtmlHextoString(Get_Val(Post,"subject")),HtmlHextoString(Get_Val(Post,"content")))
  Send_Html("<html><head><title>Mail sent!</title></head><body>Mail sent Successfully!</body></html>")
Else
  Send_Html("<html><head><title>Error</title></head><body>Couldn't sent mail!</body></html>")
EndIf
Vielleicht hilft er ja weiter.

Verfasst: 22.05.2005 08:40
von DarkDragon
Hallo,

Ich schaue immer "Neueste Beiträge anzeigen" nach, sobald ich das Forum besuche, aber ich konnte mich nicht dran errinnern dass mein Thread wieder Neu war O_o.

Naja vielleicht hab ich es übersehen, ist mir aber schon desöfteren bei diesem Thread passiert, wenn das der Fall sein sollte.

Egal, unter welcher Plattform nutzt du Xampp? Ich nutze es unter Windows und Linux. Du musst die CGI natürlich unter deinem Server-Betriebssystem programmieren. All-inkl meldete mir man braucht nicht die Rechte zu verändern, damit man in Dateien schreiben kann. Dies gilt lediglich für die PHP-Scripte:
da CGI-Scripte mit Ihren normalen Userrechten ausgeführt werden, brauchen Sie keinen CHMOD von 777 setzen. Dies ist nur bei PHP-Scripten notwendig, da diese als wwwrun ausgeführt werden.
Also: niemals den chmod des CGI-Bin's verändern oder es kommt die gleiche Fehlermeldung wie bei mir das letzte mal ;) .

Es gibt allerdings auch ausnahmen, doch dies scheint mir der Standard zu sein, denn bei meinem vorinstallierten Apache unter Linux ist es auch so.

Verfasst: 22.05.2005 10:28
von bluejoke
Vielen Dank Leute,

DDs Beispiel funktioniert Prima unter der Linux-Umgebung von meinem Hoster, ich mag aber, weil ich bei mir kein Linux installiert habe, und gerade auch zu wenig Platz dafür habe, unter Windows entwickeln.

Die Fehlerursache scheint mir auch das OpenConsole() zu sein, ohne stürzt mein Programm aber ab. Deem, dein Code hilft mir deswegen leider nicht, weils als eigenständiges Programm gemacht ist, und wohl unter Apache keine Ausgabe auf meinem Browser hinkriegt :D - Ich suche jetzt also einen Weg, die Konsole ohne OpenConsole() zu öffnen, und zwar so, dass mein Server nicht mehr das liefert:
500 Internal Server Error:
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
Apache/2.0.53 (Win32) mod_ssl/2.0.53 OpenSSL/0.9.7f PHP/5.0.4 Server at localhost Port 80

Verfasst: 22.05.2005 10:49
von DarkDragon
bluejoke hat geschrieben:Vielen Dank Leute,

DDs Beispiel funktioniert Prima unter der Linux-Umgebung von meinem Hoster, ich mag aber, weil ich bei mir kein Linux installiert habe, und gerade auch zu wenig Platz dafür habe, unter Windows entwickeln.

Die Fehlerursache scheint mir auch das OpenConsole() zu sein, ohne stürzt mein Programm aber ab. Deem, dein Code hilft mir deswegen leider nicht, weils als eigenständiges Programm gemacht ist, und wohl unter Apache keine Ausgabe auf meinem Browser hinkriegt :D - Ich suche jetzt also einen Weg, die Konsole ohne OpenConsole() zu öffnen, und zwar so, dass mein Server nicht mehr das liefert:
500 Internal Server Error:
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
Apache/2.0.53 (Win32) mod_ssl/2.0.53 OpenSSL/0.9.7f PHP/5.0.4 Server at localhost Port 80
Der Fehler ist deshalb da, da du dein CGI-Bin nicht mit den StandardRechten hast. Die rechte müssen auf 755 sein. Das war ja auch in meinem Thread der fall ;)

Verfasst: 22.05.2005 10:52
von bluejoke
Nope, unter Windows gibt es dieses Rechte-Zeugs ja nicht.

Ich hab gerade ein Beispiel von El_Choni gefunden:

Code: Alles auswählen

hInput = GetStdHandle_(#STD_INPUT_HANDLE)
SetConsoleMode_(hInput, #ENABLE_LINE_INPUT|#ENABLE_ECHO_INPUT|#ENABLE_PROCESSED_INPUT)
*ContentLength = AllocateMemory(128)
ContentLength = Val(PeekS(*ContentLength, GetEnvironmentVariable_("CONTENT_LENGTH", *ContentLength, 128)))
FreeMemory(*ContentLength)
*Buffer = AllocateMemory(ContentLength)
ReadFile_(hInput, *Buffer, ContentLength, @bRead, 0)
Input$ = PeekS(*Buffer)
FreeMemory(*Buffer)
CloseHandle_(hInput)
hOutput = GetStdHandle_(#STD_OUTPUT_HANDLE)
HttpAnswer$ = "Content-type: text/html"+Chr(10)+Chr(13)+Chr(10)+Chr(13)+"<html><header><title>Answer from CGI</title></header><body>Hi, received your data:<br>"
HttpAnswer$+StringField(StringField(Input$, 1, "&"), 1, "=")+": "+StringField(StringField(Input$, 1, "&"), 2, "=")+"<br>"+StringField(StringField(Input$, 2, "&"), 1, "=")+": "+StringField(StringField(Input$, 2, "&"), 2, "=")
HttpAnswer$+"</body></html>"
WriteFile_(hOutput, @HttpAnswer$, Len(HttpAnswer$), @Written, 0)
CloseHandle_(hOutput)
Mit dem funktioniert das jetzt auch unter Windows.
Nicht ausführen, das Beispiel funzt nur mit dem passenden Formular!

Ich schick nachher, wenn ichs hinkrieg, die Windowsversion von deinem Beispiel DD



Vielen Dank nochmal an alle,
Simon