@@ -17,7 +17,7 @@ interface
1717
1818
1919type
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)
104104implementation
105105
106106uses
107+ System.RTLConsts,
107108 System.Math,
108109 System.StrUtils;
109110
@@ -208,17 +209,18 @@ destructor THttpClient.Destroy;
208209 i : integer;
209210begin
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 ;
223225end ;
224226
@@ -578,18 +580,19 @@ procedure THttpClient.OnHTTPCallback(hInternet: HINTERNET; dwInternetStatus: DWO
578580end ;
579581
580582function THttpClient.ReadData (hRequest: HINTERNET; dataSize : DWORD): boolean;
581- var
582- bufferSize : DWORD;
583+ // var
584+ // bufferSize : DWORD;
583585begin
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);
587589end ;
588590
589591
590592procedure THttpClient.ReleaseRequest (const request: TRequest);
591593begin
592- FRequests.Remove(request);
594+ if FRequests.Contains(request) then
595+ FRequests.Remove(request);
593596end ;
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' );
824831end ;
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+
826861function THttpClient.WriteData (hRequest: HINTERNET; position : DWORD): boolean;
827862var
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