statefulReverseProxy (Stateful Reverse Proxy)

A stateful reverse proxy executes an orchestration when an HTTP endpoint, defined by the Flow server's base URL plus path, is visited. The subsequent HTTP response is as though that upstream host's address was visited instead.

The difference a stateful reverse proxy has from a standard reverse proxy is that a stateful reverse proxy allows access to some of the session's stateful data, which has some rare use cases in regards to repeated authentication (eg. an entire application where login behaviour would need to be cached).

The path and upstream host are mandatory fields.

class names

scala: code.data.StatefulRevProxyFactory
javascript: code_data_StatefulRevProxyFactory

aliases

statefulRevProxy

config

{"categories":[{"defaultCollapsed":true,"fields":["useVirtualThreads","poolSize","sharedPoolName","streamType","mutualReentranceKey","nonReentrant","killOnStop","orchestrationTimeout","orchestratorName","env","isRunning","runOnlyOnHosts","runOnlyOnRanks","runOnlyOnRoles","deepDiagnostics","startupPriority","shouldPinFlows"],"name":"Advanced Run Configuration"}],"fieldName":"statefulReverseProxy","fields":[{"default":null,"fieldName":"statefulReverseProxy.upstreamHost","hidden":false,"hideLabel":false,"name":"upstreamHost","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.runOnlyOnRanks","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.runOnlyOnRanks.runOnlyOnRanks","hidden":false,"hideLabel":false,"name":"runOnlyOnRanks","readonly":false,"renderStrategies":[],"type":"I","validators":[]},"name":"runOnlyOnRanks","readonly":false,"renderStrategies":[],"type":"A"},{"default":null,"fieldName":"statefulReverseProxy.name","hidden":false,"hideLabel":false,"name":"name","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":"statefulReverseProxy","fieldName":"statefulReverseProxy.classPath","hidden":false,"hideLabel":false,"name":"classPath","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.bundle","hidden":false,"hideLabel":false,"name":"bundle","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":1,"fieldName":"statefulReverseProxy.threadPoolSize","hidden":false,"hideLabel":false,"name":"threadPoolSize","readonly":false,"renderStrategies":[],"type":"I","validators":[]},{"default":1,"fieldName":"statefulReverseProxy.totalThreadPoolSize","hidden":false,"hideLabel":false,"name":"totalThreadPoolSize","readonly":false,"renderStrategies":[],"type":"I","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.mutualReentrancyKey","hidden":false,"hideLabel":false,"name":"mutualReentrancyKey","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.path","hidden":false,"hideLabel":false,"name":"path","readonly":false,"renderStrategies":[],"type":"S","validators":[{"pattern":"^[\\/]?[^\\/\\n\\r]+[^\\n\\r]*$","rule":"regexMatch"}]},{"default":["AWSALB","AWSALBCORS","JSESSIONID","sessionid","csrftoken"],"fieldName":"statefulReverseProxy.withheldCookies","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.withheldCookies.withheldCookies","hidden":false,"hideLabel":false,"name":"withheldCookies","readonly":false,"renderStrategies":[],"type":"S","validators":[]},"name":"withheldCookies","readonly":false,"renderStrategies":[],"type":"A"},{"default":"collecting","fieldName":"statefulReverseProxy.streamType","hidden":false,"hideLabel":false,"name":"streamType","readonly":false,"renderStrategies":[],"type":"S","validators":[{"choices":["collecting","eager","forgetful"],"displayOverride":{},"rule":"choices","unenforced":false}]},{"default":false,"fieldName":"statefulReverseProxy.deepDiagnostics","hidden":false,"hideLabel":false,"name":"deepDiagnostics","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.runOnlyOnRoles","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.runOnlyOnRoles.runOnlyOnRoles","hidden":false,"hideLabel":false,"name":"runOnlyOnRoles","readonly":false,"renderStrategies":[],"type":"S","validators":[{"choices":["frontend","backend","viewer"],"displayOverride":{},"rule":"choices","unenforced":false}]},"name":"runOnlyOnRoles","readonly":false,"renderStrategies":[],"type":"A"},{"default":[],"fieldName":"statefulReverseProxy.additionalHeaders","hidden":false,"hideLabel":false,"itemType":{"categories":[],"fieldName":"statefulReverseProxy.additionalHeaders.additionalHeaders","fields":[{"default":null,"fieldName":"statefulReverseProxy.additionalHeaders.0.additionalHeaders.key","hidden":false,"hideLabel":false,"name":"key","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.additionalHeaders.0.additionalHeaders.value","hidden":false,"hideLabel":false,"name":"value","readonly":false,"renderStrategies":[],"type":"S","validators":[]}],"hidden":false,"hideLabel":false,"name":"additionalHeaders","readonly":false,"renderStrategies":[],"type":"O"},"name":"additionalHeaders","readonly":false,"renderStrategies":[],"type":"A"},{"default":false,"fieldName":"statefulReverseProxy.logToConsole","hidden":false,"hideLabel":false,"name":"logToConsole","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":[],"fieldName":"statefulReverseProxy.certificateAuthorities","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.certificateAuthorities.certificateAuthorities","hidden":false,"hideLabel":false,"name":"certificateAuthorities","readonly":false,"renderStrategies":[],"type":"S","validators":[]},"name":"certificateAuthorities","readonly":false,"renderStrategies":[],"type":"A"},{"default":"","fieldName":"statefulReverseProxy.description","hidden":false,"hideLabel":false,"name":"description","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":false,"fieldName":"statefulReverseProxy.stateful","hidden":false,"hideLabel":false,"name":"stateful","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"bindingHint":"the size of the threadpool. If this is set to a positive number, this trigger will use a dedicated threadpool. If this is set to zero or less, it will use the default shared threadpool.","canReference":true,"default":null,"fieldName":"statefulReverseProxy.poolSize","hidden":false,"hideLabel":false,"label":"threadpool size","name":"poolSize","readonly":false,"renderStrategies":[],"type":"I","validators":[]},{"default":false,"fieldName":"statefulReverseProxy.nonReentrant","hidden":false,"hideLabel":false,"name":"nonReentrant","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.orchestratorName","hidden":false,"hideLabel":false,"name":"orchestratorName","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":false,"fieldName":"statefulReverseProxy.immediatelyConsumeStream","hidden":false,"hideLabel":false,"name":"immediatelyConsumeStream","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"bindingHint":"If this trigger is set to use a dedicated threadpool (using the poolSize attribute), then this name will override which threadpool this trigger uses. By default, triggers using dedicated threadpools will use a threadpool each, but if you set multiple triggers with the same name and pool size, they will share that pool.","canReference":true,"default":null,"fieldName":"statefulReverseProxy.sharedPoolName","hidden":false,"hideLabel":false,"label":"shared threadpool","name":"sharedPoolName","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":["JSESSIONID_"],"fieldName":"statefulReverseProxy.withheldCookiePrefixes","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.withheldCookiePrefixes.withheldCookiePrefixes","hidden":false,"hideLabel":false,"name":"withheldCookiePrefixes","readonly":false,"renderStrategies":[],"type":"S","validators":[]},"name":"withheldCookiePrefixes","readonly":false,"renderStrategies":[],"type":"A"},{"bindingHint":"Allow Stateful Behaviours to opt out of pinning dependent Flows into memory. By default Flows pinned to memory when referenced by a Stateful Behaviour. This option allows one to override the default behaviour.","default":true,"fieldName":"statefulReverseProxy.shouldPinFlows","hidden":false,"hideLabel":false,"name":"shouldPinFlows","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":"${generatedId}","fieldName":"statefulReverseProxy.id","hidden":false,"hideLabel":false,"name":"id","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":[],"fieldName":"statefulReverseProxy.withheldHeaders","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.withheldHeaders.withheldHeaders","hidden":false,"hideLabel":false,"name":"withheldHeaders","readonly":false,"renderStrategies":[],"type":"S","validators":[]},"name":"withheldHeaders","readonly":false,"renderStrategies":[],"type":"A"},{"bindingHint":"This is the order of startup when multiple stateful behaviours are being started at the same time. This is usually when a recipe is being run, or a bundle is being loaded, but is especially relevant when the server is being started.","default":400,"fieldName":"statefulReverseProxy.startupPriority","hidden":false,"hideLabel":false,"name":"startupPriority","readonly":false,"renderStrategies":[],"type":"I","validators":[{"max":449.0,"min":350.0,"rule":"numberRange"}]},{"default":null,"fieldName":"statefulReverseProxy.authenticationFlow","hidden":false,"hideLabel":false,"name":"authenticationFlow","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":443,"fieldName":"statefulReverseProxy.upstreamPort","hidden":false,"hideLabel":false,"name":"upstreamPort","readonly":false,"renderStrategies":[],"type":"I","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.runOnlyOnHosts","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.runOnlyOnHosts.runOnlyOnHosts","hidden":false,"hideLabel":false,"name":"runOnlyOnHosts","readonly":false,"renderStrategies":[],"type":"S","validators":[]},"name":"runOnlyOnHosts","readonly":false,"renderStrategies":[],"type":"A"},{"default":false,"fieldName":"statefulReverseProxy.isRunning","hidden":false,"hideLabel":false,"name":"isRunning","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":false,"fieldName":"statefulReverseProxy.killOnStop","hidden":false,"hideLabel":false,"name":"killOnStop","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"bindingHint":"If enabled, this trigger will use virtual threads. This confers a substantial performance benefit. When using virtual threads, all threadpool settings are ignored, and one virtual thread per task is automatically created. This is vastly more efficient and performant, with usually significantly lower latency, so this setting should only ever be switched off in very rare circumstances.","canReference":true,"default":true,"fieldName":"statefulReverseProxy.useVirtualThreads","hidden":false,"hideLabel":false,"label":"enableVirtualThreads","name":"useVirtualThreads","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":"https","fieldName":"statefulReverseProxy.upstreamScheme","hidden":false,"hideLabel":false,"name":"upstreamScheme","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"canReference":false,"default":180000,"fieldName":"statefulReverseProxy.orchestrationTimeout","hidden":false,"hideLabel":false,"label":"Orchestration Timeout","name":"orchestrationTimeout","readonly":false,"renderStrategies":[{"config":{"precision":3,"timeUnit":"ms"},"type":"valueAsTimeSpan"}],"type":"L","validators":[]},{"default":"statefulBehaviour","fieldName":"statefulReverseProxy.type","hidden":false,"hideLabel":false,"name":"type","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":[],"fieldName":"statefulReverseProxy.upstreamPath","hidden":false,"hideLabel":false,"itemType":{"default":null,"fieldName":"statefulReverseProxy.upstreamPath.upstreamPath","hidden":false,"hideLabel":false,"name":"upstreamPath","readonly":false,"renderStrategies":[],"type":"S","validators":[]},"name":"upstreamPath","readonly":false,"renderStrategies":[],"type":"A"},{"default":60000,"fieldName":"statefulReverseProxy.timeout","hidden":false,"hideLabel":false,"name":"timeout","readonly":false,"renderStrategies":[],"type":"L","validators":[]},{"default":true,"fieldName":"statefulReverseProxy.validateCertificates","hidden":false,"hideLabel":false,"name":"validateCertificates","readonly":false,"renderStrategies":[],"type":"B","validators":[]},{"default":null,"fieldName":"statefulReverseProxy.env","hidden":false,"hideLabel":false,"name":"env","readonly":false,"renderStrategies":[],"type":"S","validators":[]},{"default":true,"fieldName":"statefulReverseProxy.overrideHostHeader","hidden":false,"hideLabel":false,"name":"overrideHostHeader","readonly":false,"renderStrategies":[],"type":"B","validators":[]}],"hidden":false,"hideLabel":false,"label":"Triggerer Configuration","name":"statefulReverseProxy","readonly":false,"renderStrategies":[],"type":"O"}