Skip to content

Commit 4d9ab42

Browse files
Got it working in XE2.
1 parent b12ebeb commit 4d9ab42

6 files changed

Lines changed: 122 additions & 51 deletions

Source/VSoft.HttpClient.Response.pas

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,11 @@ procedure THttpResponse.WriteBuffer(const buffer: TBytes; const length : NativeI
361361
begin
362362
if FStream = nil then
363363
exit;
364-
FStream.WriteData(buffer, length);
364+
{$IF CompilerVersion > 23}
365+
FStream.WriteData(buffer, length);
366+
{$ELSE}
367+
FStream.WriteBuffer(buffer, length);
368+
{$IFEnd}
365369
end;
366370

367371
end.

Source/VSoft.HttpClient.WinHttpClient.pas

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface
1717

1818

1919
type
20-
THttpClient = class(TInterfacedObject, IHttpClient, IHttpClientInternal)
20+
THttpClient = class(THttpClientBase, IHttpClient, IHttpClientInternal)
2121
private
2222
FUri : IUri;
2323

@@ -92,7 +92,7 @@ THttpClient = class(TInterfacedObject, IHttpClient, IHttpClientInternal)
9292

9393
//IHttpClientInternal
9494
function Send(const request : TRequest; const cancellationToken : ICancellationToken = nil) : IHttpResponse;overload;
95-
procedure ReleaseRequest(const request : TRequest);
95+
procedure ReleaseRequest(const request : TRequest);override;
9696

9797

9898
public
@@ -104,6 +104,7 @@ THttpClient = class(TInterfacedObject, IHttpClient, IHttpClientInternal)
104104
implementation
105105

106106
uses
107+
System.RTLConsts,
107108
System.Math,
108109
System.StrUtils;
109110

@@ -208,17 +209,18 @@ destructor THttpClient.Destroy;
208209
i : integer;
209210
begin
210211
FWaitEvent.SetEvent;
211-
FWaitEvent.Free;
212212

213-
if FSession <> nil then
214-
WinHttpCloseHandle(FSession);
215213
if FRequests.Count > 0 then
216214
begin
217215
//reverse order as they remove themselves from the list.
218216
for i := FRequests.Count -1 downto 0 do
219217
FRequests[i].Free;
220218
end;
221219
FRequests.Free;
220+
if FSession <> nil then
221+
WinHttpCloseHandle(FSession);
222+
FWaitEvent.Free;
223+
222224
inherited;
223225
end;
224226

@@ -578,18 +580,19 @@ procedure THttpClient.OnHTTPCallback(hInternet: HINTERNET; dwInternetStatus: DWO
578580
end;
579581

580582
function THttpClient.ReadData(hRequest: HINTERNET; dataSize : DWORD): boolean;
581-
var
582-
bufferSize : DWORD;
583+
//var
584+
// bufferSize : DWORD;
583585
begin
584-
bufferSize := Min(dataSize + 2, cReceiveBufferSize);
585-
ZeroMemory(@FReceiveBuffer[0], bufferSize);
586-
result := WinHttpReadData(hRequest, FReceiveBuffer[0], bufferSize , @FLastReceiveBlockSize);
586+
// bufferSize := Min(dataSize + 2, cReceiveBufferSize);
587+
ZeroMemory(@FReceiveBuffer[0], cReceiveBufferSize);
588+
result := WinHttpReadData(hRequest, FReceiveBuffer[0], cReceiveBufferSize , @FLastReceiveBlockSize);
587589
end;
588590

589591

590592
procedure THttpClient.ReleaseRequest(const request: TRequest);
591593
begin
592-
FRequests.Remove(request);
594+
if FRequests.Contains(request) then
595+
FRequests.Remove(request);
593596
end;
594597

595598

@@ -718,7 +721,11 @@ function THttpClient.Send(const request: TRequest; const cancellationToken: ICan
718721
bufferSize := TRequestCracker(FCurrentRequest).GetContentLength;
719722
SetLength(buffer,bufferSize);
720723
ZeroMemory(@buffer[0], bufferSize);
724+
{$IF CompilerVersion > 23} //XE3+
721725
stream.ReadBuffer(buffer,0 , bufferSize);
726+
{$ELSE}
727+
stream.ReadBuffer(buffer, bufferSize);
728+
{$IFEND}
722729
FData := @buffer[0];
723730
FBytesWritten := FDataLength;
724731
end
@@ -823,6 +830,34 @@ procedure THttpClient.UseSerializer(const useFunc: TUseSerializerFunc);
823830
raise ENotImplemented.Create('Serialization not implemented yet');
824831
end;
825832

833+
function StreamReadBuffer(const stream : TStream; var Buffer: TBytes; Offset, Count: integer) : integer;
834+
var
835+
LTotalCount,
836+
LReadCount: integer;
837+
begin
838+
{ Perform a read directly. Most of the time this will succeed
839+
without the need to go into the WHILE loop. }
840+
stream.Seek(Offset, soFromBeginning);
841+
LTotalCount := Stream.Read(Buffer, Count);
842+
{ Check if there was an error }
843+
if LTotalCount < 0 then
844+
raise EReadError.CreateRes(@SReadError) at ReturnAddress;;
845+
846+
while (LTotalCount < Count) do
847+
begin
848+
{ Try to read a contiguous block of <Count> size }
849+
LReadCount := StreamReadBuffer(stream, Buffer, Offset + LTotalCount, (Count - LTotalCount));
850+
851+
{ Check if we read something and decrease the number of bytes left to read }
852+
if LReadCount <= 0 then
853+
raise EReadError.CreateRes(@SReadError) at ReturnAddress
854+
else
855+
Inc(LTotalCount, LReadCount);
856+
end;
857+
result := LTotalCount;
858+
end;
859+
860+
826861
function THttpClient.WriteData(hRequest: HINTERNET; position : DWORD): boolean;
827862
var
828863
stream : TStream;
@@ -839,7 +874,8 @@ function THttpClient.WriteData(hRequest: HINTERNET; position : DWORD): boolean;
839874

840875
SetLength(buffer,bufferSize + 2);
841876
ZeroMemory(@buffer[0], bufferSize);
842-
stream.ReadBuffer(buffer, position, bufferSize);
877+
878+
streamReadBuffer(stream, buffer, position, bufferSize);
843879

844880
result := WinHttpWriteData(hRequest, buffer, bufferSize, nil);
845881

0 commit comments

Comments
 (0)