Einzelnen Beitrag anzeigen

TDKBacke

Registriert seit: 9. Jan 2006
3 Beiträge
 
#1

TidHTTP.Post() - Parameter werden nicht getrennt

  Alt 9. Jan 2006, 19:33
Hallo Forum,

wie ich bei einer Suche hier im Forum feststellen musste, existieren schon einige Beiträge zum Thema TidHTTP.Post() und nicht (richtig) ankommende Parameter, allerdings ist mein Fall etwas anders gelagert.

Zuerst einmal der Code (der Vollständigkeit wegen etwas länglich, der wichtige Teil ist durch '!!! ... !!!'-Kommentare kenntlich gemacht):
Delphi-Quellcode:
procedure Proxy.HTTPServerCommandGet(AThread: TIdPeerThread;
  RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var
    i : integer;
    HTTPClient : TIdHTTP;
    tmpStringList : TStringList;

begin
    // HTTPClient initialisieren
    HTTPClient:=TIdHTTP.Create(nil);
    HTTPClient.HandleRedirects:=true;
    HTTPClient.ProtocolVersion:=pv1_0;

    // HTTP-Header manipulieren
    // ...

    // POST-Anfragen weitergeben
    if (RequestInfo.Command='POST') then
    begin
        ResponseInfo.ContentStream:=TMemoryStream.Create;
        tmpStringList:=TStringList.Create;

        // !!! Hier beginnt das Problem !!!

        for i:=0 to RequestInfo.Params.Count-1 do
        begin
            // Variante 1
            tmpStringList.Add(RequestInfo.Params.Strings[i]);

            // Variante 2
            // if (i<RequestInfo.Params.Count-1) then tmpStringList.Add(URLEncode(RequestInfo.Params.Strings[i] + '&'))
            // else tmpStringList.Add(URLEncode(RequestInfo.Params.Strings[i]));
        end;

        HTTPClient.Post('http://' + RequestInfo.Host + RequestInfo.Document, tmpStringList, ResponseInfo.ContentStream);

        // !!! Hier endet das Problem !!!

    end;

    ResponseInfo.ContentType:=HTTPClient.Response.ContentType;
    ResponseInfo.ContentLength:=length(ResponseInfo.ContentText);
    ResponseInfo.ResponseNo:=HTTPClient.ResponseCode;
    ResponseInfo.ServerSoftware:=HTTPClient.Response.Server;

    ResponseInfo.WriteHeader;
    ResponseInfo.WriteContent;
end;
Wie man vielleicht erkennen kann, soll das einen HTTP-Proxy darstellen. Mit dem HTTP-Server aus Indy wird ein Request angenommen, an TidHTTP weitergeleitet und dessen Ergebnis wiederum an den Aufrufer zurückgegeben. (Für GET-Anfragen - hier rausgestrichen - funktioniert das übrigens problemlos.)
Bei POST-Anfragen gibt es aber folgendes Problem:
tmpStringList enthält die Parameter für die POST-Anfrage und hat nach dem Befüllen aus RequestInfo.Params z.B. den folgenden Inhalt:
tmpStringList.Strings[0]='nick=Anonym'
tmpStringList.Strings[1]='mail=beispiel'
tmpStringList.Strings[2]='msg=Inhalt'
tmpStringList.Strings[3]='id=camponotus'


Das ist soweit auch korrekt. Wenn ich nun aber testweise ein PHP-Skript aufrufe, das lediglich die oben genannten Variablen ausgibt, erhalte ich folgendes Ergebnis:
$id=
$nick=Anonym mail=beispiel msg=Inhalt id=camponotus
$mail=
$msg=


Offensichtlich werden die einzelnen Parameter also nicht getrennt und der komplette String der ersten Variable zugewiesen. Deswegen habe ich eine zweite, im obigen Code auskommentierte Variante zum Einlesen der Parameter ausprobiert, die an alle Parameter ausser dem letzten ein '&' anhängt. Dann sehen tmpStringList und das Ergebnis des PHP-Skripts so aus:
tmpStringList.Strings[0]='nick=Anonym&'
tmpStringList.Strings[1]='mail=beispiel&'
tmpStringList.Strings[2]='msg=Inhalt&'
tmpStringList.Strings[3]='id=camponotus'

=>
$id=
$nick=Anonym
$mail=
$msg=

Jetzt werden die Parameter nach dem ersten '&' also einfach ignoriert.

Mein Ziel wäre folgende Ausgabe:
$nick=Anonym
$mail=beispiel
$msg=Inhalt
$id=camponotus


Kann mir jemand sagen, wie ich das erreiche?
Offensichtlich stimmt ja etwas mit dem Abgrenzen der Parameter nicht. Mit #13+#10 statt '&' will es aber auch nicht gelingen. Genausowenig hilft die direkte Übergabe von RequestInfo.Params.Strings an Post().
Das PHP-Skript ist übrigens nicht die Fehlerquelle, zumindest funktioniert es ohne den Umweg über den Proxy wie erwartet.

Als Entwicklungsumgebung nutze ich Delphi 6 und die mitgelieferte Indy-Version.

Vielen Dank im voraus für alle Lösungen bzw. Anregungen.
  Mit Zitat antworten Zitat