AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdHTTPRangeStream VBuffer vor dem Senden verändern
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTPRangeStream VBuffer vor dem Senden verändern

Ein Thema von gabneo · begonnen am 3. Jan 2020 · letzter Beitrag vom 4. Jan 2020
Antwort Antwort
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
gabneo

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

AW: IdHTTPRangeStream VBuffer vor dem Senden verändern

  Alt 4. Jan 2020, 15:32
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 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