Einzelnen Beitrag anzeigen

gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

IdHTTPRangeStream VBuffer vor dem Senden verändern

  Alt 3. Jan 2020, 15:06
Hallo DP-Community!

Ich muss einen IdHTTPRangeStream vor dem absenden an den Client "decodieren". Dazu habe ich mir die IdCustomHTTPServer.pas in mein Projekt geschoben und möchte die function IdRead des TIdHTTPRangeStream dahingegen ändern, in manchen fällen zu "decodieren".
Leider lässt sich VBuffer nicht überschreiben. Wenn ich das gleiche mit einem TFilestream anstatt des TIdHTTPRangeStream mache, geht das problemlos.

1. Warum lässt sich VBuffer nicht überschreiben?

Code:
function TIdHTTPRangeStream.IdRead(var VBuffer: TIdBytes; AOffset, ACount: Longint): Longint;
var keylen, keypos, x: Longint;
begin
  if FResponseCode = 206 then
  begin
    ACount := Longint(IndyMin(Int64(ACount), (FRangeEnd+1) - FSourceStream.Position));
  end;

  Result := TIdStreamHelper.ReadBytes(FSourceStream, VBuffer, ACount, AOffset);

  if FChiffriert then
  begin
    if AOffset > keylen then
      keypos := AOffset mod keylen
    else
      keypos := AOffset;

    for x := 0 to ACount-1 do
    begin
      VBuffer[x] := VBuffer[x] xor FChiffre[keypos]; //Problem -> VBuffer wurde nicht überschrieben (im Debugger ersichtlich)
      inc(keypos);
      if keypos > keylen - 1 then keypos := 0;
    end;

  end;
end;
Funktioniert mit einem TFilestream einwandfrei:

Code:
type
  TXFileStream = class(TFileStream)
  public
    Chiffre: String;
  public
    function Read(var Buffer; Count: Longint): Longint; override;
    function Read(Buffer: TBytes; Offset, Count: Longint): Longint; override;
  end;

function TXFileStream.Read(Buffer: TBytes; Offset, Count: Longint): Longint;
var i, keylen, keypos: Cardinal; key: TArray<Byte>; x: Longint;
begin
  Result := FileRead(FHandle, Buffer, Offset, Count);
  if Result = -1 then
  begin
    Result := 0;
    exit;
  end;

  keylen := length(Chiffre);
  SetLength(key, keylen);
  for i := 1 to keylen do key[i-1] := ord(Chiffre[i]);
  if Offset > keylen then
    keypos := Offset mod keylen
  else
    keypos := Offset;

  for x := 0 to Count-1 do
  begin
    Buffer[x] := Buffer[x] xor key[keypos]; //Buffer wird wie gewünscht überschrieben
    inc(keypos);
    if keypos > keylen - 1 then keypos := 0;
  end;
end;
PS: Ich habe außerdem probiert die read function des Sourcestream (tfilestream) von IdHTTPRangeStream zu erweitern, so dass IdHTTPRangeStream statt selbst zu decodieren von dem filestream die decodierten Daten liest. Jedoch liest der IdHTTPRangeStream über einen nicht als Array of Byte definierten Buffer in den ich daher nicht schreiben kann. Außerdem hat diese Read function kein offset.

2. Wie kann ich var Buffer überschreiben?

Code:
//{$IFNDEF NEXTGEN}
function TXFileStream.Read(var Buffer; Count: Longint): Longint;
var i, keylen, keypos: Cardinal; key: TArray<Byte>; x: Longint;
begin
  Result := FileRead(FHandle, Buffer, Count);
  if Result = -1 then
  begin
    Result := 0;
    exit;
  end;

  keylen := length(Chiffre);
  SetLength(key, keylen);
  for i := 1 to keylen do key[i-1] := ord(Chiffre[i]);
  keypos := 0;

  for x := 0 to Count-1 do
  begin
    TIdBytes(Buffer)[x] := TIdBytes(Buffer)[x] xor key[keypos]; //geht nicht
    inc(keypos);
    if keypos > keylen - 1 then keypos := 0;
  end;
end;
//{$ENDIF !NEXTGEN}
Bin für Ideen offen
Viele Grüße
  Mit Zitat antworten Zitat