Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Mehrere CGI-Scripts und POST (https://www.delphipraxis.net/28504-mehrere-cgi-scripts-und-post.html)

FAlter 25. Aug 2004 15:32


Mehrere CGI-Scripts und POST
 
Ich möchte mei meinem Server CGI-Programme erlauben (das wichjtigste ist zweifelsohne das von PHP 8) )

Bereits beim PHP-CGI habe ich probleme mit POST gehabt. Inzwischen habe ich die Lösung:

Zitat:

Zitat von http://hoohoo.ncsa.uiuc.edu/cgi/forms.html [2004-08-25
]The POST method
If your form has METHOD="POST" in its FORM tag, your CGI program will receive the encoded form input on stdin. The server will NOT send you an EOF on the end of the data, instead you should use the environment variable CONTENT_LENGTH to determine how much data you should read from stdin.

Ja, und wenn jetzt zwei POST-Anfragen gleichzeitig kommen? Was soll ich dann in CONTENT_LENGTH schreiben?

Hat jemand eine Idee, wie man dieses Problem umgehen kann?

Wie kann ich mehrere CGI-Scripts gleichzeitig aufrufen, ohne, dass "Fehler" vorkommen? Ich musste bereits lernen, dass man sich in solchen Fällen nicht auf die geringe Wahrscheinlichkeit verlassen kann. In anderen Worten: Auch random($7FFFFFFF) = $AFFE ergibt mal true.

//Edit: Thema umbenannt von "Mehrere CGI-Scripts gleichzeitig"

FAlter 25. Aug 2004 17:38

Re: Mehrere CGI-Scripts gleichzeitig
 
Habe eben bemerkt, dass jeder Prozess bei WIN seine eige´nen Umgebungsvariablen hat.

Jetzt hier mein Code:

Delphi-Quellcode:
function GetConsoleOutput(const Command, Input: String; out Output, Errors: String; const Environment: String): Boolean;
//Von Delphi-Source.de
//angepasst von FAlter ([url]http://www.falter.de.tf/[/url])
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeInputWrite: THandle;
  PipeInputRead: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  Output := '';
  Errors := '';
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);
  CreatePipe(PipeInputRead, PipeInputWrite, @SecurityAttr, 0);

  WriteFile(PipeInputWrite, Input[1], Length(Input), NumberOfBytesRead, nil);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := PipeInputRead;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  if CreateProcess(nil, PChar(command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, PChar(Environment), nil,
  StartupInfo, ProcessInfo) then begin
    result:=true;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);
    CloseHandle(PipeInputWrite);
    CloseHandle(PipeInputRead);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      SetLength(Output, Stream.Size);
      if Stream.Size > 0 then
        Stream.Read(Output[1], Stream.Size)
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      SetLength(Errors, Stream.Size);
      if Stream.Size > 0 then
        Stream.Read(Errors[1], Stream.Size)
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else begin
    result:=false;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;
...

Delphi-Quellcode:
      Environment :=
        'CONTENT_LENGTH='   + IntToStr(Length(ARequestInfo.FormParams)) + #0 +
        'SERVER_SOFTWARE='  + IdHTTPServer.ServerSoftware + #0 +
        'REDIRECT_STATUS='  + 'ALLOWED' + #0 +
        'PATH_TRANSLATED='  + PHP + #0 +
        'QUERY_STRING='     + ARequestInfo.QueryParams + #0 +
        'SERVER_NAME='      + ARequestInfo.Host + #0 +
        'GATEWAY_INTERFACE=' + 'CGI/1.0' + #0 + //Oder was kommt hier hin?
        'SERVER_PROTOCOL='  + ARequestInfo.Version + #0 +
        'SERVER_PORT='      + '80' + #0 +
        'REQUEST_METHOD='   + ARequestInfo.Command + #0 +
        //'PATH_INFO='        + '???' + #0 +
        'SCRIPT_NAME='      + ARequestInfo.Document + #0 +
        //'REMOTE_HOST='      + '???'+ #0 +
        'REMOTE_ADDR='      + ARequestInfo.RemoteIP + #0 +
        //'AUTH_TYPE='        + '???' + #0 +
        'REMOTE_USER='      + ARequestInfo.AuthUsername + #0 +
        'HTTP_ACCEPT='      + ARequestInfo.Accept + #0 +
        'HTTP_USER_AGENT='  + ARequestInfo.UserAgent + #0 +
        #0;

      GetConsoleOutput('"' + filtxtPHP.Text + '"' , ARequestInfo.FormParams, Output,
        Error, Environment);
Trotzdem funktionieren die POST-Daten noch nicht. Kann jemand einen Fehler entdecken?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz