Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHTTPRangeStream VBuffer vor dem Senden verändern (https://www.delphipraxis.net/203014-idhttprangestream-vbuffer-vor-dem-senden-veraendern.html)

gabneo 3. Jan 2020 14:06

IdHTTPRangeStream VBuffer vor dem Senden verändern
 
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

gabneo 4. Jan 2020 14:32

AW: IdHTTPRangeStream VBuffer vor dem Senden verändern
 
Ich habe mich noch mal mit dem 2. Weg auseinander gesetzt und dazu weiter recherchiert.
Untyped Parameter kann man in Delphi mit einem @ direkt ansprechen (https://stackoverflow.com/questions/...type-parameter).

Somit war es mir möglich den Sourcestream dazu zu bringen, die bereits decodierten Bytes an den IdHTTPRangeStream weiter zu geben. Offset benötige ich scheinbar nicht.

Die verwendete Read-Funktion beginnt doch immer beim Anfang der Datei zu lesen?
Liest IdHTTPRangeStream immer die gesamte Datei ein und schneidet nur den relevanten Teil heraus?

Wie auch immer, hiermit funktionierts.
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;//Buffer;

  for x := 0 to Count-1 do
  begin
    TIdBytes(@Buffer)[x] := TIdBytes(@Buffer)[x] xor key[keypos]; //man beachte das @Buffer
    inc(keypos);
    if keypos > keylen - 1 then keypos := 0;
  end;
end;
//{$ENDIF !NEXTGEN}
Viele Grüße


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