You are not logged in.
Pages: 1
Hi,
sorry didn't see that you add a "SetBearer" for the IJsonClient, with this it is working.
nice weekend to all of you.
Hi ab,
you are the best!
It is working!
But one thing to mention/investigate: I think there is some problem with the assignment of the token via Variant (Pointer) - (Autofree?)
c.Http.Options.Auth.Token := api.GetRpcLogin('user@domain.tdl','SomePassword').token;
-> the Auth.Token in InternalSendRequest is empty.
if i set the token to a local rawutf8 and assign this to the c.Http.Options.Auth.Token it is filled and the next request is working.
s := api.GetRpcLogin('user@domain.tdl','SomePassword').token;
c.Http.Options.Auth.Token := s;
maybe critical/unexpected also on other assignments in the framework?
Hi ab,
thanks for the quick response.
You're right, I mixed up the internal "ApiVersion" with the openapi-spec.
In saggerui there is the hint "OAS 2.0" on top, so it isn't openapi spec v1
FYI: Because auf auth, the definition is defined as
"securityDefinitions": {
"JWT": {
"description": "Add the token prepending \"Bearer \" (without quotes) to it",
"in": "header",
"name": "Authorization",
"type": "apiKey"
}
},
"security": [
{
"JWT": []
}
],
Hi,
i give the generator a quick try againt a "PostgREST (https://postgrest.org/)" api. Generation works. But i must some changes in the client to support the the login on the api (AuthBearer)
The Login route looks like this in the automatic generated openapi (v1) from the PostgREST-Service:
"/rpc/login": {
"get": {
"parameters": [
{
"format": "text",
"in": "query",
"name": "email",
"required": true,
"type": "string"
},
{
"format": "text",
"in": "query",
"name": "pass",
"required": true,
"type": "string"
}
],
"produces": [
"application/json",
"application/vnd.pgrst.object+json;nulls=stripped",
"application/vnd.pgrst.object+json"
],
"responses": {
"200": {
"description": "OK"
}
},
"tags": [
"(rpc) login"
]
},
the via mopenapi.exe generated procedure for this route is:
procedure TAPIClient.GetRpcLogin(const Email: RawUtf8; const Pass: RawUtf8);
After i have change it to parse and return variant. It get the result token via json.
Is "produces": ["application/json"] not supported? - what is the right way to get the result from the ApiClient/IJsonClient?
But with the mod i got it working:
c := TJsonClient.Create('https://postgrest.domain.tld','');
api := TAPIClient.Create(c);
v := api.GetRpcLogin('user@domain.tdl','SomePassword');
d := DocDictFrom(v);
s := d.U['token'];
c.Http.Options.Auth.Scheme := wraBearer;
c.Http.Options.Auth.Token := s;
//next calls with token
artArr := api.GetArticle;
Also it would be nice to give the generator or created object (TAPIClient/TJsonClient) the some hints and params so that the login results in a prefilled auth infos after login.
It was just a quick test for me, so no not critical for me, just a hint and maybe feature improvement for you ab.
Maybe it is also a lack of none standard generation of openapi-spec from PostgREST.
Many thanks for your work on this module of the framework @Andreas and @ab
Hi Arnaud,
perfect. Thank you very much.
So i was in the right direction.
Tested and verified!
Tobias
Hi Arnaud,
yes i want a merge.
Looking for "merge" in mormot.core.variants points me to:
/// set a value, given its path
// - path is defined as a dotted name-space, e.g. 'doc.glossary.title'
// - aCreateIfNotExisting=true will force missing nested objects creation
// - aMergeExisting=true will merge aValue object with any existing object
// - returns nil if there is no item to be set at the supplied aPath
// - returns the address of the found or created value in aValue
// - you can set e.g. aPathDelim = '/' to search e.g. for 'parent/child'
function SetValueByPath(const aPath: RawUtf8; const aValue: variant;
aCreateIfNotExisting: boolean = false; aPathDelim: AnsiChar = '.';
aMergeExisting: boolean = false): PVariant;
because of "aMergeExisting=true will merge aValue object with any existing object"
is this an option? - I tried it, but I got an exception. Also i don't realize how to "Set" the root Path.
Thank you.
Hi,
I thought I could update the JSON object with an object that only contains part of the values. Unfortunately, the child objects are overwritten with the update object child element and the existing elements are lost.
Sample:
Json to update:
d1 := DocDict('
{
"name": "Mustermann",
"address": {
"city": "Musterstadt",
"street": "Lindenallee"
}
}');
Json Update input.
d2 := DocDict('{
"surname": "Max",
"address": {
"postal_code": "12345"
}
}');
d1.Update(d2);
Output:
{
"name": "Mustermann",
"address": {
"postal_code": "12345"
},
"surname": "Max"
}
Expected:
{
"name": "Mustermann",
"address": {
"city": "Musterstadt",
"street": "Lindenallee"
"postal_code": "12345"
},
"surname": "Max"
}
I have also tried "mDefault" as Model instead of mFastFloat.
Any chance to merge the json on all levels?
Thanks,
Tobias
Hi Chaa,
thank you for the clarification. I was already thinking something like that. Due to the code base that is used by Delphi 7 and Delphi 12, many things have not yet been converted to RawUTF8. So we must must be careful in various places. Some of the framework's operations also work with the D7:string without any problems.
I have detected an unexpected behavior on old Delphi compiler vs. newer one.
var s:string;
dynArr:TRawUtf8DynArray;
begin
s := 'test1';
setLength(dynArr,1);
dynArr[0]='test1';
Result := DynArray(TypeInfo(TRawUtf8DynArray),dynArr).IndexOf(s,true);
end;
-> Delphi7: Result=0, found
-> Delphi12: Result=-1, not found
If i cast the string to RawUtf8 or use RawUtf8 directly it is working.
var u:RawUtf8;
dynArr:TRawUtf8DynArray;
begin
u := 'test1';
setLength(dynArr,1);
dynArr[0]='test1';
Result := DynArray(TypeInfo(TRawUtf8DynArray),dynArr).IndexOf(u,true);
end;
-> Delphi7: Result=0, found
-> Delphi12: Result=0, found
I have done it now via an regex found on StackOverflow:
Regex: /[\/-]?((\w+)(?:[=:]("[^"]+"|[^\s"]+))?)(?:\s+|$)/g
With this regex i was able to build the RawUtf8DynArray and assign it on my own ExecutableCommandLine.RawParams before ExecutableCommandLine.Parse(CRLF,'/','-')
Hi,
is there any function to produce a valid array that can be assigned to cmdline.RawParams to support a CMD-Line like:
prog.exe /switch1 /param="param with spaces" /switch2
My try with:
CsvToRawUtf8DynArray(ownCmdLine,dynArray,' ');
procduces a invalid array because of the spaces in the doublequoted param.
Thanks.
Hi Arnaud,
today i tried agl.exe / mormot.app.agl.pas. It works perfectly for my use case. But i have a problem with a process that has a URI in the params.
For example "powershell" -command "$l = New-Object System.Net.HttpListener ; $l.Prefixes.Add('http://127.0.0.1:8080/'); $l.Start(); ..."
Problem detected in mormot.app.agl.Exec. "NormalizeFileName" is also done on the params. So "http://127.0.0.1:8080/" under Windows becomes "http:\\127.0.0.1:8080\". Under Unix, the same probably happens with backslashes in the parameters.
Thanks ab, for this great framwork!
Kind regards,
Tobias
Hi,
is it possible to serialize a record like this with definition RegisterFromText and without changing the record type (TTest) definition?
type TEnum = (eTagUnknown,eTagOne,eTagTwo)
TTest = record
id: cardinal;
test: string;
prices: array[1..3] of double;
tags[eTagOne..eTagTwo] of integer;
end;
const __TTest = 'id:cardinal;test:string;prices: array of double;tags: array of integer';
I have tried registriation with:
Rtti.RegisterTypes([TypeInfo(TEnum)]);
Rtti.RegisterFromText(TypeInfo(TTestRecord),__TTest);
but i get the error/exception on RegisterFromText:
Rtti.RegisterFromText(TTestRecord): text definition covers 16 bytes, but RTTI defined 40
Hi,
if i want to update the pivot-table with new entries i call "PivotTable.ManyAdd" with NoDuplicates=true. But the result is false if the record allready exists.
So the is no difference between ignore insert and a false result because of the false result from Client.Add or UseBatch.Add.
Maybe set the result to true if InternalIDFromSourceDest<>0 is better?
if NoDuplicates and
(InternalIDFromSourceDest(aClient, aSourceID, aDestID) <> 0) then
begin
result := true;
exit; // this TRecordReference pair already exists
end;
best regards,
Tobias
Hi,
are there any plans to support authentification for reqests and proxy-authentication via WinHttpSetCredentials like descriped at:
https://learn.microsoft.com/en-us/windo … in-winhttp
Best regards
Tobias
Pages: 1