CGI

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

CGI

Beitrag von mschnell »

Hi zusammen.

Ich mache gerade meine ersten Gehversuche, ein CGI Programm mit Lazarus/Freepascal zu erstellen.

Der erste Test war vielversprechend: ein mit Lazarus erstellter Dreizeiler (commandline- "Programm") an die richtige Stelle auf dem Server meines ISP platziert und die richtigen Datei-Rechte gesetzt, schon kommt die "writeln" Ausgabe des Programms im Browser an, wenn man den richtigen URL ansurft.

Nun möchte ich mit dem FP Programm eine Datei lesen und schreiben. Ein sinnvoller Platz für die Datei wäre vermutlich irgendwo innerhalb des Directories, in dem sich das Programm selbst befindet. Da ein commandline-"Programm" kein "Application" hat bekomme ich das komplett spezifizierte Directory des Programms mit paramstr(0).

Das klappt zumindest auf meinem Suse. Aber auf dem Linux Server des ISP klappt das nicht. Auch wenn ich das Programm nicht per Webserver als CGI, sondern per Telnet starte ist Paramstr(0) ein Leerstring, auch wenn ich mich in einem Directory befinde das in Telnet z.B. /web/cgi-bin heißt und das Programm mit ./test gestartet wird.

Wie kann ich denn den kompletten Pfad meiner Programmdatei ermitteln ?

P.S.: Lazarus bietet als Projekt auch "CGI-Program" an. Gibt es irgenteine Doku, wie man das verwendet ?

-Michael

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ist alles in TCgiApplication drin:
Siehe wahrsch:
Property PathTranslated ;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Ich schaue nach.

Aber eine Beschreibung von TCgiApplication wäre echt nett :)

-Michael

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Beschreibung von TCgiApplication hab ich noch nie gesehen.
Es gibt auch noch das hier
http://z505.com/powtils/docs.shtml" onclick="window.open(this.href);return false;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Ich habe mich gerade sehr Ausführlich mit Lars in der PowUtils User Mailinglist unterhalten und viele interessante Anregungen bekommen. Aber TCGI-Application scheint wie gemacht für den Einstieg in CGI zu sein. Es kann doch nicht sein, dass der Code da 'rumsteht und keiner weiß, was man damit machen kann.

Ist übrigens für mich der einzige gravierende Nachteil von Lazarus gegenüber Delphi. Man kann nicht mit dem Cursor auf einen Begriff gehen und mit Der F1-Taste Hilfe bekommen. (Bei mir kommt immer eine Meldung, dass keine Hilfe verfügbar ist.) Das sollte nicht so bleiben !

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Also viele Sachen sind schon dokumentiert, und es wird täglich mehr. Was Lazarus z.b. nicht macht ist wenn man auf variablennamen F1 drückt die Hilfe des Variablentypes anzuzeigen. Also versuch mal an der stelle wo du F1 Drückst zuerst rechts->Deklaration finden zu drücken und dann dort F1
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mschnell hat geschrieben: Es kann doch nicht sein, dass der Code da 'rumsteht und keiner weiß, was man damit machen kann.
Naja, was wird der Code wohl machen?
CGI ist ja keine Hexerei, bloss ein Commandline Progi mit ein Paar Server und Request Variablen.
Hab's mal kurz getestet. Ist doch nicht sooo schwer:

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, cgiapp
  { you can add units after this };
var CGI:TCGIApplication;
L:TStringList;
i:integer;
begin
 CGI:=TCGIApplication.create(nil);
 CGI.Initialize;
 CGI.ContentType:='text/html';
 CGI.EmitContentType;
 CGI.AddResponseLn('<html><head><title>CGI Test<title></head><body>');
 L:=TStringList.Create;
 CGI.GetCGIVarList(L);
 For i:=0 to L.Count-1 do L[i]:=L[i]+'<br>';
 CGI.AddResponse(L.Text);
 L.free;
 
 L:=TStringList.Create;
 CGI.GetRequestVarList(L);
 For i:=0 to L.Count-1 do L[i]:=L[i]+'<br>';
 CGI.AddResponse(L.Text);
 L.free;
 
 CGI.AddResponseLn('</body></html>');
 CGI.free;
end.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

testcgi.pp habe ich natürlich auch gefunden.

