Logovanie a ladenie Web API
Beh ABRA API je možné logovať. A to jednak jeho Java časť pomocou konfiguračného súboru APIServer.yaml, ktorý je v koreňovom adresári inštalácie systému ABRA Gen, a potom ďalej na úrovni business logiky pomocou súboru NEXUS.CFG.
Súčasťou oboch logov je tzv rid, generované pomocou hlavičky X-Request-ID, ktoré umožňuje ľahko identifikovať tak serverovú, ako aj BO časť požiadavky v oboch takto vytvorených logoch.
Všeobecnú konfiguráciu nastavenia logovania systému ABRA Gen viď kap. Logovanie chodu aplikácie.
Odporúčaná konfigurácia nastavenia logovania na úrovni v súbore NEXUS.CFG (od verzie 22) je nasledujúca:
[Logs]
LogsDirectory=<lokálna cesta, ideálne SSD>
Level=3
[Log.ExceptionHook]
Enabled=1
Level=6
ExcludedExceptionClasses=EAbort;NxHiddenError;EIdSocketError;EIdConnectTimeout;EIdNotASocket
ExcludedNxErrorCodes=
[Log.SysLog]
Enabled=1
Level=6
[Log.ProfilingSQL]
Enabled=0
Level=6
Threshold=1000
SQLOutputLength=0
[Log.WA~Monitoring]
Enabled=1
Level=6
[Log.WA/RESTApplication]
Enabled=1
Level=6
[Log.WA/RESTApplication/Security]
Enabled=1
Level=6
[Log.WA/RESTApplication/ProfilingRequest]
Enabled=1
Level=6
SQLText=1
SQLPlan=1
[Log.WA/RESTApplication/Pool]
Enabled=0
Level=6
[Log.WA/RESTApplication/Memory]
Enabled=0
Level=6
Log ExceptionHook slúži na logovanie výnimiek, je jediný, ktorý stojí za to mať zapnutý stále. Ostatné logy je z dôvodu výkonu a rýchlo rastúcej veľkosti súboru s logmi potrebné mať počas prevádzky vypnuté a zapnúť ich podľa príkladu až pri potrebe.
Ak je potrebné v logu výnimiek vypísať všetky výnimky (vrátane EAbort atď.), je nutné v sekcii [Log.ExceptionHook] explicitne vyprázdniť zoznamy vylúčených tried a chybových kódov (inak sa použijú interné prednastavené hodnoty):
ExcludedNxErrorCodes=
ExcludedExceptionClasses=
Ak je potrebné obmedziť celé logovanie iba na procesy vykonávajúce API dopyty, doplňte do hlavnej sekcie [Logs] parameter AllowedApps:
AllowedApps=java.
Log SysLog loguje informácie zo štartu aplikácie (tj. s akými parametrami bol program spustený, nastavenie niektorých interných premenných a pod.).
Log Profilingsql na aplikačnom serveri loguje SQL dotazy, ktoré prekročia nastavený čas. Použitím tohto logu sa dá zistiť, či za prípadnou pomalosťou API dopytov nestojí databáza. Threshold je čas v ms, pri ktorého prekročení sa dotaz zaloguje. SQLOutputLength je dĺžka SQL dotazu, ktorá sa zaloguje, 0 znamená celý dotaz.
Log WA/RESTApplication/ProfilingRequest je najdôležitejší. Je v ňom zahrnutý buď obsah požiadavky aj odpoveď (Level=6) alebo len základné informácie bez tela požiadavky a odpovede (Level=5). V prípade, že vykonávanie požiadavky zamrzne, loguje sa tu callstack threadu, ktorý požiadavku vykonáva a môže napovedať, kde je problém. Od verzie 24.1 je log WA/RESTApplication/ProfilingRequest upravený tak, že logovanie SQL generovaného API sa vykonáva explicitným zapnutím prepínača SQLText=1 a nanovo je možné zalogovať aj SQL plán pomocou SQLPlan=1. Oboje funguje iba pri nastavení Level=6. SQL plán sa neberie priamo z vykonávaného dopytu, ale požiada sa oň databázový engine v separátnom dopyte (implementovanie na základe informácie z AbraBI). Pri ladení problémov s rýchlosťou SQL je odporúčané logovanie zapnúť a vyhodnotiť, viď príklady nižšie.
Log WA/RESTApplication/Security umožňuje zistiť, ktoré chránené objekty boli použité na získanie dát požiadavky a teda sa hodí použiť na riešenie problému s právami k objektom.
Príklad volania metódy GET pre doklad faktúry vydanej: GET http://localhost/develop/issuedinvoices, používateľ nemá správne nastavené práva k chráneným objektom
26.03.2025 11:57:42.847 [5] 00005CF0 (WAProfilingRequest) Začiatok požiadavky(rid:API_b144e5342e5d46fe9049cb1494728cb2): GET http://localhost/develop/issuedinvoices
X-Request-ID=API_b144e5342e5d46fe9049cb1494728cb2
User-Agent=PostmanRuntime/7.43.2
Host=localhost
Connection=keep-alive
Accept=*/*
Accept-Encoding=gzip, deflate, br
Postman-Token=20da25f8-eaa4-40ea-b696-f7150f496ce7
26.03.2025 11:57:42.875 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole IssuedInvoices.DocQueue_ID(Zdrojový rad)
Povolené ID: 5600000101,
26.03.2025 11:57:42.877 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole IssuedInvoices.AccDocQueue_ID(Účtovný rad)
Povolené ID: Žiadne ID nie je povolené !!!
26.03.2025 11:57:42.879 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole IssuedInvoices.BankAccount_ID(Vlastný účet)
Povolené ID: 2200000101,
26.03.2025 11:57:42.881 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole Rows.Division_ID(Stredisko)
Povolené ID: 2100000101,1200000101,2200000101,1300000101,1400000101,2400000101,3400000101,
26.03.2025 11:57:42.884 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole Rows.Store_ID(Sklad)
Povolené ID: 2100000101,1500000101,2500000101,3500000101,
26.03.2025 11:57:42.886 [6] 00005CF0 (WAProfilingRequest)
Spustiť čítanie sql - Vstupné parametre: @{SelDocQueue_ID1Frag}=('5600000101');@{SelBankAccount_ID3Frag}=('2200000101');@{SelRowsDivision_ID4Frag}=('1300000101','1400000101','3400000101','2400000101','2200000101','1200000101','2100000101');@{SelRowsStore_ID5Frag}=('1500000101','2500000101','3500000101','2100000101');@{$IndexAndWhere}=;
select T_1.AccDocQueue_ID as F_1$REFERENCE, T_1.AccPresetDef_ID as F_2$REFERENCE, T_1.Address_ID as F_3$REFERENCE, T_1.BankAccount_ID as F_4$REFERENCE, T_1.ClosingPeriod_ID as F_5$REFERENCE, T_1.ConstSymbol_ID as F_6$REFERENCE, T_1.CorrectedBy_ID as F_7$REFERENCE, T_1.Country_ID as F_8$REFERENCE, T_1.CreatedBy_ID as F_9$REFERENCE, T_1.Currency_ID as F_10$REFERENCE, T_1.DealerCategory_ID as F_11$REFERENCE, T_1.DeliveryAddress_ID as F_12$REFERENCE, T_1.DeliveryFirm_ID as F_13$REFERENCE, T_1.DeliveryFirmOffice_ID as F_14$REFERENCE, T_1.DeliveryTerms_ID as F_15$REFERENCE, T_1.DocQueue_ID as F_16$REFERENCE, T_1.Firm_ID as F_17$REFERENCE, T_1.FirmOffice_ID as F_18$REFERENCE, T_1.ID as ID, T_1.IEState_ID as F_19$REFERENCE, T_1.IntrastatDeliveryTerm_ID as F_20$REFERENCE, T_1.IntrastatTransactionType_ID as F_21$REFERENCE, T_1.IntrastatTransportationType_ID as F_22$REFERENCE, T_1.LastPaymentPeriod_ID as F_23$REFERENCE, T_1.LocalZone_ID as F_24$REFERENCE, T_1.ObjVersion as ObjVersion, T_1.PaymentType_ID as F_25$REFERENCE, T_1.Period_ID as F_26$REFERENCE, T_1.Person_ID as F_27$REFERENCE, T_1.PostAddress_ID as F_28$REFERENCE, T_1.PostFirm_ID as F_29$REFERENCE, T_1.PostFirmOffice_ID as F_30$REFERENCE, T_1.TransportationType_ID as F_31$REFERENCE, T_1.VATCountry_ID as F_32$REFERENCE, T_1.Zone_ID as F_33$REFERENCE
from IssuedInvoices T_1
where ((T_1.DocQueue_ID IN {SelDocQueue_ID1Frag})) and (((T_1.AccDocQueue_ID IS NULL) OR (T_1.AccDocQueue_ID = '0000000000') OR (T_1.AccDocQueue_ID = ' '))) and ((T_1.BankAccount_ID IN {SelBankAccount_ID3Frag})) and ((EXISTS(SELECT 1 FROM IssuedInvoices2 T_2 WHERE T_2.Parent_ID =T_1.ID AND ((Division_ID IS NULL) OR (Division_ID = '0000000000') OR (Division_ID = ' ') OR (Division_ID IN {SelRowsDivision_ID4Frag})) AND ((Store_ID IS NULL) OR (Store_ID = '0000000000') OR (Store_ID = ' ') OR (Store_ID IN {SelRowsStore_ID5Frag}))) OR Not EXISTS(SELECT 1 FROM IssuedInvoices2 T_2 WHERE T_2.Parent_ID =T_1.ID)))
26.03.2025 11:57:42.892 [6] 00005CF0 (WAProfilingRequest) Zastaviť čítanie sql trvanie: 16 ms
26.03.2025 11:57:42.893 [5] 00005CF0 (WAProfilingRequest) Zastavenie požiadavky(rid:API_b144e5342e5d46fe9049cb1494728cb2): stav 200 čas: 0 ms
Link=http://localhost:80/develop/api-docs/swagger.json#; rel="describedBy"
Content-Type=application/json
Access-Control-Allow-Credentials=true
Access-Control-Allow-Origin=*
Access-Control-Allow-Headers=Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control
Access-Control-Allow-Methods=GET,PUT,POST,DELETE
[]
Logy WA/RESTApplication/Pool a WA/RESTApplication/Memory sú nízkoúrovňové a ich zapnutie má zmysel len pri riešení špecifických problémov.
Ako je opísané vyššie v sekcii o logu WA/RESTApplication/ProfilingRequest, od verzie 24.1 je na logovanie SQL dotazov a ich plánov nutné explicitne zapnúť parametre SQLText=1 a SQLPlan=1 (pri Level=6):
[Log.WA/RESTApplication/ProfilingRequest]
Enabled=1
Level=6
SQLText=1
SQLPlan=1
Start read sql - InputParams: @{SelDivision_IDFrag}=('1300000101','1400000101','3400000101','2400000101','2200000101','1200000101','2100000101');@{SelStore_IDFrag}=('1300000101','2600000101','3400000101','1600000101','3200000101','4400000101','1500000101','2500000101','3500000101','2300000101','3300000101','2100000101');@{$IndexAndWhere}=;
select T_1.StoreCard_ID as F_1$REFERENCE, T_1.Store_ID as F_2$REFERENCE, sum(T_1.Quantity) as F_3, sum(T_1.DeliveredQuantity) as F_4, T_1.StoreCard_ID as F_5, T_1.Store_ID as F_6
from ReceivedOrders2 T_1
left join ReceivedOrders T_2 on T_2.ID = T_1.Parent_ID
where (T_1.Store_ID in ('2100000101', '2200000101') and T_1.RowType = 3 and T_2.Confirmed = 'A' and T_2.Closed = 'N' and T_1.Quantity > T_1.DeliveredQuantity) and (((T_1.Division_ID IS NULL) OR (T_1.Division_ID = '0000000000') OR (T_1.Division_ID = ' ') OR (T_1.Division_ID IN {SelDivision_IDFrag}))) and (((T_1.Store_ID IS NULL) OR (T_1.Store_ID = '0000000000') OR (T_1.Store_ID = ' ') OR (T_1.Store_ID IN {SelStore_IDFrag})))
group by F_5, F_6
SQL plan: PLAN JOIN (T_1 ORDER RECEIVEDORDERS2_SCARD INDEX (RECEIVEDORDERS2STOREFK, RECEIVEDORDERS2STOREFK), T_2 INDEX (RECEIVEDORDERSPK))
Začiatok čítania sql - InputParams: @{SelDivision_IDFrag}=('1300000101','1400000101','3400000101','2400000101','2200000101','1200000101','2100000101');@{SelStore_IDFrag}=('1300000101','2600000101','1600000101','3400000101','3200000101','4400000101','1500000101','2500000101','3500000101','2300000101','3300000101','2100000101');@{$IndexAndWhere}=;
select T_1.StoreCard_ID as F_1$REFERENCE, T_1.Store_ID as F_2$REFERENCE, sum(T_1.Quantity) as F_3, sum(T_1.DeliveredQuantity) as F_4, T_1.StoreCard_ID as F_5, T_1.Store_ID as F_6
from ReceivedOrders2 T_1
join ReceivedOrders T_2 on T_2.ID = T_1.Parent_ID
where (T_1.Store_ID in ('2100000101', '2200000101') and T_1.RowType = 3 and T_2.Confirmed = 'A' and T_2.Closed = 'N' and T_1.Quantity > T_1.DeliveredQuantity) and (((T_1.Division_ID IS NULL) OR (T_1.Division_ID = '0000000000') OR (T_1.Division_ID = ' ') OR (T_1.Division_ID IN {SelDivision_IDFrag}))) and (((T_1.Store_ID IS NULL) OR (T_1.Store_ID = '0000000000') OR (T_1.Store_ID = ' ') OR (T_1.Store_ID IN {SelStore_IDFrag})))
group by T_1.StoreCard_ID, T_1.Store_ID
SQL plán: |--Stream Aggregate(GROUP BY:([T_1].[StoreCard_ID]) DEFINE:([Expr1002]=SUM([toho].[dbo].[ReceivedOrders2].[Quantity] as [T_1].[Quantity]), [Expr1003]=SUM([toho].[dbo].[ReceivedOrders2].[DeliveredQuantity] as [T_1].[DeliveredQuantity]), [T_1].[Store_ID]=ANY([toho].[dbo].[ReceivedOrders2].[Store_ID] as [T_1].[Store_ID])))
|--Sort(ORDER BY:([T_1].[StoreCard_ID] ASC))
|--Nested Loops(Inner Join, OUTER REFERENCES:([T_1].[Parent_ID]))
|--Clustered Index Scan(OBJECT:([toho].[dbo].[ReceivedOrders2].[ReceivedOrders2PK] AS [T_1]), WHERE:([toho].[dbo].[ReceivedOrders2].[RowType] as [T_1].[RowType]=(3) AND [toho].[dbo].[ReceivedOrders2].[Quantity] as [T_1].[Quantity]>[toho].[dbo].[ReceivedOrders2].[DeliveredQuantity] as [T_1].[DeliveredQuantity] AND [toho].[dbo].[ReceivedOrders2].[Store_ID] as [T_1].[Store_ID]='2100000101' AND ([toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]=' ' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='0000000000' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='1200000101' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='1300000101' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='1400000101' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='2100000101' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='2200000101' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='2400000101' OR [toho].[dbo].[ReceivedOrders2].[Division_ID] as [T_1].[Division_ID]='3400000101')))
|--Clustered Index Seek(OBJECT:([toho].[dbo].[ReceivedOrders].[ReceivedOrdersPK] AS [T_2]), SEEK:([T_2].[ID]=[toho].[dbo].[ReceivedOrders2].[Parent_ID] as [T_1].[Parent_ID]), WHERE:([toho].[dbo].[ReceivedOrders].[Confirmed] as [T_2].[Confirmed]='A' AND [toho].[dbo].[ReceivedOrders].[Closed] as [T_2].[Closed]='N') ORDERED FORWARD)
Spustenie čítania sql - InputParams: @{SelDivision_IDFrag}=('1300000101','1400000101','3400000101','2400000101','2200000101','1200000101','1500000101','2100000101');@{SelStore_IDFrag}=('1620000101','1600000101','3200000101','4400000101','2300000101','3300000101','1300000101','2600000101','3400000101','1500000101','2500000101','3500000101','2100000101');@{$IndexAndWhere}=;
select T_1.StoreCard_ID as F_1$REFERENCE, T_1.Store_ID as F_2$REFERENCE, sum(T_1.Quantity) as F_3, sum(T_1.DeliveredQuantity) as F_4, T_1.StoreCard_ID as F_5, T_1.Store_ID as F_6
from ReceivedOrders2 T_1
join ReceivedOrders T_2 on T_2.ID = T_1.Parent_ID
where (T_1.Store_ID in ('2100000101', '2200000101') and T_1.RowType = 3 and T_2.Confirmed = 'A' and T_2.Closed = 'N' and T_1.Quantity > T_1.DeliveredQuantity) and (((T_1.Division_ID IS NULL) OR (T_1.Division_ID = '0000000000') OR (T_1.Division_ID = ' ') OR (T_1.Division_ID IN {SelDivision_IDFrag}))) and (((T_1.Store_ID IS NULL) OR (T_1.Store_ID = '0000000000') OR (T_1.Store_ID = ' ') OR (T_1.Store_ID IN {SelStore_IDFrag})))
group by T_1.StoreCard_ID, T_1.Store_ID
SQL plán: Hodnota hash plánu: 2830092148
---------------------------------------------------------------------------------------------------------------
| Id | Operácia | Názov | Riadky | Bajty | Náklady (%CPU)| Čas |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 64 | 6 (17)| 00:00:01 |
| 1 | HASH GROUP BY | | 1 | 64 | 6 (17)| 00:00:01 |
| 2 | NESTED LOOPS | | 1 | 64 | 5 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 4 | 64 | 5 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | RECEIVEDORDERS | 1 | 15 | 4 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IX_WS4K5TC4FSM43JGFVBMIIWSEXK | 4 | | 0 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| RECEIVEDORDERS2 | 2 | 98 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------
Informácie o predikáte (identifikované podľa id operácie):
---------------------------------------------------
4 - filter("T_2"."CONFIRMED"='A' AND "T_2"."CLOSED"='N')
5 - access("T_2"."ID"="T_1"."PARENT_ID")
6 - filter("T_1"."QUANTITY">"T_1"."DELIVEREDQUANTITY" AND "T_1"."ROWTYPE"=3 AND ("T_1"."STORE_ID"
IS NULL OR "T_1"."STORE_ID"='2100000101') AND ("T_1"."STORE_ID"='2100000101' OR
"T_1"."STORE_ID"='2200000101') AND ("T_1"."DIVISION_ID"=' ' OR "T_1"."DIVISION_ID"='0000000000' OR
"T_1"."DIVISION_ID"='1200000101' OR "T_1"."DIVISION_ID"='1300000101' OR
"T_1"."DIVISION_ID"='1400000101' OR "T_1"."DIVISION_ID"='1500000101' OR
"T_1"."DIVISION_ID"='2100000101' OR "T_1"."DIVISION_ID"='2200000101' OR
"T_1"."DIVISION_ID"='2400000101' OR "T_1"."DIVISION_ID"='3400000101'))
V leveli 3 sa loguje odopretý prístup, v leveli 4 aj povolený prístup.
Príklady pre firebird:
Stránka načítaná z http://toho-ntb3.local:8000/cors-demo.html
apiserver beží na http://localhost
browser je tiež na localhost
Pretože pre origin adresu, odkiaľ sa spúšťajú skripty (http://toho-ntb3.local:8000), nie sú nastavené v konfigurácii yaml žiadne pravidlá, je prístup k tomuto origin odmietnutý.
Log - Odmietnutý prístup:
[2025-05-27 17:13:52.560 [3] 00000021 (REQUESTSLOGGER) cors preflight on authorized path http://localhost/demo/countries - denied (origin: http://toho-ntb3.local:8000
Authorized path upozorňuje na to, že ide o cestu podliehajúcu autorizácii a origin na miesto, odkiaľ pochádza skript, ktorý request spustil. Pri cestách podliehajúcich autorizácii sa prípadné povolenie vykonania skriptu nastavuje v konfigurácii yaml v sekcii allowedOrigins.
Pre vlastné udelenie oprávnenia rozhoduje celý origin vrátane protokolu. Ako wildcard znak je možné použiť * a to viackrát. Typicky sa používa na začiatku na filtrovanie celej domény, napr. takto:
allowedOrigins:
- "*toho-ntb3.local:8000"
Po nastavení je potrebné apiserver reštartovať. Ideálne skúšať pomocou apiserver.ps1 z príkazového riadku, pretože potom je hneď vidieť, či sa podarilo yaml konfiguráciu načítať. Nezabudnite, že ide o reťazce, a teda musia byť v úvodzovkách.
Log - Povolený prístup:
[2025-05-27 17:32:28.818 [4] 00000022 (REQUESTSLOGGER) cors preflight on authorized path http://localhost/demo/countries - allowed (origin: http://toho-ntb3.local:8000)
V tomto konkrétnom prípade uvidíte v prehliadači pri sledovaní requestov chybu:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/demo/countries. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 200.
To, že hlavička Access-Control-Allow-Origin chýba, je problém na strane servera a vyrieši sa konfiguráciou. Avšak môžu nastať aj iné dôvody. Napr. pri dotazoch na cestu, ktorá nevyžaduje autorizáciu (napr. root), vracia apiserver štandardne hlavičku Access-Control-Allow-Origin s hodnotou *. Hodnota * sa ale nesmie použiť súčasne s prihlasovacími údajmi. Ak sa teda na root cestu pošlú aj autorizačné údaje, options zlyhá na túto chybu:
[Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at ‘http://localhost/’. (Reason: Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’).
Ak sa pokúšame poslať dotaz na neexistujúci api server, dôjde k nasledujúcej chybe.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:6543/demo/countries. (Reason: CORS request did not succeed). Status code: (null)
V tomto prípade je vodidlom status code null.
Stránka načítaná z http://localhost/demo/script/eu.abra.toho/api/corsdemo
api server beží na http://localhost
Ide o rovnaký origin (miesto localhost môže byť akákoľvek iná doména). V tomto prípade prehliadač CORS preflight requesty nevkladá a vykonáva ich priamo. Ak by však boli použité knižnice tretích strán stiahnuté z iných miest, tak už CORS zafunguje a správca bude musieť rozhodnúť, či povoliť alebo nie.
Je samozrejme možné v konfigurácii použiť * a tým efektívne anulovať akúkoľvek CORS ochranu. To ale nie je odporúčané.
Aktuálne sa hlavička Access-Control-Allow-Private-Network v prehliadači Firefox neposiela vôbec a v MS EDGE (a najskôr vo všetkých prehliadačoch založených na Chromiu) len v prípade, že origin (teda odkiaľ pochádza skript vykonávajúci request) smeruje z public adresy na private alebo local adresu. Toto sa teda bude meniť v čase a je to tiež závislé od konkrétneho prehliadača.
V prípade, že táto hlavička existuje, tak ju server štandardne spracuje a do logu zapíše napr.:
2025-05-28 08:13:54.204 [4] 00000022 (REQUESTSLOGGER) private network preflight allowed because cors preflight was allowed
Teoreticky sa môže hlavička Access-Control-Allow-Private-Network vyskytnúť aj v samostatnom preflight requeste, ale musela by na to existovať špeciálna konfigurácia. DNS by adresu muselo interne mapovať na privátny rozsah adries, napríklad www.nejakadomen.com a interne by resolve mena bol napríklad na rozsah 192.168 …. Je možné, že sa také konfigurácie vyskytujú. V takom prípade sa private network access riadi rovnako ako CORS - v prípade prístupu na cestu zadanú heslom sa overí, že pre tento origin je prístup povolený a informácie v logu budú podobné. Pripomíname, že na jeho fungovanie treba mať tiež nastavené allowPrivateNetworkAccess na true (východisková hodnota). Ak by bolo nastavené false, bola by v logu informácia, že nie je povolený v konfigurácii.
Na ladenie napríklad skriptov, ktoré priamo volajú API, sú k dispozícii query parametre. Nižšie uvádzame ich zoznam a krátky popis.
Parametre slúžia len na ladenie, ich použitie má rýchlostný dopad na vykonanie requestov.
[http://localhost:80/demo/script/api/testxy?executor=outprocess&debug-reload-scripts=true[http://localhost:80/demo/script/api/testxyqqq?debug-enforce-new-executor=true
-
debug-reload-scripts - na začiatku requestu uvoľní skripty z cache rovnako, ako to robí tlačidlo Znovunačítať skripty v agende Balíčky skriptov vo vizuálnom prostredí ABRA Gen. Tzn prejaví sa akákoľvek medzitým urobená zmena v skriptoch.
-
debug-enforce-new-executor - spôsobí, že sa request vykoná vždy v novom executore, teda s novým pripojením k spojeniu a prihlásením používateľa. V prípade session (u serverstate) sa pôvodná session uzavrie a otvorí sa nová. Okrem zmeny v skriptoch sa tu prejavia všetky ostatné zmeny.