-
Content Count
267 -
Joined
-
Last visited
-
Days Won
2
Posts posted by Jacek Laskowski
-
-
FastReport is also missing...
-
1 hour ago, Dmitry Arefiev said:Do we have a report for this ?
- 1
-
Bug exist in System.Net.HttpClient.Win.pas file. This is not exactly REST Library like I wrote previous, but REST uses this subsystem too.
Bad function with my changes:
function ReadHeader(ARequest: HINTERNET; AHeaderFlag: DWORD; const AHeaderName: string = ''): string; var LSize: Cardinal; LFlags: DWORD; LHeaderName: PWideChar; begin LFLags := AHeaderFlag; if AHeaderName <> '' then begin LFLags := LFLags or WINHTTP_QUERY_CUSTOM; LHeaderName := PWideChar(AHeaderName); end else LHeaderName := WINHTTP_HEADER_NAME_BY_INDEX; LSize := 0; WinHttpQueryHeaders(ARequest, LFLags, LHeaderName, nil, LSize, WINHTTP_NO_HEADER_INDEX); if GetLastError = ERROR_WINHTTP_HEADER_NOT_FOUND then Result := '' else begin if GetLastError <> ERROR_INSUFFICIENT_BUFFER then raise ENetHTTPException.CreateResFmt(@SNetHttpHeadersError, [GetLastError, SysErrorMessage(GetLastError, TWinHttpLib.Handle)]); SetLength(Result, LSize div SizeOf(Char) - 1); // ---------------------- my changes begin if Length(Result) = 0 then begin SetLength(Result, 1); end; // ---------------------- my changes end if WinHttpQueryHeaders(ARequest, LFLags, LHeaderName, PChar(Result), LSize, WINHTTP_NO_HEADER_INDEX) = False then raise ENetHTTPException.CreateResFmt(@SNetHttpHeadersError, [GetLastError, SysErrorMessage(GetLastError, TWinHttpLib.Handle)]); end; end;
The problem occurs when a zero-length string (SetLength) is created and passed by the PChar to the WinHttpQueryHeaders() method as Nil.
SetLength(Result, LSize div SizeOf(Char) - 1); //when LSize = 2 then Result is empty string
I can't reproduce this case now, because I don't have access to that site that caused the error on the hackathon, and on a few other ones that I checked right now, this situation doesn't occur (the header row with 2 characters).
- 1
-
The REST Library in Delphi Rio has a serious error. I was last weekend at the world's largest HackYeah hackathon, where I needed to use the Delphi Rio to connect to the rest service. However, I could not. REST Debbuger did not return any error or response after calling the request (button Send Request). I lost a lot of time on the verification of network connections and the operation of the server itself (I thought that a heavy load on the hackatone participants "killed" the server) but it turned out to be a mistake in the REST Library. When I tried to call the request directly from Delphi (request.Execute ()) I got an error in KERNELBASE. There is no error in Delphi Tokyo, the same code worked there, but on my laptop I only had Rio. So I was looking for a solution. Eventually, I found the place and the reason, corrected RTL file (after copy to project directory) and the code runed, but the bad taste remained.
Later I will publish where the error lies.
- 1
-
Yes, it's good idea!
- 1
-
-
Next example of use inline variable to improve code clarity:
Instead of unclear:
fRecipients := TCollections.CreateList<TRecipient>(True);
we can write:
fRecipients := TCollections.CreateList<TRecipient>(var OwnsObjects = True);
-
Based on this thread:
https://stackoverflow.com/questions/29958168/are-integer-reads-atomic-in-delphi
it can be assumed that writing or reading Integer values (4 bytes) does not have to be atomic. It depends on the alignment.
Questions:
Is writing and reading 1 byte (type Byte) always atomic (and safe) operation?Is writing and reading 2 byte (type Word) always atomic (and safe) operation?
Strange thing in System.Generics.Defaults.pas
in RTL and Delphi Object Pascal
Posted
Quote:
What is this? Why 42? 🙂
ps. Delphi Tokyo, maybe other too