![]() |
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:
Funktioniert mit einem TFilestream einwandfrei:
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;
Code:
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.
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; 2. Wie kann ich var Buffer überschreiben?
Code:
Bin für Ideen offen :)
//{$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} Viele Grüße |
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 ( ![]() 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:
Viele Grüße
//{$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} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz