Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ISAPI und POST (https://www.delphipraxis.net/36826-isapi-und-post.html)

Jörn 26. Dez 2004 15:51


ISAPI und POST
 
Hallo und frohes Fest!

Jemand eine Ahnung wie man mit der Methode POST gesendeten Text empfängt? Ich arbeite mit der isapi2.pas von Borland!

MfG und schon mal vielen Dank!

Assarbad 26. Dez 2004 16:56

Re: ISAPI und POST
 
Die entsprechenden Daten stehen kodiert im HTTP-Header. Also einfach den Header parsen ;)

Weiteres findest du in den entsprechenden RFCs

Jörn 26. Dez 2004 17:14

Re: ISAPI und POST
 
Das klingt ja ganz gut, aber ich weiss nicht in welcher Variable ich das im ECB finde. Kannst mir da auch helfen?

Assarbad 26. Dez 2004 19:20

Re: ISAPI und POST
 
Zitat:

Zitat von Jörn
Das klingt ja ganz gut, aber ich weiss nicht in welcher Variable ich das im ECB finde. Kannst mir da auch helfen?

Als erstes "lpszMethod" auf "POST" checken. Danach (glaube ich, kann es leider nirgends mehr testen!) per ReadClient() den Inhalt zu des POST Requests lesen (Größe steht im ECB).

Dieser ist entsprechend der RFCs kodiert. Der Rest sollte einfach sein ;)

Jörn 27. Dez 2004 03:05

Re: ISAPI und POST
 
Ja das geht so. In meinem Spezialfall muss ich nicht mal auf POST prüfen. Die ersten 48KB kann ich im ECB.lpbCont abrufen, was aber ein Zeiger ist, und ich bekomm es nicht so recht hin. Muss ich wohl noch ein wenig testen... Danke schon mal

Assarbad 27. Dez 2004 09:20

Re: ISAPI und POST
 
Das sollten lesbare Bytes sein. Ich würde es an deiner Stelle also etwa so machen (Achtung, die Namen der ECB-Member mußt du evtl. anpassen):

Delphi-Quellcode:
var x:String; dwSize:DWORD;

// Größe aus ECB ermitteln
dwSize = ECB.cbAvailable;
// Größe des Stringpuffers festlegen (+1 wegen Nullterminierung)
SetLength(x, dwSize+1);
// Puffer mit NUllen füllen
ZeroMemory(@x[1], dwSize+1);
// Daten lesen
ECB.ReadClient(ConnID, Pointer(@x[1]), dwSize);
// Größe an echte Stringlänge anpassen - HTTP sendet normal nur printable ASCII, kein EASCII
SetLength(x, lstrlen(@x[1]));
Wenn natürlich der Content-Type etwas anderes aussagt, mußt du unter Umständen die Daten konvertieren, zB von UTF8 nach WideString oder sowas.

Statt ECB.ReadClient() könnte theoretisch auch ein
Code:
CopyMemory(@s[1], ECB.lpbData, dwSize);
gehen! Wie gesagt, ich kann es selber nicht testen und das letztemal hatte ich mit ISAPI vor 3 oder 4 Jahren zu tun.

Jörn 29. Dez 2004 00:48

Re: ISAPI und POST
 
Gut ich habe das jetzt mal so ausprobieren wollen. Ich bin aber auf ein paar Probleme gestoßen.

1. Die Funktion ZeroMemory ist meinem Delphi (Delphi 6 PE) nicht bekannt
2. Die Funktion lstrlen sagt meinem Delphi auch nichts
3. Wenn ich die dll mal ohne die beiden betreffenden Zeilen kompiliere und teste, bekomme ich natürlich nur Müll, den ich aber auch nicht im geringsten nachvollziehen kann:

Code:
1:41(<div align="center" class="minim&#8364;
1:41 war die Uhrzeit, und der Rest ist zwar aus meinem HTML-Template, hat aber ja sonst nichts damit zu tun - und ist arg zerstückelt. Das Euro-Symbol, äh, ja, das entzieht sich vollkommen meiner Kenntnis.

Assarbad 29. Dez 2004 01:16

Re: ISAPI und POST
 
Binde Windows.pas für die fehlenden Funktionen ein.

Jörn 3. Jan 2005 15:15

Re: ISAPI und POST
 
So, nu im neuen Jahr hab ich endlich wieder Zeit dazu gefunden.
Ich habe den Code entsprechend geändert, aber nun bekomme ich gar nichts mehr :-(

Code ist so wie du es gesagt hast:

Delphi-Quellcode:
var
  ResStr, POST: string;
  StrLen, dwSize: DWORD;

  if ECB.lpszQueryString = 'mailto' then
  begin
    // Größe aus ECB ermitteln
    dwSize := ECB.cbAvailable;
    // Größe des Stringpuffers festlegen (+1 wegen Nullterminierung)
    SetLength(POST, dwSize+1);
    // Puffer mit NUllen füllen
    ZeroMemory(@POST[1], dwSize+1);
    // Daten lesen
    ECB.ReadClient(ECB.ConnID, Pointer(@POST[1]), dwSize);
    // Größe an echte Stringlänge anpassen - HTTP sendet normal nur printable ASCII, kein EASCII
    SetLength(POST, lstrlen(@POST[1]));
    ResStr := POST;
  end;

  ResStr := Format(
    'HTTP/1.0 200 OK'#13#10'Content-Type: text/html'#13#10+
    'Content-Length: %d'#13#10'Content:'#13#10#13#10'%s',
    [Length(ResStr), ResStr]);
  StrLen := Length(ResStr);
  ECB.dwHTTPStatusCode := 200;
  ECB.WriteClient(ECB.ConnID, Pointer(ResStr), StrLen, 0);
  Result := HSE_STATUS_SUCCESS;
(Natürlich gekürzt)

Fehlermeldungen gibt es keine mehr. Dann noch, der Vollständigkeit halber, der HTML-Code:

Code:
<table width="95%" border="0" cellspacing="0" cellpadding="0" align="right">
  <tr>
     <td>
       


        [img]images/top.jpg[/img]


        <div align="center">
        <form action="game.dll?mailto" method="post" enctype="text/plain">
        <table>
        <tr><td align="right">Absender: </td><td><input name="absender" type="text" size="35" maxlength="25"></td></tr>
        <tr><td align="right">Betreff: </td><td><input name="betreff" type="text" size="35" maxlength="75"</td></tr>
        <tr><td align="right">Nachricht: </td><td><textarea name="nachricht" cols="30" rows="10"></textarea></td></tr>
        <tr><td></td><td><input type="submit" class="Button" value="Absenden"></td></tr>
        </table>
        </form>
        </div>    
     </td>
  </tr>
</table>
</td>
Ich kann das echt nicht nachvollziehen, das da nun nichts mehr zurückgeliefert wird. Eine Idee?

Jörn 9. Jan 2005 15:24

Re: ISAPI und POST
 
Echt keiner eine Idee? Ich verzweifel hier noch :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 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