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