Home » Tutorials » Netzwerk und Internet » ISAPI

ISAPI

Hilfsfunktionen

Parameterübergaben bei einem POST sehen wie folgt aus:
text=bla+bla+bla&zweiterparam=yes&dritter=no&vierter=1 Sonderzeichen, wie z.B. deutsche Umlaute oder Backslash etc werden hexadezimal codiert und wie folgt notiert:
%FF = Zeichen #0255.
Dabei sind die Zeichen immer nur ein Byte breit (= 2 hexadezimale Stellen).
Das „+“ im obigen Beispiel codiert das Leerzeichen (space, blank space). Diese speziellen Zeichen müssen also im Laufe der Weiterverarbeitung dekodiert werden. Dies erreichen wir mit folgenden drei Funktionen:

function EscapeToAscii(str: string): string;

  function HexToAscii(c: string): byte;
  begin
    c := '$' + c;
    result := _strtoint(c);
  end;

var
  j: integer;
  pc: pchar;
  c: byte;
begin
  pc := @str[1];
  j := 1;
  while (pc[0] <> #0) do begin
    case pc[0] of
      '%':
        begin
          c := HexToAscii(pc[1] + pc[2]);
          str[j] := char(c);
          Inc(j);
          Inc(pc, 3);
        end;
    else
      begin
        str[j] := pc[0];
        Inc(pc);
        Inc(j);
      end;
    end;
  end;
  SetLength(str, j - 1);
  result := str;
end;

function spaceout(s: string): string;
var i: integer;
begin
  i := 1;
  while i <= length(s) do
    case s[i] of
      '+':
        if (i + 1) <= length(s) then
          case s[i + 1] of
            '+':
              begin
                inc(i);
                s[i] := ' ';
                inc(i);
              end;
          else
            begin
              s[i] := ' ';
              inc(i);
            end;
          end else
        begin
          s[i] := ' ';
          inc(i);
        end;
    else inc(i);
    end;
  result := s;
end;

function GetAllparams(s: string): ATIStrings;
var po: integer;

  procedure fillarray(s1: string);
  var posi: integer;
  begin
    setlength(result, length(result) + 1);
    posi := pos('=', s1);
    if posi > 0 then begin
      result[length(result) - 1].name := EscapeToAscii(copy(s1, 1,
      posi - 1));
      delete(s1, 1, posi);
      if s1 <> '' then
        result[length(result) - 1].value := EscapeToAscii(s1);
    end else begin
      result[length(result) - 1].name := EscapeToAscii(s1);
      result[length(result) - 1].value := '';
    end;
  end;

begin
  setlength(result, 0);
  po := pos('&', s);
  case po > 0 of
    TRUE:
      while po > 0 do begin
        fillarray(copy(s, 1, po - 1));
        delete(s, 1, po);
        po := pos('&', s);
      end;
  end;
  Fillarray(s);
end;

Erstere konvertiert dabei die hexadezimal codierten Anteile zurück in ASCII/ANSI Zeichen. Letztere konvertiert „+“ zu “ “ (ein echtes „+“ wird mit „++“ codiert!).