Das nützt mir aber nix, um ein Lazarus-"CGI-Projekt" an's Laufen zu bekommen. Das ist ein "program" und somit ein Lazarus-freies Free-Pascal Programm.

Ein neues "CGI Projekt"in Lazarus macht eine lpr-Datei ähnlich wie ein GUI Projekt. Nur dass kein TForm, sondern ein Datamodule aufgemacht wird. Außerdem wird eine Unit aufgemacht, in die man wohl den Code schreiben soll. Ich glaube kaum, dass es so gedact ist, dass man jede Menge Code in der lpr-Datei (dem "program") ergänzen soll.

Im Endeffekt wird so etwas wie der Code aus testcgi.pp natürlich in der Unit gebraucht. Aber wie kommt man da erstmal hin ? Ich vermute man soll irgendetwas auf dem Datamodul platzieren. Aber was ? Ich finde in der Komponenten-Bibliothek nix mit CGI.

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Auf dem Datamodule kannst du alles was nichtvisuell ist platzieren. Und den Code dazu musst du schon schreiben.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Das ist mir schon klar.

Aber ohne jede Art von Dokumentation kann ich ja nicht wissen, wo ich irgendwelchen Code hin schreiben soll. Bei einem "Projekt" (im gegensatz zu einem "Programm") muss das ein Event sein. Aber was für eines ?

Ich in Linux kann ein CGI-Projekt ohne weiteren Code also jede User-Funktionalität) übersetzen (nachdem ich eine doppelte Angabe in "uses entfernt habe). Wenn ich es dann starte, kommt eine Exception namens "Exception". Im Sourcecode sehe ich, dass da offensichtlich irgendwelche vorgaben nicht gesetzt sind, die ich vermutlich in einem vorher aufregufenen Event hätte setzen sollen.

Versuch's 'mal selbst :) !

Was nun ?

-Michael

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mschnell hat geschrieben:testcgi.pp habe ich natürlich auch gefunden.
Ach so. Hatte ich gar nicht gesehen...
mschnell hat geschrieben: Das nützt mir aber nix, um ein Lazarus-"CGI-Projekt" an's Laufen zu bekommen. Das ist ein "program" und somit ein Lazarus-freies Free-Pascal Programm.
Ich versteh dein Problem nicht ganz.
Die visuellen DB-Komponenten nützen dir bei CGI ja sowieso nichts.
Also warum nicht gleich den DB-Kram auch im Code machen?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Wenn ich ein konkretes Projekt zu bearbeiten hätte, das irgendwie bald fertig werden muss, würde ich natürlich das "CGI-Projekt" vergessen und alles von Hand in ein "Programm" wie testcgi.pp schreiben.

Da ich aber momentan nur recherchiere, wie man so etwas praktischerweise machen kann, fände ich es sehr schön, einen Test mit dem "CGI-Projekt" zu veranstalten, um zu sehen, wie das funzt. Derjenige der die "CGI-Projekt" Geschichte in Lazarus eingebaut hat, muss sich ja irgendwas dabei gedacht haben. Wäre natürlich nett gewesen, wenn er auch eine Doku dazugeliefert hätte.

Hast Du dazu noch eine Idee ?

-Michael

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mschnell hat geschrieben: Hast Du dazu noch eine Idee ?
Ich glaub das funzt einfach nicht ;-)
-> Bugtracker

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Was funzt nicht ? Was hast Du denn probiert ? Ich bin ziemlich sicher, dass man irgendwie seine CGI-Funktionen (vermutlich als Events) anmelden muss, bevor das Projekt mit der eigentliche Bearbeitung beginnt.

Aber wie macht man das und wo schreibt man den Code hin ?

-Michael

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mschnell hat geschrieben:Was funzt nicht ? Was hast Du denn probiert ? Ich bin ziemlich sicher, dass man irgendwie seine CGI-Funktionen (vermutlich als Events) anmelden muss, bevor das Projekt mit der eigentliche Bearbeitung beginnt.
Aber wie macht man das und wo schreibt man den Code hin ?
-Michael
Das ist schon klar. Wird wohl im Ereignis OnCGIRequest des Datamodule passieren.
Nur kriege ich eine Fehlermeldung beim Compilieren:
"Kann CGIDatamodule1 nicht streamen ... Access violation"

Antworten