#1 Re: mORMot 2 » openapi - generator / IRestClient - feature improvements » 2024-11-22 16:24:46

Hi,

sorry didn't see that you add a "SetBearer" for the IJsonClient, with this it is working.

nice weekend to all of you.

#2 Re: mORMot 2 » openapi - generator / IRestClient - feature improvements » 2024-11-22 11:33:40

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?

#3 Re: mORMot 2 » openapi - generator / IRestClient - feature improvements » 2024-11-22 10:09:46

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": []
    }
  ],

#4 mORMot 2 » openapi - generator / IRestClient - feature improvements » 2024-11-22 08:18:41

tfopc
Replies: 5

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

#5 Re: mORMot 2 » IDocDict.Update - nested objects are overriden - no merge on childs? » 2024-11-20 13:39:02

Hi Arnaud,

perfect. Thank you very much.
So i was in the right direction.

Tested and verified!

Tobias

#6 Re: mORMot 2 » IDocDict.Update - nested objects are overriden - no merge on childs? » 2024-11-19 14:31:48

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.

#7 mORMot 2 » IDocDict.Update - nested objects are overriden - no merge on childs? » 2024-11-19 12:25:28

tfopc
Replies: 4

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

#8 Re: mORMot 2 » DynArray IndexOf - D7 vs D12.1 - Different Results » 2024-09-16 15:21:00

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.

#9 mORMot 2 » DynArray IndexOf - D7 vs D12.1 - Different Results » 2024-09-16 08:32:23

tfopc
Replies: 3

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

#10 Re: mORMot 2 » TExecutableCommandLine with own command line » 2024-09-16 08:10:17

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,'/','-')

#11 mORMot 2 » TExecutableCommandLine with own command line » 2024-09-13 15:02:19

tfopc
Replies: 1

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.

#12 mORMot 2 » Problem with mormot.app.agl (process params with URI) » 2024-09-09 12:38:42

tfopc
Replies: 0

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

#13 mORMot 2 » Record serialization of static arrays (Delphi7, no rtti-infos) » 2024-03-07 08:17:02

tfopc
Replies: 1

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

#14 mORMot 2 » TOrmMany/TSQLMany - ManyAdd result » 2024-01-21 13:16:13

tfopc
Replies: 0

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

#15 mORMot 2 » Authentication in WinHTTP / WinHttpSetCredentials » 2024-01-08 16:24:08

tfopc
Replies: 1

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

Board footer

Powered by FluxBB