├── .gitattributes ├── .github └── workflows │ ├── build-and-test.yml │ ├── codeql.yml │ ├── docker-publish.yml │ ├── maven-publish.yml │ ├── release-build.yml │ └── release-pr.yml ├── .gitignore ├── .run └── IDEStarter.run.xml ├── Dockerfile ├── LICENSE ├── README.md ├── annot ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── predic8 │ │ │ └── membrane │ │ │ └── annot │ │ │ ├── AbstractNamespaceHandler.java │ │ │ ├── AnnotUtils.java │ │ │ ├── MCAttribute.java │ │ │ ├── MCChildElement.java │ │ │ ├── MCElement.java │ │ │ ├── MCMain.java │ │ │ ├── MCOtherAttributes.java │ │ │ ├── MCTextContent.java │ │ │ ├── NamespaceUtil.java │ │ │ ├── ProcessingException.java │ │ │ ├── Required.java │ │ │ ├── SpringConfigurationXSDGeneratingAnnotationProcessor.java │ │ │ ├── bean │ │ │ └── MCUtil.java │ │ │ ├── generator │ │ │ ├── BlueprintParsers.java │ │ │ ├── HelpReference.java │ │ │ ├── NamespaceInfo.java │ │ │ ├── Parsers.java │ │ │ ├── Schemas.java │ │ │ └── kubernetes │ │ │ │ ├── AbstractK8sGenerator.java │ │ │ │ ├── JsonSchemaGenerator.java │ │ │ │ ├── K8sHelperGenerator.java │ │ │ │ ├── K8sYamlGenerator.java │ │ │ │ ├── KubernetesBootstrapper.java │ │ │ │ └── model │ │ │ │ ├── ISchema.java │ │ │ │ ├── Schema.java │ │ │ │ └── SchemaObject.java │ │ │ └── model │ │ │ ├── AbstractJavadocedInfo.java │ │ │ ├── AttributeInfo.java │ │ │ ├── ChildElementDeclarationInfo.java │ │ │ ├── ChildElementInfo.java │ │ │ ├── ElementInfo.java │ │ │ ├── MainInfo.java │ │ │ ├── Model.java │ │ │ ├── OtherAttributesInfo.java │ │ │ ├── TextContentInfo.java │ │ │ └── doc │ │ │ └── Doc.java │ └── resources │ │ └── META-INF │ │ └── services │ │ └── javax.annotation.processing.Processor │ └── test │ └── java │ └── com │ └── predic8 │ └── membrane │ └── annot │ └── AnnotUtilsTest.java ├── core ├── .factorypath ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── com │ │ │ ├── oracle │ │ │ │ └── util │ │ │ │ │ └── ssl │ │ │ │ │ ├── SSLCapabilities.java │ │ │ │ │ └── SSLExplorer.java │ │ │ └── predic8 │ │ │ │ └── membrane │ │ │ │ ├── balancer │ │ │ │ └── client │ │ │ │ │ └── LBNotificationClient.java │ │ │ │ └── core │ │ │ │ ├── Constants.java │ │ │ │ ├── DefaultConfig.java │ │ │ │ ├── FixedStreamReader.java │ │ │ │ ├── HotDeploymentThread.java │ │ │ │ ├── HttpRouter.java │ │ │ │ ├── Router.java │ │ │ │ ├── RoutingException.java │ │ │ │ ├── RuleManager.java │ │ │ │ ├── Statistics.java │ │ │ │ ├── TerminateException.java │ │ │ │ ├── azure │ │ │ │ ├── AzureDns.java │ │ │ │ ├── AzureIdentity.java │ │ │ │ ├── AzureTableStorage.java │ │ │ │ └── api │ │ │ │ │ ├── AzureApiClient.java │ │ │ │ │ ├── HttpClientConfigurable.java │ │ │ │ │ ├── auth │ │ │ │ │ └── AuthenticationApi.java │ │ │ │ │ ├── dns │ │ │ │ │ ├── DnsProvisionable.java │ │ │ │ │ ├── DnsRecordApi.java │ │ │ │ │ ├── DnsRecordCommandExecutor.java │ │ │ │ │ ├── DnsRecordType.java │ │ │ │ │ ├── SupportedDnsRecordType.java │ │ │ │ │ └── TxtRecordBuilder.java │ │ │ │ │ └── tablestorage │ │ │ │ │ ├── TableEntityCommandExecutor.java │ │ │ │ │ ├── TableStorageApi.java │ │ │ │ │ └── TableStorageCommandExecutor.java │ │ │ │ ├── beautifier │ │ │ │ └── JSONBeautifier.java │ │ │ │ ├── cli │ │ │ │ ├── CliCommand.java │ │ │ │ ├── MembraneCommandLine.java │ │ │ │ ├── MissingRequiredOptionException.java │ │ │ │ └── RouterCLI.java │ │ │ │ ├── cloud │ │ │ │ └── ExponentialBackoff.java │ │ │ │ ├── config │ │ │ │ ├── AbstractXmlElement.java │ │ │ │ ├── GenericComplexElement.java │ │ │ │ ├── Path.java │ │ │ │ ├── XMLElement.java │ │ │ │ ├── security │ │ │ │ │ ├── Blob.java │ │ │ │ │ ├── Certificate.java │ │ │ │ │ ├── Key.java │ │ │ │ │ ├── KeyGenerator.java │ │ │ │ │ ├── KeyStore.java │ │ │ │ │ ├── SSLParser.java │ │ │ │ │ ├── Store.java │ │ │ │ │ ├── Trust.java │ │ │ │ │ ├── TrustStore.java │ │ │ │ │ └── acme │ │ │ │ │ │ ├── Acme.java │ │ │ │ │ │ ├── AcmeSynchronizedStorage.java │ │ │ │ │ │ ├── AcmeValidation.java │ │ │ │ │ │ ├── DnsOperatorAcmeValidation.java │ │ │ │ │ │ ├── FileStorage.java │ │ │ │ │ │ ├── KubernetesStorage.java │ │ │ │ │ │ └── MemoryStorage.java │ │ │ │ └── spring │ │ │ │ │ ├── AbstractParser.java │ │ │ │ │ ├── BaseLocationApplicationContext.java │ │ │ │ │ ├── CheckableBeanFactory.java │ │ │ │ │ ├── NamespaceHandler.java │ │ │ │ │ ├── TrackingApplicationContext.java │ │ │ │ │ ├── TrackingFileSystemXmlApplicationContext.java │ │ │ │ │ └── k8s │ │ │ │ │ ├── Envelope.java │ │ │ │ │ └── YamlLoader.java │ │ │ │ ├── exceptions │ │ │ │ ├── ProblemDetails.java │ │ │ │ └── SpringConfigurationErrorHandler.java │ │ │ │ ├── exchange │ │ │ │ ├── AbstractExchange.java │ │ │ │ ├── Exchange.java │ │ │ │ ├── ExchangeComparator.java │ │ │ │ ├── ExchangeState.java │ │ │ │ ├── ExchangeValueRetriever.java │ │ │ │ ├── ExchangesUtil.java │ │ │ │ ├── accessors │ │ │ │ │ ├── ClientExchangeAccessor.java │ │ │ │ │ ├── DurationExchangeAccessor.java │ │ │ │ │ ├── ExchangeAccessor.java │ │ │ │ │ ├── MethodExchangeAccessor.java │ │ │ │ │ ├── PathExchangeAccessor.java │ │ │ │ │ ├── RequestContentLengthExchangeAccessor.java │ │ │ │ │ ├── RequestContentTypeExchangeAccessor.java │ │ │ │ │ ├── ResponseContentLengthExchangeAccessor.java │ │ │ │ │ ├── ResponseContentTypeExchangeAccessor.java │ │ │ │ │ ├── RuleExchangeAccessor.java │ │ │ │ │ ├── ServerExchangeAccessor.java │ │ │ │ │ ├── StatusCodeExchangeAccessor.java │ │ │ │ │ └── TimeExchangeAccessor.java │ │ │ │ └── snapshots │ │ │ │ │ ├── AbstractExchangeSnapshot.java │ │ │ │ │ ├── DynamicAbstractExchangeSnapshot.java │ │ │ │ │ ├── FakeKey.java │ │ │ │ │ ├── FakeProxy.java │ │ │ │ │ ├── MessageSnapshot.java │ │ │ │ │ ├── RequestSnapshot.java │ │ │ │ │ └── ResponseSnapshot.java │ │ │ │ ├── exchangestore │ │ │ │ ├── AbstractExchangeStore.java │ │ │ │ ├── AbstractPersistentExchangeStore.java │ │ │ │ ├── ClientStatistics.java │ │ │ │ ├── ClientStatisticsCollector.java │ │ │ │ ├── DepthWalker.java │ │ │ │ ├── ElasticSearchExchangeStore.java │ │ │ │ ├── ExchangeCollector.java │ │ │ │ ├── ExchangeQueryResult.java │ │ │ │ ├── ExchangeStore.java │ │ │ │ ├── FileExchangeStore.java │ │ │ │ ├── ForgetfulExchangeStore.java │ │ │ │ ├── LimitedMemoryExchangeStore.java │ │ │ │ ├── MemoryExchangeStore.java │ │ │ │ └── MongoDBExchangeStore.java │ │ │ │ ├── graphql │ │ │ │ ├── CountingReader.java │ │ │ │ ├── GraphQLOverHttpValidationException.java │ │ │ │ ├── GraphQLParser.java │ │ │ │ ├── GraphQLProtectionInterceptor.java │ │ │ │ ├── GraphQLValidator.java │ │ │ │ ├── GraphQLoverHttpValidator.java │ │ │ │ ├── ParserUtil.java │ │ │ │ ├── ParsingException.java │ │ │ │ ├── Tokenizer.java │ │ │ │ ├── blocklist │ │ │ │ │ ├── FeatureBlocklist.java │ │ │ │ │ └── filters │ │ │ │ │ │ ├── AllMutationsFilter.java │ │ │ │ │ │ ├── GraphQLFeatureFilter.java │ │ │ │ │ │ ├── IntrospectionFilter.java │ │ │ │ │ │ ├── MutationFilter.java │ │ │ │ │ │ └── SubscriptionFilter.java │ │ │ │ ├── model │ │ │ │ │ ├── Argument.java │ │ │ │ │ ├── BooleanValue.java │ │ │ │ │ ├── Definition.java │ │ │ │ │ ├── Directive.java │ │ │ │ │ ├── DirectiveDefinition.java │ │ │ │ │ ├── DirectiveLocation.java │ │ │ │ │ ├── EnumTypeDefinition.java │ │ │ │ │ ├── EnumValue.java │ │ │ │ │ ├── EnumValueDefinition.java │ │ │ │ │ ├── ExecutableDefinition.java │ │ │ │ │ ├── ExecutableDirectiveLocation.java │ │ │ │ │ ├── ExecutableDocument.java │ │ │ │ │ ├── Field.java │ │ │ │ │ ├── FieldDefinition.java │ │ │ │ │ ├── FloatValue.java │ │ │ │ │ ├── FragmentDefinition.java │ │ │ │ │ ├── FragmentSpread.java │ │ │ │ │ ├── InlineFragment.java │ │ │ │ │ ├── InputObjectTypeDefinition.java │ │ │ │ │ ├── InputValueDefinition.java │ │ │ │ │ ├── IntValue.java │ │ │ │ │ ├── InterfaceTypeDefinition.java │ │ │ │ │ ├── ListType.java │ │ │ │ │ ├── ListValue.java │ │ │ │ │ ├── NamedType.java │ │ │ │ │ ├── NullValue.java │ │ │ │ │ ├── ObjectField.java │ │ │ │ │ ├── ObjectTypeDefinition.java │ │ │ │ │ ├── ObjectValue.java │ │ │ │ │ ├── OperationDefinition.java │ │ │ │ │ ├── OperationType.java │ │ │ │ │ ├── RootOperationTypeDefinition.java │ │ │ │ │ ├── ScalarTypeDefinition.java │ │ │ │ │ ├── SchemaDefinition.java │ │ │ │ │ ├── Selection.java │ │ │ │ │ ├── StringValue.java │ │ │ │ │ ├── Type.java │ │ │ │ │ ├── TypeSystemDefinition.java │ │ │ │ │ ├── TypeSystemDirectiveLocation.java │ │ │ │ │ ├── TypeSystemDocument.java │ │ │ │ │ ├── UnionTypeDefinition.java │ │ │ │ │ ├── Value.java │ │ │ │ │ ├── Variable.java │ │ │ │ │ └── VariableDefinition.java │ │ │ │ └── package-info.java │ │ │ │ ├── http │ │ │ │ ├── AbstractBody.java │ │ │ │ ├── AbstractBodyTransferrer.java │ │ │ │ ├── AbstractMessageObserver.java │ │ │ │ ├── Body.java │ │ │ │ ├── BodyCollectingMessageObserver.java │ │ │ │ ├── BodyInputStream.java │ │ │ │ ├── Chunk.java │ │ │ │ ├── ChunkedBody.java │ │ │ │ ├── ChunkedBodyTransferrer.java │ │ │ │ ├── EmptyBody.java │ │ │ │ ├── Header.java │ │ │ │ ├── HeaderField.java │ │ │ │ ├── HeaderName.java │ │ │ │ ├── Message.java │ │ │ │ ├── MessageObserver.java │ │ │ │ ├── MimeType.java │ │ │ │ ├── NonRelevantBodyObserver.java │ │ │ │ ├── PlainBodyTransferrer.java │ │ │ │ ├── Request.java │ │ │ │ ├── Response.java │ │ │ │ ├── cookie │ │ │ │ │ ├── Ascii.java │ │ │ │ │ ├── ByteChunk.java │ │ │ │ │ ├── CookieSupport.java │ │ │ │ │ ├── Cookies.java │ │ │ │ │ ├── MessageBytes.java │ │ │ │ │ ├── MimeHeaders.java │ │ │ │ │ ├── ServerCookie.java │ │ │ │ │ └── StringCache.java │ │ │ │ └── xml │ │ │ │ │ ├── Component.java │ │ │ │ │ ├── Exchange.java │ │ │ │ │ ├── Header.java │ │ │ │ │ ├── Headers.java │ │ │ │ │ ├── Host.java │ │ │ │ │ ├── JSONBody.java │ │ │ │ │ ├── Message.java │ │ │ │ │ ├── Param.java │ │ │ │ │ ├── Path.java │ │ │ │ │ ├── PlainBody.java │ │ │ │ │ ├── Port.java │ │ │ │ │ ├── Query.java │ │ │ │ │ ├── Request.java │ │ │ │ │ ├── Response.java │ │ │ │ │ ├── URI.java │ │ │ │ │ └── XMLBody.java │ │ │ │ ├── interceptor │ │ │ │ ├── AbstractInterceptor.java │ │ │ │ ├── AbstractInterceptorWithSession.java │ │ │ │ ├── AcmeHttpChallengeInterceptor.java │ │ │ │ ├── ApisJsonInterceptor.java │ │ │ │ ├── AuthHead2BodyInterceptor.java │ │ │ │ ├── CountInterceptor.java │ │ │ │ ├── DispatchingInterceptor.java │ │ │ │ ├── EchoInterceptor.java │ │ │ │ ├── ExchangeStoreInterceptor.java │ │ │ │ ├── FlowController.java │ │ │ │ ├── GlobalInterceptor.java │ │ │ │ ├── HTTPClientInterceptor.java │ │ │ │ ├── HeaderFilterInterceptor.java │ │ │ │ ├── IndexInterceptor.java │ │ │ │ ├── Interceptor.java │ │ │ │ ├── InterceptorUtil.java │ │ │ │ ├── InternalRoutingInterceptor.java │ │ │ │ ├── LimitInterceptor.java │ │ │ │ ├── LoggingContextInterceptor.java │ │ │ │ ├── MessageAnalyser.java │ │ │ │ ├── MethodOverrideInterceptor.java │ │ │ │ ├── Outcome.java │ │ │ │ ├── RegExReplaceInterceptor.java │ │ │ │ ├── RelocatingInterceptor.java │ │ │ │ ├── RuleMatchingInterceptor.java │ │ │ │ ├── SpringInterceptor.java │ │ │ │ ├── ThrottleInterceptor.java │ │ │ │ ├── URLNormalizerInterceptor.java │ │ │ │ ├── UserFeatureInterceptor.java │ │ │ │ ├── WADLInterceptor.java │ │ │ │ ├── WSDLInterceptor.java │ │ │ │ ├── acl │ │ │ │ │ ├── AbstractClientAddress.java │ │ │ │ │ ├── AccessControl.java │ │ │ │ │ ├── AccessControlInterceptor.java │ │ │ │ │ ├── Any.java │ │ │ │ │ ├── Clients.java │ │ │ │ │ ├── Hostname.java │ │ │ │ │ ├── Ip.java │ │ │ │ │ ├── ParseType.java │ │ │ │ │ ├── Resource.java │ │ │ │ │ ├── TypeMatcher.java │ │ │ │ │ └── matchers │ │ │ │ │ │ ├── Cidr │ │ │ │ │ │ ├── CidrMatcher.java │ │ │ │ │ │ └── IpRange.java │ │ │ │ │ │ ├── GlobMatcher.java │ │ │ │ │ │ └── RegexMatcher.java │ │ │ │ ├── addHeader.java │ │ │ │ ├── adminApi │ │ │ │ │ ├── AdminApiInterceptor.java │ │ │ │ │ ├── AdminApiObserver.java │ │ │ │ │ ├── DiskWatcher.java │ │ │ │ │ ├── MemoryWatcher.java │ │ │ │ │ └── WebSocketExchangeWatcher.java │ │ │ │ ├── administration │ │ │ │ │ ├── AdminConsoleInterceptor.java │ │ │ │ │ ├── AdminPageBuilder.java │ │ │ │ │ ├── AdminRESTInterceptor.java │ │ │ │ │ ├── DynamicAdminPageInterceptor.java │ │ │ │ │ ├── Mapping.java │ │ │ │ │ ├── PropertyValueCollector.java │ │ │ │ │ └── RuleUtil.java │ │ │ │ ├── antivirus │ │ │ │ │ └── ClamAntiVirusInterceptor.java │ │ │ │ ├── apikey │ │ │ │ │ ├── ApiKeyUtils.java │ │ │ │ │ ├── ApiKeysInterceptor.java │ │ │ │ │ ├── extractors │ │ │ │ │ │ ├── ApiKeyExpressionExtractor.java │ │ │ │ │ │ ├── ApiKeyExtractor.java │ │ │ │ │ │ ├── ApiKeyHeaderExtractor.java │ │ │ │ │ │ ├── ApiKeyQueryParamExtractor.java │ │ │ │ │ │ └── LocationNameValue.java │ │ │ │ │ └── stores │ │ │ │ │ │ ├── ApiKeyFileStore.java │ │ │ │ │ │ ├── ApiKeyStore.java │ │ │ │ │ │ ├── JDBCApiKeyStore.java │ │ │ │ │ │ ├── KeyTable.java │ │ │ │ │ │ ├── MongoDBApiKeyStore.java │ │ │ │ │ │ ├── ScopeTable.java │ │ │ │ │ │ ├── TableName.java │ │ │ │ │ │ ├── UnauthorizedApiKeyException.java │ │ │ │ │ │ └── inConfig │ │ │ │ │ │ ├── Key.java │ │ │ │ │ │ ├── Scope.java │ │ │ │ │ │ └── SimpleKeyStore.java │ │ │ │ ├── authentication │ │ │ │ │ ├── BasicAuthenticationInterceptor.java │ │ │ │ │ ├── session │ │ │ │ │ │ ├── AccountBlocker.java │ │ │ │ │ │ ├── CachingUserDataProvider.java │ │ │ │ │ │ ├── CleanupThread.java │ │ │ │ │ │ ├── CustomStatementJdbcUserDataProvider.java │ │ │ │ │ │ ├── EmailTokenProvider.java │ │ │ │ │ │ ├── EmptyTokenProvider.java │ │ │ │ │ │ ├── FileUserDataProvider.java │ │ │ │ │ │ ├── JdbcUserDataProvider.java │ │ │ │ │ │ ├── JwtSessionManager.java │ │ │ │ │ │ ├── LDAPUserDataProvider.java │ │ │ │ │ │ ├── LoginDialog.java │ │ │ │ │ │ ├── LoginInterceptor.java │ │ │ │ │ │ ├── NumericTokenProvider.java │ │ │ │ │ │ ├── SMSTokenProvider.java │ │ │ │ │ │ ├── SessionManager.java │ │ │ │ │ │ ├── StaticUserDataProvider.java │ │ │ │ │ │ ├── TOTPTokenProvider.java │ │ │ │ │ │ ├── TelekomSMSTokenProvider.java │ │ │ │ │ │ ├── TokenProvider.java │ │ │ │ │ │ ├── UnifyingUserDataProvider.java │ │ │ │ │ │ ├── UserDataProvider.java │ │ │ │ │ │ ├── WhateverMobileSMSTokenProvider.java │ │ │ │ │ │ └── totp │ │ │ │ │ │ │ ├── Base32String.java │ │ │ │ │ │ │ ├── OtpProvider.java │ │ │ │ │ │ │ ├── PasscodeGenerator.java │ │ │ │ │ │ │ └── TotpCounter.java │ │ │ │ │ └── xen │ │ │ │ │ │ ├── CredentialAccessor.java │ │ │ │ │ │ ├── SessionIdAccessor.java │ │ │ │ │ │ ├── XenAuthenticationInterceptor.java │ │ │ │ │ │ ├── XenCredentialAccessor.java │ │ │ │ │ │ ├── XenMessageContext.java │ │ │ │ │ │ └── XenSessionIdAccessor.java │ │ │ │ ├── balancer │ │ │ │ │ ├── AbstractSessionIdExtractor.java │ │ │ │ │ ├── Balancer.java │ │ │ │ │ ├── BalancerUtil.java │ │ │ │ │ ├── ByThreadStrategy.java │ │ │ │ │ ├── Cluster.java │ │ │ │ │ ├── ClusterNotificationInterceptor.java │ │ │ │ │ ├── DispatchingStrategy.java │ │ │ │ │ ├── EmptyNodeListException.java │ │ │ │ │ ├── JSESSIONIDExtractor.java │ │ │ │ │ ├── LoadBalancingInterceptor.java │ │ │ │ │ ├── Node.java │ │ │ │ │ ├── NodeOnlineChecker.java │ │ │ │ │ ├── RoundRobinStrategy.java │ │ │ │ │ ├── Session.java │ │ │ │ │ ├── SessionCleanupThread.java │ │ │ │ │ ├── XMLElementSessionIdExtractor.java │ │ │ │ │ └── faultmonitoring │ │ │ │ │ │ ├── FaultMonitoringState.java │ │ │ │ │ │ ├── FaultMonitoringStrategy.java │ │ │ │ │ │ └── NodeFaultProfile.java │ │ │ │ ├── beautifier │ │ │ │ │ └── BeautifierInterceptor.java │ │ │ │ ├── cache │ │ │ │ │ ├── CacheInterceptor.java │ │ │ │ │ ├── NegativeNode.java │ │ │ │ │ ├── Node.java │ │ │ │ │ └── PositiveNode.java │ │ │ │ ├── chain │ │ │ │ │ ├── ChainDef.java │ │ │ │ │ └── ChainInterceptor.java │ │ │ │ ├── cors │ │ │ │ │ └── CorsInterceptor.java │ │ │ │ ├── flow │ │ │ │ │ ├── AbortInterceptor.java │ │ │ │ │ ├── AbstractFlowInterceptor.java │ │ │ │ │ ├── CallInterceptor.java │ │ │ │ │ ├── DestinationInterceptor.java │ │ │ │ │ ├── ForInterceptor.java │ │ │ │ │ ├── IfInterceptor.java │ │ │ │ │ ├── RequestInterceptor.java │ │ │ │ │ ├── ResponseInterceptor.java │ │ │ │ │ ├── ReturnInterceptor.java │ │ │ │ │ └── choice │ │ │ │ │ │ ├── Case.java │ │ │ │ │ │ ├── ChooseInterceptor.java │ │ │ │ │ │ ├── InterceptorContainer.java │ │ │ │ │ │ └── Otherwise.java │ │ │ │ ├── formvalidation │ │ │ │ │ └── FormValidationInterceptor.java │ │ │ │ ├── grease │ │ │ │ │ ├── GreaseInterceptor.java │ │ │ │ │ └── strategies │ │ │ │ │ │ ├── Greaser.java │ │ │ │ │ │ └── JsonGrease.java │ │ │ │ ├── groovy │ │ │ │ │ ├── GroovyInterceptor.java │ │ │ │ │ └── GroovyTemplateInterceptor.java │ │ │ │ ├── idempotency │ │ │ │ │ └── IdempotencyInterceptor.java │ │ │ │ ├── javascript │ │ │ │ │ ├── GraalVMJavascriptLanguageAdapter.java │ │ │ │ │ ├── JavascriptInterceptor.java │ │ │ │ │ ├── LanguageAdapter.java │ │ │ │ │ └── RhinoJavascriptLanguageAdapter.java │ │ │ │ ├── json │ │ │ │ │ ├── JsonProtectionException.java │ │ │ │ │ ├── JsonProtectionInterceptor.java │ │ │ │ │ └── ReplaceInterceptor.java │ │ │ │ ├── jwt │ │ │ │ │ ├── HeaderJwtRetriever.java │ │ │ │ │ ├── JWTException.java │ │ │ │ │ ├── JsonWebToken.java │ │ │ │ │ ├── Jwks.java │ │ │ │ │ ├── JwtAuthInterceptor.java │ │ │ │ │ ├── JwtRetriever.java │ │ │ │ │ └── JwtSignInterceptor.java │ │ │ │ ├── kubernetes │ │ │ │ │ ├── KubernetesValidationInterceptor.java │ │ │ │ │ └── model │ │ │ │ │ │ ├── AdmissionRequest.java │ │ │ │ │ │ ├── AdmissionResponse.java │ │ │ │ │ │ ├── AdmissionReview.java │ │ │ │ │ │ ├── JSONValidatorError.java │ │ │ │ │ │ └── ResponseStatus.java │ │ │ │ ├── lang │ │ │ │ │ ├── AbstractExchangeExpressionInterceptor.java │ │ │ │ │ ├── AbstractLanguageInterceptor.java │ │ │ │ │ ├── AbstractSetterInterceptor.java │ │ │ │ │ ├── Polyglot.java │ │ │ │ │ ├── SetHeaderInterceptor.java │ │ │ │ │ └── SetPropertyInterceptor.java │ │ │ │ ├── log │ │ │ │ │ ├── AccessLogInterceptor.java │ │ │ │ │ ├── AccessLogInterceptorService.java │ │ │ │ │ ├── AdditionalVariable.java │ │ │ │ │ └── LogInterceptor.java │ │ │ │ ├── ntlm │ │ │ │ │ ├── HeaderNTLMRetriever.java │ │ │ │ │ ├── NTLMRetriever.java │ │ │ │ │ └── NtlmInterceptor.java │ │ │ │ ├── oauth2 │ │ │ │ │ ├── BufferedJsonGenerator.java │ │ │ │ │ ├── ClaimList.java │ │ │ │ │ ├── ClaimRenamer.java │ │ │ │ │ ├── Client.java │ │ │ │ │ ├── ClientList.java │ │ │ │ │ ├── ConsentPageFile.java │ │ │ │ │ ├── CookieUtil.java │ │ │ │ │ ├── OAuth2AnswerParameters.java │ │ │ │ │ ├── OAuth2AuthorizationServerInterceptor.java │ │ │ │ │ ├── OAuth2Statistics.java │ │ │ │ │ ├── OAuth2TokenBody.java │ │ │ │ │ ├── OAuth2Util.java │ │ │ │ │ ├── ParamNames.java │ │ │ │ │ ├── SessionFinder.java │ │ │ │ │ ├── StaticClientList.java │ │ │ │ │ ├── TokenAuthorizationHeader.java │ │ │ │ │ ├── WellknownFile.java │ │ │ │ │ ├── authorizationservice │ │ │ │ │ │ ├── AuthorizationService.java │ │ │ │ │ │ ├── DynamicRegistration.java │ │ │ │ │ │ ├── GithubAuthorizationService.java │ │ │ │ │ │ ├── GoogleAuthorizationService.java │ │ │ │ │ │ ├── MembraneAuthorizationService.java │ │ │ │ │ │ └── MicrosoftEntraIDAuthorizationService.java │ │ │ │ │ ├── flows │ │ │ │ │ │ ├── CodeFlow.java │ │ │ │ │ │ ├── IdTokenTokenFlow.java │ │ │ │ │ │ ├── OAuth2Flow.java │ │ │ │ │ │ └── TokenFlow.java │ │ │ │ │ ├── parameter │ │ │ │ │ │ └── ClaimsParameter.java │ │ │ │ │ ├── processors │ │ │ │ │ │ ├── AuthEndpointProcessor.java │ │ │ │ │ │ ├── CertsEndpointProcessor.java │ │ │ │ │ │ ├── DefaultEndpointProcessor.java │ │ │ │ │ │ ├── EmptyEndpointProcessor.java │ │ │ │ │ │ ├── EndpointProcessor.java │ │ │ │ │ │ ├── FaviconEndpointProcessor.java │ │ │ │ │ │ ├── InvalidMethodProcessor.java │ │ │ │ │ │ ├── LoginDialogEndpointProcessor.java │ │ │ │ │ │ ├── OAuth2Processors.java │ │ │ │ │ │ ├── RevocationEndpointProcessor.java │ │ │ │ │ │ ├── TokenEndpointProcessor.java │ │ │ │ │ │ ├── UserinfoEndpointProcessor.java │ │ │ │ │ │ └── WellknownEndpointProcessor.java │ │ │ │ │ ├── request │ │ │ │ │ │ ├── AuthWithSessionRequest.java │ │ │ │ │ │ ├── AuthWithoutSessionRequest.java │ │ │ │ │ │ ├── NoResponse.java │ │ │ │ │ │ ├── ParameterizedRequest.java │ │ │ │ │ │ ├── UserinfoRequest.java │ │ │ │ │ │ └── tokenrequest │ │ │ │ │ │ │ ├── AuthorizationCodeFlow.java │ │ │ │ │ │ │ ├── CredentialsFlow.java │ │ │ │ │ │ │ ├── ErrorFlow.java │ │ │ │ │ │ │ ├── PasswordFlow.java │ │ │ │ │ │ │ ├── RefreshTokenFlow.java │ │ │ │ │ │ │ ├── TokenFlowDecider.java │ │ │ │ │ │ │ └── TokenRequest.java │ │ │ │ │ ├── tokengenerators │ │ │ │ │ │ ├── BearerJwtTokenGenerator.java │ │ │ │ │ │ ├── BearerTokenGenerator.java │ │ │ │ │ │ ├── JwtGenerator.java │ │ │ │ │ │ └── TokenGenerator.java │ │ │ │ │ └── tokenvalidation │ │ │ │ │ │ └── OAuth2TokenValidatorInterceptor.java │ │ │ │ ├── oauth2client │ │ │ │ │ ├── CookieOriginialExchangeStore.java │ │ │ │ │ ├── FlowInitiator.java │ │ │ │ │ ├── LoginParameter.java │ │ │ │ │ ├── MemcachedOriginalExchangeStore.java │ │ │ │ │ ├── OAuth2PermissionCheckerInterceptor.java │ │ │ │ │ ├── OAuth2Resource2Interceptor.java │ │ │ │ │ ├── OriginalExchangeStore.java │ │ │ │ │ ├── RedisOriginalExchangeStore.java │ │ │ │ │ ├── RequireAuth.java │ │ │ │ │ ├── SessionOriginalExchangeStore.java │ │ │ │ │ ├── rf │ │ │ │ │ │ ├── FormPostGenerator.java │ │ │ │ │ │ ├── JsonUtils.java │ │ │ │ │ │ ├── LogHelper.java │ │ │ │ │ │ ├── OAuth2CallbackRequestHandler.java │ │ │ │ │ │ ├── OAuth2Exception.java │ │ │ │ │ │ ├── OAuth2Parameters.java │ │ │ │ │ │ ├── OAuth2TokenResponseBody.java │ │ │ │ │ │ ├── OAuthUtils.java │ │ │ │ │ │ ├── PKCEVerifier.java │ │ │ │ │ │ ├── PublicUrlManager.java │ │ │ │ │ │ ├── SessionAuthorizer.java │ │ │ │ │ │ ├── StateManager.java │ │ │ │ │ │ ├── TokenAuthenticator.java │ │ │ │ │ │ └── token │ │ │ │ │ │ │ ├── AccessTokenRefresher.java │ │ │ │ │ │ │ ├── AccessTokenRevalidator.java │ │ │ │ │ │ │ └── JWSSigner.java │ │ │ │ │ └── temp │ │ │ │ │ │ └── OAuth2Constants.java │ │ │ │ ├── oauth2server │ │ │ │ │ ├── Claim.java │ │ │ │ │ ├── Convert.java │ │ │ │ │ ├── LoginDialog2.java │ │ │ │ │ ├── LoginEndpoint.java │ │ │ │ │ ├── MembraneProvidedServices.java │ │ │ │ │ └── OAuth2AuthorizationServer2Interceptor.java │ │ │ │ ├── opentelemetry │ │ │ │ │ ├── HTTPTraceContextUtil.java │ │ │ │ │ ├── OpenTelemetryConfigurator.java │ │ │ │ │ ├── OpenTelemetryInterceptor.java │ │ │ │ │ └── exporter │ │ │ │ │ │ ├── OtelExporter.java │ │ │ │ │ │ └── OtlpExporter.java │ │ │ │ ├── prometheus │ │ │ │ │ └── PrometheusInterceptor.java │ │ │ │ ├── ratelimit │ │ │ │ │ ├── LazyRateLimit.java │ │ │ │ │ ├── RateLimitErrorHandling.java │ │ │ │ │ ├── RateLimitInterceptor.java │ │ │ │ │ └── RateLimitStrategy.java │ │ │ │ ├── registration │ │ │ │ │ ├── ErrorMessages.java │ │ │ │ │ ├── RegistrationInterceptor.java │ │ │ │ │ ├── SecurityUtils.java │ │ │ │ │ └── entity │ │ │ │ │ │ └── User.java │ │ │ │ ├── rest │ │ │ │ │ ├── HTTP2XMLInterceptor.java │ │ │ │ │ ├── JSONContent.java │ │ │ │ │ ├── QueryParameter.java │ │ │ │ │ ├── REST2SOAPInterceptor.java │ │ │ │ │ ├── RESTInterceptor.java │ │ │ │ │ ├── SOAP2RESTInterceptor.java │ │ │ │ │ ├── SOAPRESTHelper.java │ │ │ │ │ └── XML2HTTP.java │ │ │ │ ├── rewrite │ │ │ │ │ ├── ReverseProxyingInterceptor.java │ │ │ │ │ └── RewriteInterceptor.java │ │ │ │ ├── schemavalidation │ │ │ │ │ ├── AbstractMessageValidator.java │ │ │ │ │ ├── AbstractXMLSchemaValidator.java │ │ │ │ │ ├── JSONSchemaValidator.java │ │ │ │ │ ├── MessageValidator.java │ │ │ │ │ ├── SOAPXMLFilter.java │ │ │ │ │ ├── SchemaValidatorErrorHandler.java │ │ │ │ │ ├── SchematronValidator.java │ │ │ │ │ ├── ValidatorInterceptor.java │ │ │ │ │ ├── WSDLValidator.java │ │ │ │ │ └── XMLSchemaValidator.java │ │ │ │ ├── security │ │ │ │ │ └── PaddingHeaderInterceptor.java │ │ │ │ ├── server │ │ │ │ │ ├── WSDLPublisherInterceptor.java │ │ │ │ │ └── WebServerInterceptor.java │ │ │ │ ├── session │ │ │ │ │ ├── InMemorySessionManager.java │ │ │ │ │ ├── JwtSessionManager.java │ │ │ │ │ ├── MemcachedSessionManager.java │ │ │ │ │ ├── RedisSessionManager.java │ │ │ │ │ ├── Session.java │ │ │ │ │ └── SessionManager.java │ │ │ │ ├── shadowing │ │ │ │ │ └── ShadowingInterceptor.java │ │ │ │ ├── shutdown │ │ │ │ │ └── ShutdownInterceptor.java │ │ │ │ ├── soap │ │ │ │ │ ├── SampleSoapServiceInterceptor.java │ │ │ │ │ ├── SoapOperationExtractor.java │ │ │ │ │ └── WebServiceExplorerInterceptor.java │ │ │ │ ├── statistics │ │ │ │ │ ├── PropertyComparator.java │ │ │ │ │ ├── StatisticsCSVInterceptor.java │ │ │ │ │ ├── StatisticsJDBCInterceptor.java │ │ │ │ │ ├── StatisticsProvider.java │ │ │ │ │ └── util │ │ │ │ │ │ └── JDBCUtil.java │ │ │ │ ├── stomp │ │ │ │ │ └── STOMPClient.java │ │ │ │ ├── templating │ │ │ │ │ ├── SoapBodyTemplateInterceptor.java │ │ │ │ │ ├── StaticInterceptor.java │ │ │ │ │ └── TemplateInterceptor.java │ │ │ │ ├── testservice │ │ │ │ │ └── TestServiceInterceptor.java │ │ │ │ ├── tunnel │ │ │ │ │ ├── TCPInterceptor.java │ │ │ │ │ └── WebSocketInterceptor.java │ │ │ │ ├── ws_addressing │ │ │ │ │ ├── DecoupledEndpointRegistry.java │ │ │ │ │ ├── WsaEndpointRewriter.java │ │ │ │ │ └── WsaEndpointRewriterInterceptor.java │ │ │ │ ├── xml │ │ │ │ │ ├── Json2XmlInterceptor.java │ │ │ │ │ └── Xml2JsonInterceptor.java │ │ │ │ ├── xmlcontentfilter │ │ │ │ │ ├── SOAPStackTraceFilterInterceptor.java │ │ │ │ │ ├── SimpleXPathAnalyzer.java │ │ │ │ │ ├── SimpleXPathParser.java │ │ │ │ │ ├── XMLContentFilter.java │ │ │ │ │ ├── XMLContentFilterInterceptor.java │ │ │ │ │ └── XMLElementFinder.java │ │ │ │ ├── xmlprotection │ │ │ │ │ ├── XMLProtectionException.java │ │ │ │ │ ├── XMLProtectionInterceptor.java │ │ │ │ │ └── XMLProtector.java │ │ │ │ └── xslt │ │ │ │ │ ├── XSLTInterceptor.java │ │ │ │ │ └── XSLTTransformer.java │ │ │ │ ├── jmx │ │ │ │ ├── JmxExporter.java │ │ │ │ ├── JmxRouter.java │ │ │ │ └── JmxServiceProxy.java │ │ │ │ ├── kubernetes │ │ │ │ ├── Bean.java │ │ │ │ ├── BeanCache.java │ │ │ │ ├── BeanDefinition.java │ │ │ │ ├── BeanRegistry.java │ │ │ │ ├── GenericYamlParser.java │ │ │ │ ├── KubernetesSchemaResolver.java │ │ │ │ ├── KubernetesWatcher.java │ │ │ │ ├── ParserHelper.java │ │ │ │ └── client │ │ │ │ │ ├── HttpException.java │ │ │ │ │ ├── KubernetesApiException.java │ │ │ │ │ ├── KubernetesClient.java │ │ │ │ │ ├── KubernetesClientBuilder.java │ │ │ │ │ ├── KubernetesClientFactory.java │ │ │ │ │ ├── Schema.java │ │ │ │ │ ├── WatchAction.java │ │ │ │ │ └── Watcher.java │ │ │ │ ├── lang │ │ │ │ ├── AbstractExchangeExpression.java │ │ │ │ ├── AbstractScriptInterceptor.java │ │ │ │ ├── ExchangeExpression.java │ │ │ │ ├── ExchangeExpressionException.java │ │ │ │ ├── LanguageSupport.java │ │ │ │ ├── ScriptExecutorPool.java │ │ │ │ ├── ScriptingUtils.java │ │ │ │ ├── TemplateExchangeExpression.java │ │ │ │ ├── groovy │ │ │ │ │ ├── GroovyExchangeExpression.java │ │ │ │ │ ├── GroovyLanguageSupport.java │ │ │ │ │ └── PathParametersMap.java │ │ │ │ ├── javascript │ │ │ │ │ ├── GraalVMJavascriptSupport.java │ │ │ │ │ └── RhinoJavascriptLanguageSupport.java │ │ │ │ ├── jsonpath │ │ │ │ │ └── JsonpathExchangeExpression.java │ │ │ │ ├── spel │ │ │ │ │ ├── AwareExchangePropertyAccessor.java │ │ │ │ │ ├── SpELExchangeEvaluationContext.java │ │ │ │ │ ├── SpELExchangeExpression.java │ │ │ │ │ ├── functions │ │ │ │ │ │ ├── BuildInFunctionException.java │ │ │ │ │ │ ├── BuiltInFunctionResolver.java │ │ │ │ │ │ ├── BuiltInFunctions.java │ │ │ │ │ │ └── ReflectiveMethodHandler.java │ │ │ │ │ ├── spelable │ │ │ │ │ │ ├── SpELBody.java │ │ │ │ │ │ ├── SpELHeader.java │ │ │ │ │ │ ├── SpELLablePropertyAware.java │ │ │ │ │ │ ├── SpELMap.java │ │ │ │ │ │ ├── SpELMessageWrapper.java │ │ │ │ │ │ ├── SpELPathParameters.java │ │ │ │ │ │ ├── SpELProperties.java │ │ │ │ │ │ └── SpeLJwtClaims.java │ │ │ │ │ └── typeconverters │ │ │ │ │ │ ├── SpELBodyToStringTypeConverter.java │ │ │ │ │ │ ├── SpELHeaderToStringTypeConverter.java │ │ │ │ │ │ └── SpELMapToStringTypeConverter.java │ │ │ │ └── xpath │ │ │ │ │ └── XPathExchangeExpression.java │ │ │ │ ├── model │ │ │ │ ├── AbstractExchangeViewerListener.java │ │ │ │ ├── IExchangeViewerListener.java │ │ │ │ ├── IExchangesStoreListener.java │ │ │ │ ├── IPortChangeListener.java │ │ │ │ └── IRuleChangeListener.java │ │ │ │ ├── multipart │ │ │ │ ├── Part.java │ │ │ │ └── XOPReconstitutor.java │ │ │ │ ├── openapi │ │ │ │ ├── OpenAPIParsingException.java │ │ │ │ ├── OpenAPIValidator.java │ │ │ │ ├── model │ │ │ │ │ ├── Body.java │ │ │ │ │ ├── InputStreamBody.java │ │ │ │ │ ├── JsonBody.java │ │ │ │ │ ├── Message.java │ │ │ │ │ ├── NoBody.java │ │ │ │ │ ├── Request.java │ │ │ │ │ ├── Response.java │ │ │ │ │ └── StringBody.java │ │ │ │ ├── serviceproxy │ │ │ │ │ ├── APIProxy.java │ │ │ │ │ ├── APIProxyKey.java │ │ │ │ │ ├── ApiDocsInterceptor.java │ │ │ │ │ ├── DuplicatePathException.java │ │ │ │ │ ├── OpenAPIInterceptor.java │ │ │ │ │ ├── OpenAPIPublisher.java │ │ │ │ │ ├── OpenAPIPublisherInterceptor.java │ │ │ │ │ ├── OpenAPIRecord.java │ │ │ │ │ ├── OpenAPIRecordFactory.java │ │ │ │ │ ├── OpenAPISpec.java │ │ │ │ │ ├── Rewrite.java │ │ │ │ │ ├── ValidationStatisticsCollector.java │ │ │ │ │ └── ValidationStatsKey.java │ │ │ │ ├── util │ │ │ │ │ ├── MethodNotAllowException.java │ │ │ │ │ ├── ObjectHolder.java │ │ │ │ │ ├── OpenAPIUtil.java │ │ │ │ │ ├── PathDoesNotMatchException.java │ │ │ │ │ ├── SchemaUtil.java │ │ │ │ │ ├── UriTemplateMatcher.java │ │ │ │ │ ├── UriUtil.java │ │ │ │ │ └── Utils.java │ │ │ │ └── validators │ │ │ │ │ ├── AbstractBodyValidator.java │ │ │ │ │ ├── AbstractParameterValidator.java │ │ │ │ │ ├── AllOfValidator.java │ │ │ │ │ ├── AnyOfValidator.java │ │ │ │ │ ├── ArrayValidator.java │ │ │ │ │ ├── BooleanValidator.java │ │ │ │ │ ├── IJSONSchemaValidator.java │ │ │ │ │ ├── IntegerValidator.java │ │ │ │ │ ├── NotValidator.java │ │ │ │ │ ├── NumberRestrictionValidator.java │ │ │ │ │ ├── NumberValidator.java │ │ │ │ │ ├── ObjectValidator.java │ │ │ │ │ ├── OneOfValidator.java │ │ │ │ │ ├── OperationValidator.java │ │ │ │ │ ├── PathParametersValidator.java │ │ │ │ │ ├── QueryParameterValidator.java │ │ │ │ │ ├── RequestBodyValidator.java │ │ │ │ │ ├── RequestHeaderParameterValidator.java │ │ │ │ │ ├── ResponseBodyValidator.java │ │ │ │ │ ├── ResponseHeaderValidator.java │ │ │ │ │ ├── SchemaValidator.java │ │ │ │ │ ├── SecurityValidator.java │ │ │ │ │ ├── StringRestrictionValidator.java │ │ │ │ │ ├── StringValidator.java │ │ │ │ │ ├── ValidationContext.java │ │ │ │ │ ├── ValidationError.java │ │ │ │ │ └── ValidationErrors.java │ │ │ │ ├── proxies │ │ │ │ ├── AbstractProxy.java │ │ │ │ ├── AbstractRuleKey.java │ │ │ │ ├── AbstractServiceProxy.java │ │ │ │ ├── InternalProxy.java │ │ │ │ ├── InternalProxyKey.java │ │ │ │ ├── NotPortOpeningProxy.java │ │ │ │ ├── NullProxy.java │ │ │ │ ├── Proxy.java │ │ │ │ ├── ProxyDisplayInfo.java │ │ │ │ ├── ProxyRule.java │ │ │ │ ├── ProxyRuleKey.java │ │ │ │ ├── RuleKey.java │ │ │ │ ├── SOAPProxy.java │ │ │ │ ├── SOAPProxyMultipleServicesException.java │ │ │ │ ├── SSLProxy.java │ │ │ │ ├── SSLableProxy.java │ │ │ │ ├── STOMPProxy.java │ │ │ │ ├── ServiceProxy.java │ │ │ │ ├── ServiceProxyKey.java │ │ │ │ ├── StatisticCollector.java │ │ │ │ └── TimeCollector.java │ │ │ │ ├── resolver │ │ │ │ ├── ClasspathSchemaResolver.java │ │ │ │ ├── FileSchemaResolver.java │ │ │ │ ├── HTTPSchemaResolver.java │ │ │ │ ├── Resolver.java │ │ │ │ ├── ResolverMap.java │ │ │ │ ├── ResourceRetrievalException.java │ │ │ │ ├── RuleResolver.java │ │ │ │ └── SchemaResolver.java │ │ │ │ ├── security │ │ │ │ ├── AbstractSecurityScheme.java │ │ │ │ ├── ApiKeySecurityScheme.java │ │ │ │ ├── BasicHttpSecurityScheme.java │ │ │ │ ├── BearerHttpSecurityScheme.java │ │ │ │ ├── HttpSecurityScheme.java │ │ │ │ ├── JWTSecurityScheme.java │ │ │ │ ├── KeyStoreUtil.java │ │ │ │ ├── OAuth2SecurityScheme.java │ │ │ │ └── SecurityScheme.java │ │ │ │ ├── sslinterceptor │ │ │ │ ├── GateKeeperClientInterceptor.java │ │ │ │ ├── RouterIpResolverInterceptor.java │ │ │ │ └── SSLInterceptor.java │ │ │ │ ├── stats │ │ │ │ └── RuleStatisticCollector.java │ │ │ │ ├── transport │ │ │ │ ├── PortOccupiedException.java │ │ │ │ ├── Transport.java │ │ │ │ ├── TrustManagerWrapper.java │ │ │ │ ├── http │ │ │ │ │ ├── AbortException.java │ │ │ │ │ ├── AbstractHttpHandler.java │ │ │ │ │ ├── ByteStreamLogging.java │ │ │ │ │ ├── Connection.java │ │ │ │ │ ├── ConnectionKey.java │ │ │ │ │ ├── ConnectionManager.java │ │ │ │ │ ├── EOFWhileReadingFirstLineException.java │ │ │ │ │ ├── EOFWhileReadingLineException.java │ │ │ │ │ ├── FakeHttpHandler.java │ │ │ │ │ ├── HostColonPort.java │ │ │ │ │ ├── HttpClient.java │ │ │ │ │ ├── HttpClientFactory.java │ │ │ │ │ ├── HttpClientStatusEventBus.java │ │ │ │ │ ├── HttpClientStatusEventListener.java │ │ │ │ │ ├── HttpEndpointListener.java │ │ │ │ │ ├── HttpResendHandler.java │ │ │ │ │ ├── HttpServerHandler.java │ │ │ │ │ ├── HttpServerThreadFactory.java │ │ │ │ │ ├── HttpTransport.java │ │ │ │ │ ├── IpPort.java │ │ │ │ │ ├── LineTooLongException.java │ │ │ │ │ ├── NoMoreRequestsException.java │ │ │ │ │ ├── NoResponseException.java │ │ │ │ │ ├── ProtocolUpgradeDeniedException.java │ │ │ │ │ ├── StreamPump.java │ │ │ │ │ ├── TwoWayStreaming.java │ │ │ │ │ ├── WebSocketStreamPump.java │ │ │ │ │ └── client │ │ │ │ │ │ ├── AuthenticationConfiguration.java │ │ │ │ │ │ ├── ConnectionConfiguration.java │ │ │ │ │ │ ├── HttpClientConfiguration.java │ │ │ │ │ │ └── ProxyConfiguration.java │ │ │ │ ├── http2 │ │ │ │ │ ├── FlowControl.java │ │ │ │ │ ├── FrameProducer.java │ │ │ │ │ ├── FrameSender.java │ │ │ │ │ ├── Http2Client.java │ │ │ │ │ ├── Http2ClientPool.java │ │ │ │ │ ├── Http2ExchangeHandler.java │ │ │ │ │ ├── Http2Logic.java │ │ │ │ │ ├── Http2MessageHandler.java │ │ │ │ │ ├── Http2ServerHandler.java │ │ │ │ │ ├── Http2TlsSupport.java │ │ │ │ │ ├── PeerFlowControl.java │ │ │ │ │ ├── PriorityTree.java │ │ │ │ │ ├── Settings.java │ │ │ │ │ ├── StreamInfo.java │ │ │ │ │ ├── StreamState.java │ │ │ │ │ └── frame │ │ │ │ │ │ ├── ContinuationFrame.java │ │ │ │ │ │ ├── DataFrame.java │ │ │ │ │ │ ├── Error.java │ │ │ │ │ │ ├── FatalConnectionException.java │ │ │ │ │ │ ├── Frame.java │ │ │ │ │ │ ├── GoawayFrame.java │ │ │ │ │ │ ├── HeaderBlockFragment.java │ │ │ │ │ │ ├── HeadersFrame.java │ │ │ │ │ │ ├── PingFrame.java │ │ │ │ │ │ ├── PriorityFrame.java │ │ │ │ │ │ ├── PushPromiseFrame.java │ │ │ │ │ │ ├── RstStreamFrame.java │ │ │ │ │ │ ├── SettingsFrame.java │ │ │ │ │ │ ├── StreamEnd.java │ │ │ │ │ │ └── WindowUpdateFrame.java │ │ │ │ ├── ssl │ │ │ │ │ ├── AcmeSSLContext.java │ │ │ │ │ ├── GeneratingSSLContext.java │ │ │ │ │ ├── PEMSupport.java │ │ │ │ │ ├── SSLContext.java │ │ │ │ │ ├── SSLContextCollection.java │ │ │ │ │ ├── SSLExchange.java │ │ │ │ │ ├── SSLProvider.java │ │ │ │ │ ├── StaticSSLContext.java │ │ │ │ │ ├── TLSError.java │ │ │ │ │ ├── TLSUnrecognizedNameException.java │ │ │ │ │ └── acme │ │ │ │ │ │ ├── AcmeAzureTableApiStorageEngine.java │ │ │ │ │ │ ├── AcmeClient.java │ │ │ │ │ │ ├── AcmeErrorLog.java │ │ │ │ │ │ ├── AcmeException.java │ │ │ │ │ │ ├── AcmeFileStorageEngine.java │ │ │ │ │ │ ├── AcmeKeyCert.java │ │ │ │ │ │ ├── AcmeKeyPair.java │ │ │ │ │ │ ├── AcmeKubernetesStorageEngine.java │ │ │ │ │ │ ├── AcmeMemoryStorageEngine.java │ │ │ │ │ │ ├── AcmeRenewal.java │ │ │ │ │ │ ├── AcmeSynchronizedStorageEngine.java │ │ │ │ │ │ ├── Authorization.java │ │ │ │ │ │ ├── Challenge.java │ │ │ │ │ │ ├── FatalAcmeException.java │ │ │ │ │ │ ├── Identifier.java │ │ │ │ │ │ ├── Order.java │ │ │ │ │ │ └── OrderAndLocation.java │ │ │ │ └── ws │ │ │ │ │ ├── WebSocketConnection.java │ │ │ │ │ ├── WebSocketConnectionCollection.java │ │ │ │ │ ├── WebSocketFrame.java │ │ │ │ │ ├── WebSocketFrameAssembler.java │ │ │ │ │ ├── WebSocketInterceptorInterface.java │ │ │ │ │ ├── WebSocketSender.java │ │ │ │ │ └── interceptors │ │ │ │ │ ├── WebSocketLogInterceptor.java │ │ │ │ │ ├── WebSocketSpringInterceptor.java │ │ │ │ │ └── WebSocketStompReassembler.java │ │ │ │ ├── util │ │ │ │ ├── ByteUtil.java │ │ │ │ ├── ClassFinder.java │ │ │ │ ├── CollectionsUtil.java │ │ │ │ ├── ComparatorFactory.java │ │ │ │ ├── ConfigurationException.java │ │ │ │ ├── ContentTypeDetector.java │ │ │ │ ├── DNSCache.java │ │ │ │ ├── DateAndTimeUtil.java │ │ │ │ ├── EndOfStreamException.java │ │ │ │ ├── ExceptionUtil.java │ │ │ │ ├── FileUtil.java │ │ │ │ ├── HttpUtil.java │ │ │ │ ├── LSInputImpl.java │ │ │ │ ├── MapNamespaceContext.java │ │ │ │ ├── MediaTypeUtil.java │ │ │ │ ├── MemcachedConnector.java │ │ │ │ ├── MessageUtil.java │ │ │ │ ├── NetworkUtil.java │ │ │ │ ├── OSUtil.java │ │ │ │ ├── Pair.java │ │ │ │ ├── RedisConnector.java │ │ │ │ ├── SOAPUtil.java │ │ │ │ ├── StringUtil.java │ │ │ │ ├── TextUtil.java │ │ │ │ ├── Timer.java │ │ │ │ ├── TimerManager.java │ │ │ │ ├── URI.java │ │ │ │ ├── URIFactory.java │ │ │ │ ├── URIUtil.java │ │ │ │ ├── URLParamUtil.java │ │ │ │ ├── URLUtil.java │ │ │ │ ├── Util.java │ │ │ │ ├── WSDLUtil.java │ │ │ │ ├── XMLUtil.java │ │ │ │ ├── functionalInterfaces │ │ │ │ │ └── ExceptionThrowingConsumer.java │ │ │ │ ├── jdbc │ │ │ │ │ └── AbstractJdbcSupport.java │ │ │ │ └── xml │ │ │ │ │ └── NodeListWrapper.java │ │ │ │ └── ws │ │ │ │ ├── magic │ │ │ │ └── Magic.java │ │ │ │ └── relocator │ │ │ │ └── Relocator.java │ │ └── org │ │ │ ├── apache │ │ │ └── http │ │ │ │ └── impl │ │ │ │ └── auth │ │ │ │ └── NTLMEngineTrampoline.java │ │ │ └── brotli │ │ │ └── dec │ │ │ ├── BitReader.java │ │ │ ├── BrotliInputStream.java │ │ │ ├── BrotliRuntimeException.java │ │ │ ├── Context.java │ │ │ ├── Decode.java │ │ │ ├── Dictionary.java │ │ │ ├── DictionaryData.java │ │ │ ├── Huffman.java │ │ │ ├── State.java │ │ │ ├── Transform.java │ │ │ ├── Utils.java │ │ │ └── package-info.java │ └── resources │ │ ├── META-INF │ │ ├── spring.handlers │ │ └── spring.schemas │ │ ├── com.predic8.membrane.core.exchangestore │ │ └── mapping.json │ │ ├── com │ │ └── predic8 │ │ │ └── membrane │ │ │ └── core │ │ │ └── interceptor │ │ │ ├── administration │ │ │ └── docBase │ │ │ │ └── admin │ │ │ │ ├── css │ │ │ │ └── membrane.css │ │ │ │ ├── datatables │ │ │ │ ├── css │ │ │ │ │ ├── demo_page.css │ │ │ │ │ ├── demo_table.css │ │ │ │ │ ├── demo_table_jui.css │ │ │ │ │ ├── jquery.dataTables.css │ │ │ │ │ └── jquery.dataTables_themeroller.css │ │ │ │ └── js │ │ │ │ │ └── jquery.dataTables.min.js │ │ │ │ ├── formValidator │ │ │ │ ├── jquery.validationEngine-en.js │ │ │ │ ├── jquery.validationEngine.js │ │ │ │ └── validationEngine.jquery.css │ │ │ │ ├── images │ │ │ │ ├── download.png │ │ │ │ ├── spv-bottom.png │ │ │ │ ├── spv-middle.png │ │ │ │ └── spv-top.png │ │ │ │ ├── jquery-ui │ │ │ │ ├── css │ │ │ │ │ └── custom-theme │ │ │ │ │ │ ├── images │ │ │ │ │ │ ├── ui-bg_flat_55_999999_40x100.png │ │ │ │ │ │ ├── ui-bg_flat_75_aaaaaa_40x100.png │ │ │ │ │ │ ├── ui-bg_glass_45_0078ae_1x400.png │ │ │ │ │ │ ├── ui-bg_glass_55_f8da4e_1x400.png │ │ │ │ │ │ ├── ui-bg_glass_75_79c9ec_1x400.png │ │ │ │ │ │ ├── ui-bg_gloss-wave_45_e14f1c_500x100.png │ │ │ │ │ │ ├── ui-bg_gloss-wave_50_6eac2c_500x100.png │ │ │ │ │ │ ├── ui-bg_gloss-wave_75_2191c0_500x100.png │ │ │ │ │ │ ├── ui-bg_inset-hard_100_fcfdfd_1x100.png │ │ │ │ │ │ ├── ui-icons_0078ae_256x240.png │ │ │ │ │ │ ├── ui-icons_056b93_256x240.png │ │ │ │ │ │ ├── ui-icons_d8e7f3_256x240.png │ │ │ │ │ │ ├── ui-icons_e0fdff_256x240.png │ │ │ │ │ │ ├── ui-icons_f5e175_256x240.png │ │ │ │ │ │ ├── ui-icons_f7a50d_256x240.png │ │ │ │ │ │ └── ui-icons_fcd113_256x240.png │ │ │ │ │ │ ├── jquery-ui-1.13.2.custom.css │ │ │ │ │ │ ├── jquery-ui-1.13.2.custom.structure.css │ │ │ │ │ │ ├── jquery-ui-1.13.2.custom.theme.css │ │ │ │ │ │ └── jquery-ui-1.8.13.custom.css │ │ │ │ └── js │ │ │ │ │ └── jquery-ui-1.13.2.custom.min.js │ │ │ │ ├── jquery │ │ │ │ └── jquery-3.7.0.js │ │ │ │ └── js │ │ │ │ └── membrane.js │ │ │ ├── log │ │ │ └── logTemplate.json │ │ │ ├── rest │ │ │ └── xml2json.xsl │ │ │ ├── schemavalidation │ │ │ ├── conformance1-5.xsl │ │ │ └── skeleton1-5.xsl │ │ │ └── testservice │ │ │ └── the.wsdl │ │ ├── openapi │ │ ├── overview.html │ │ └── swagger-ui.html │ │ ├── test │ │ └── foo.bar │ │ └── wsdl │ │ └── city.wsdl │ └── test │ ├── java │ └── com │ │ └── predic8 │ │ └── membrane │ │ ├── AbstractTestWithRouter.java │ │ ├── AllTests.java │ │ ├── core │ │ ├── MockRouter.java │ │ ├── OpenApiRewriteIntegrationTest.java │ │ ├── RouterCLITest.java │ │ ├── RouterTest.java │ │ ├── RuleManagerTest.java │ │ ├── RuleManagerUriTemplateTest.java │ │ ├── SimpleTest.java │ │ ├── UnitTests.java │ │ ├── acl │ │ │ ├── ACLTest.java │ │ │ ├── AccessControlListForwardedTest.java │ │ │ └── AccessControlListTest.java │ │ ├── azure │ │ │ ├── AzureApiClientTest.java │ │ │ └── AzureDnsApiSimulator.java │ │ ├── cli │ │ │ └── CliCommandTest.java │ │ ├── config │ │ │ ├── ProxyTest.java │ │ │ ├── ReadRulesConfigurationTest.java │ │ │ ├── ReadRulesWithInterceptorsConfigurationTest.java │ │ │ └── SpringReferencesTest.java │ │ ├── exceptions │ │ │ └── ProblemDetailsTest.java │ │ ├── exchange │ │ │ └── ExchangesUtilTest.java │ │ ├── exchangestore │ │ │ ├── AbortExchangeTest.java │ │ │ ├── AbstractExchangeStoreTest.java │ │ │ ├── ElasticSearchExchangeStoreTest.java │ │ │ └── LimitedMemoryExchangeStoreTest.java │ │ ├── graphql │ │ │ ├── ExecutableDocumentsParsingTest.java │ │ │ ├── GraphQLProtectionInterceptorTest.java │ │ │ ├── GraphQLUtil.java │ │ │ ├── GraphQLoverHttpValidatorTest.java │ │ │ ├── TokenizerTest.java │ │ │ └── TypeSystemDocumentsParsingTest.java │ │ ├── http │ │ │ ├── BodyTest.java │ │ │ ├── BodyUtil.java │ │ │ ├── ChunkedBodyTest.java │ │ │ ├── ChunksBuilder.java │ │ │ ├── ChunksBuilderTest.java │ │ │ ├── HeaderNameTest.java │ │ │ ├── HeaderTest.java │ │ │ ├── Http10Test.java │ │ │ ├── Http11Test.java │ │ │ ├── MethodTest.java │ │ │ ├── MimeTypeTest.java │ │ │ ├── RequestBuilderTest.java │ │ │ ├── RequestTest.java │ │ │ ├── ResponseBuilderTest.java │ │ │ ├── ResponseTest.java │ │ │ └── cookie │ │ │ │ └── MessageBytesTest.java │ │ ├── interceptor │ │ │ ├── AdjustContentLengthTest.java │ │ │ ├── ApisJsonInterceptorTest.java │ │ │ ├── DispatchingInterceptorTest.java │ │ │ ├── EchoInterceptorTest.java │ │ │ ├── HTTPClientInterceptorTest.java │ │ │ ├── HeaderFilterInterceptorTest.java │ │ │ ├── IndexInterceptorTest.java │ │ │ ├── InterceptorInitADRTest.java │ │ │ ├── InterceptorTest.java │ │ │ ├── InternalInvocationTest.java │ │ │ ├── MessageAnalyserTest.java │ │ │ ├── MockInterceptor.java │ │ │ ├── RegExReplaceInterceptorTest.java │ │ │ ├── ThrottleInterceptorTest.java │ │ │ ├── ThrowablePrintStackTraceTest.java │ │ │ ├── UserFeatureTest.java │ │ │ ├── WADLInterceptorTest.java │ │ │ ├── WSDLInterceptorTest.java │ │ │ ├── acl │ │ │ │ ├── AccessControlParserTest.java │ │ │ │ ├── HostnameTest.java │ │ │ │ ├── ParseTypeTest.java │ │ │ │ └── matchers │ │ │ │ │ └── Cidr │ │ │ │ │ └── IpRangeTest.java │ │ │ ├── adminApi │ │ │ │ ├── AdminApiInterceptorTest.java │ │ │ │ └── NotifyingByteArrayOutputStream.java │ │ │ ├── apikey │ │ │ │ ├── ApiKeyUtilsTest.java │ │ │ │ ├── ApiKeysInterceptorTest.java │ │ │ │ ├── extractors │ │ │ │ │ ├── ApiKeyHeaderExtractorTest.java │ │ │ │ │ └── ApiKeyQueryParamExtractorTest.java │ │ │ │ └── stores │ │ │ │ │ ├── ApiKeyFileStoreTest.java │ │ │ │ │ └── inConfig │ │ │ │ │ └── SimpleKeyStoreTest.java │ │ │ ├── authentication │ │ │ │ ├── BasicAuthenticationInterceptorTest.java │ │ │ │ └── session │ │ │ │ │ ├── AccountBlockerTest.java │ │ │ │ │ └── StaticUserDataProviderTest.java │ │ │ ├── balancer │ │ │ │ ├── ClusterBalancerTest.java │ │ │ │ ├── ClusterManagerTest.java │ │ │ │ ├── ClusterNotificationInterceptorTest.java │ │ │ │ ├── JSESSIONIDExtractorTest.java │ │ │ │ ├── LoadBalancingWithClusterManagerAndNoSessionTest.java │ │ │ │ ├── LoadBalancingWithClusterManagerTest.java │ │ │ │ ├── NodeOnlineCheckerTest.java │ │ │ │ └── XMLSessionIdExtractorTest.java │ │ │ ├── beautifier │ │ │ │ ├── BeautifierInterceptorIntegrationTest.java │ │ │ │ └── BeautifierInterceptorTest.java │ │ │ ├── cors │ │ │ │ └── CorsInterceptorTest.java │ │ │ ├── flow │ │ │ │ ├── CallInterceptorTest.java │ │ │ │ ├── ChooseInterceptorTest.java │ │ │ │ ├── ConditionalEvaluationTestContext.java │ │ │ │ ├── IfInterceptorGroovyTest.java │ │ │ │ ├── IfInterceptorJsonpathTest.java │ │ │ │ ├── IfInterceptorSpELTest.java │ │ │ │ ├── IfInterceptorXPathTest.java │ │ │ │ └── invocation │ │ │ │ │ ├── AbstractInterceptorFlowTest.java │ │ │ │ │ ├── FlowTestInterceptors.java │ │ │ │ │ ├── InterceptorFlowTest.java │ │ │ │ │ ├── internalservice │ │ │ │ │ ├── AbortInResponseFlowInternalRoutingTest.java │ │ │ │ │ ├── AbortInternalRoutingTest.java │ │ │ │ │ ├── AbstractInternalServiceRoutingInterceptorTest.java │ │ │ │ │ ├── KeepPathInternalRoutingTest.java │ │ │ │ │ ├── OverwritePathInternalRoutingTest.java │ │ │ │ │ ├── RequestResponseInternalRoutingTest.java │ │ │ │ │ ├── ServiceCallsExternalInternalRoutingTest.java │ │ │ │ │ ├── ServiceCallsServiceInternalRoutingTest.java │ │ │ │ │ └── SimpleInternalRoutingTest.java │ │ │ │ │ └── testinterceptors │ │ │ │ │ ├── AbortFlowTestInterceptor.java │ │ │ │ │ ├── ExceptionTestInterceptor.java │ │ │ │ │ └── FlowTestInterceptor.java │ │ │ ├── formvalidation │ │ │ │ └── FormValidationInterceptorTest.java │ │ │ ├── grease │ │ │ │ ├── GreaseInterceptorTest.java │ │ │ │ └── strategies │ │ │ │ │ └── JsonGreaseTest.java │ │ │ ├── groovy │ │ │ │ └── GroovyInterceptorTest.java │ │ │ ├── idempotency │ │ │ │ └── IdempotencyInterceptorTest.java │ │ │ ├── javascript │ │ │ │ └── JavascriptInterceptorTest.java │ │ │ ├── json │ │ │ │ ├── JsonProtectionInterceptorTest.java │ │ │ │ └── ReplaceInterceptorTest.java │ │ │ ├── jwt │ │ │ │ ├── JwtAuthInterceptorTest.java │ │ │ │ └── JwtAuthInterceptorUnitTests.java │ │ │ ├── lang │ │ │ │ ├── AbstractSetHeaderInterceptorTest.java │ │ │ │ ├── AbstractSetPropertyInterceptorTest.java │ │ │ │ ├── ReturnInterceptorTest.java │ │ │ │ ├── SetHeaderInterceptorJsonpathTest.java │ │ │ │ ├── SetHeaderInterceptorSpELTest.java │ │ │ │ ├── SetPropertyInterceptorJsonpathTest.java │ │ │ │ └── SetPropertyInterceptorSpELTest.java │ │ │ ├── log │ │ │ │ ├── AccessLogInterceptorTest.java │ │ │ │ └── LogInterceptorTest.java │ │ │ ├── oauth2 │ │ │ │ ├── AuthWithSessionRequestJWTTest.java │ │ │ │ ├── AuthWithSessionRequestTest.java │ │ │ │ ├── AuthWithoutSessionOpenidRequestJWTTest.java │ │ │ │ ├── AuthWithoutSessionOpenidRequestTest.java │ │ │ │ ├── AuthWithoutSessionRequestJWTTest.java │ │ │ │ ├── AuthWithoutSessionRequestTest.java │ │ │ │ ├── BufferedJsonGeneratorTest.java │ │ │ │ ├── ClaimsParameterTest.java │ │ │ │ ├── EmptyEndpointJWTTest.java │ │ │ │ ├── EmptyEndpointOpenidJWTTest.java │ │ │ │ ├── EmptyEndpointOpenidTest.java │ │ │ │ ├── EmptyEndpointTest.java │ │ │ │ ├── OAuth2AuthorizationServerInterceptorBase.java │ │ │ │ ├── OAuth2AuthorizationServerInterceptorNormalJWTTest.java │ │ │ │ ├── OAuth2AuthorizationServerInterceptorNormalTest.java │ │ │ │ ├── OAuth2AuthorizationServerInterceptorOpenidJWTTest.java │ │ │ │ ├── OAuth2AuthorizationServerInterceptorOpenidTest.java │ │ │ │ ├── OAuth2RedirectFormPostTest.java │ │ │ │ ├── OAuth2RedirectNormalTest.java │ │ │ │ ├── OAuth2RedirectTest.java │ │ │ │ ├── OAuth2Test.java │ │ │ │ ├── OAuth2TestUtil.java │ │ │ │ ├── OAuth2UnitTests.java │ │ │ │ ├── OAuth2UtilTest.java │ │ │ │ ├── PasswordGrantJWTTest.java │ │ │ │ ├── PasswordGrantTest.java │ │ │ │ ├── RequestParameterizedTest.java │ │ │ │ ├── RevocationRequestJWTTest.java │ │ │ │ ├── RevocationRequestTest.java │ │ │ │ ├── TokenRequestJWTTest.java │ │ │ │ ├── TokenRequestTest.java │ │ │ │ ├── UserinfoRequestJWTTest.java │ │ │ │ ├── UserinfoRequestTest.java │ │ │ │ ├── WellknownFileTest.java │ │ │ │ └── client │ │ │ │ │ ├── AuthServerMock.java │ │ │ │ │ ├── BrowserMock.java │ │ │ │ │ ├── InMemSMOAuth2R2Test.java │ │ │ │ │ ├── JwtSMOAuth2R2Test.java │ │ │ │ │ ├── OAuth2ResourceErrorForwardingTest.java │ │ │ │ │ ├── OAuth2ResourceRpIniLogoutTest.java │ │ │ │ │ ├── OAuth2ResourceTest.java │ │ │ │ │ ├── SyncSMOAuth2R2Test.java │ │ │ │ │ └── b2c │ │ │ │ │ ├── B2CMembrane.java │ │ │ │ │ ├── B2CTestConfig.java │ │ │ │ │ ├── InMemB2CResourceTest.java │ │ │ │ │ ├── JwtB2CResourceTest.java │ │ │ │ │ ├── MockAuthorizationServer.java │ │ │ │ │ ├── OAuth2ResourceB2CTest.java │ │ │ │ │ └── SyncB2CResourceTest.java │ │ │ ├── oauth2client │ │ │ │ ├── OAuth2Resource2InterceptorTest.java │ │ │ │ └── rf │ │ │ │ │ └── token │ │ │ │ │ └── JWSSignerTest.java │ │ │ ├── opentelemetry │ │ │ │ └── OpenTelemetryInterceptorTest.java │ │ │ ├── ratelimit │ │ │ │ ├── LazyRateLimitTest.java │ │ │ │ └── RateLimitInterceptorTest.java │ │ │ ├── rest │ │ │ │ ├── HTTP2XMLInterceptorTest.java │ │ │ │ └── REST2SOAPInterceptorIntegrationTest.java │ │ │ ├── rewrite │ │ │ │ ├── ReverseProxyingInterceptorTest.java │ │ │ │ ├── RewriteInterceptorIntegrationTest.java │ │ │ │ ├── RewriteInterceptorTest.java │ │ │ │ └── RewriterTest.java │ │ │ ├── schemavalidation │ │ │ │ ├── JSONSchemaValidationTest.java │ │ │ │ ├── SOAPFaultTest.java │ │ │ │ ├── SOAPMessageValidatorInterceptorTest.java │ │ │ │ ├── SOAPUtilTest.java │ │ │ │ ├── ValidatorInterceptorTest.java │ │ │ │ ├── WSDLValidatorTest.java │ │ │ │ └── XMLSchemaValidatorTest.java │ │ │ ├── security │ │ │ │ └── PaddingHeaderInterceptorTest.java │ │ │ ├── server │ │ │ │ ├── WSDLPublisherInterceptorTest.java │ │ │ │ └── WebServerInterceptorTest.java │ │ │ ├── session │ │ │ │ ├── FakeSyncSessionStoreManager.java │ │ │ │ ├── MemcachedSessionManagerTest.java │ │ │ │ └── SessionInterceptorTest.java │ │ │ ├── shadowing │ │ │ │ └── ShadowingInterceptorTest.java │ │ │ ├── soap │ │ │ │ ├── SampleSoapInterceptorTest.java │ │ │ │ ├── SoapAndInternalProxyTest.java │ │ │ │ └── SoapOperationExtractorTest.java │ │ │ ├── templating │ │ │ │ ├── SoapBodyTemplateInterceptorTest.java │ │ │ │ ├── StaticInterceptorTest.java │ │ │ │ └── TemplateInterceptorTest.java │ │ │ ├── tunnel │ │ │ │ └── WebsocketStompTest.java │ │ │ ├── websocket │ │ │ │ └── WebSocketFrameTest.java │ │ │ ├── xml │ │ │ │ ├── Json2XmlInterceptorTest.java │ │ │ │ └── Xml2JsonInterceptorTest.java │ │ │ ├── xmlcontentfilter │ │ │ │ ├── SOAPStackTraceFilterTest.java │ │ │ │ ├── SimpleXPathAnalyzerTest.java │ │ │ │ ├── SimpleXPathParserTest.java │ │ │ │ ├── XMLContentFilterTest.java │ │ │ │ └── XMLElementFinderTest.java │ │ │ ├── xmlprotection │ │ │ │ ├── XMLProtectionInterceptorTest.java │ │ │ │ └── XMLProtectorTest.java │ │ │ └── xslt │ │ │ │ └── XSLTInterceptorTest.java │ │ ├── kubernetes │ │ │ └── client │ │ │ │ └── KubernetesClientTest.java │ │ ├── lang │ │ │ ├── AbstractExchangeExpressionTest.java │ │ │ ├── TemplateExchangeExpressionTest.java │ │ │ ├── groovy │ │ │ │ └── GroovyExchangeExpressionTest.java │ │ │ ├── jsonpath │ │ │ │ └── JsonpathExchangeExpressionTest.java │ │ │ ├── spel │ │ │ │ ├── SpELExchangeEvaluationContextTest.java │ │ │ │ ├── SpELExchangeExpressionTest.java │ │ │ │ ├── functions │ │ │ │ │ ├── BuiltInFunctionsTest.java │ │ │ │ │ └── ReflectiveMethodHandlerTest.java │ │ │ │ └── spelable │ │ │ │ │ └── SPeLablePropertyAwareTest.java │ │ │ └── xpath │ │ │ │ └── XPathExchangeExpressionTest.java │ │ ├── magic │ │ │ └── MagicTest.java │ │ ├── multipart │ │ │ └── ReassembleTest.java │ │ ├── openapi │ │ │ ├── OpenAPIValidatorTest.java │ │ │ ├── model │ │ │ │ ├── MessageTest.java │ │ │ │ ├── RequestTest.java │ │ │ │ └── ResponseTest.java │ │ │ ├── oas31 │ │ │ │ ├── ConstValueTest.java │ │ │ │ ├── ExclusiveMinMaxTest.java │ │ │ │ ├── NumberValidationTest.java │ │ │ │ ├── RequestReferenceTest.java │ │ │ │ ├── SimpleReferenceTest.java │ │ │ │ └── multipleTypes │ │ │ │ │ ├── MultipleTypesComplexTest.java │ │ │ │ │ ├── MultipleTypesDocumentTest.java │ │ │ │ │ ├── MultipleTypesNestedTest.java │ │ │ │ │ └── MultipleTypesTest.java │ │ │ ├── serviceproxy │ │ │ │ ├── APIProxyKeyComplexMatchTest.java │ │ │ │ ├── APIProxyOpenAPITest.java │ │ │ │ ├── APIProxySpringConfigurationTest.java │ │ │ │ ├── APIProxyTest.java │ │ │ │ ├── AbstractProxySpringConfigurationTest.java │ │ │ │ ├── ApiDocsInterceptorTest.java │ │ │ │ ├── OpenAPI31ReferencesTest.java │ │ │ │ ├── OpenAPI31Test.java │ │ │ │ ├── OpenAPIInterceptorTest.java │ │ │ │ ├── OpenAPIPublisherInterceptorTest.java │ │ │ │ ├── OpenAPIRecordFactoryTest.java │ │ │ │ ├── OpenAPIRecordTest.java │ │ │ │ ├── RewriteTest.java │ │ │ │ ├── Swagger20Test.java │ │ │ │ └── XMembraneExtensionSecurityTest.java │ │ │ ├── util │ │ │ │ ├── JsonUtil.java │ │ │ │ ├── OpenAPIUtilTest.java │ │ │ │ ├── TestUtils.java │ │ │ │ ├── UriTemplateMatcherTest.java │ │ │ │ ├── UriUtilTest.java │ │ │ │ ├── UtilsTest.java │ │ │ │ └── ValidationContextTest.java │ │ │ └── validators │ │ │ │ ├── AbstractParameterValidatorTest.java │ │ │ │ ├── AbstractValidatorTest.java │ │ │ │ ├── ArrayTest.java │ │ │ │ ├── BooleanTest.java │ │ │ │ ├── CompositionTest.java │ │ │ │ ├── ContentTypeWildcardTests.java │ │ │ │ ├── DefaultResponseTest.java │ │ │ │ ├── DiscriminatorTest.java │ │ │ │ ├── EnumTest.java │ │ │ │ ├── HeaderParameterTest.java │ │ │ │ ├── InputStreamBodyTest.java │ │ │ │ ├── IntegerTest.java │ │ │ │ ├── MimeTypesRequestResponseTest.java │ │ │ │ ├── MultipleContentTest.java │ │ │ │ ├── NestedObjectArrayTest.java │ │ │ │ ├── NullableTest.java │ │ │ │ ├── NumberTest.java │ │ │ │ ├── ObjectTest.java │ │ │ │ ├── OpenAPIValidatorJSONSchemaTest.java │ │ │ │ ├── OpenAPIValidatorObjectTest.java │ │ │ │ ├── PathParametersTest.java │ │ │ │ ├── QueryParameterValidatorTest.java │ │ │ │ ├── QueryParamsTest.java │ │ │ │ ├── ReadWriteOnlyTest.java │ │ │ │ ├── ReferencesRequestTest.java │ │ │ │ ├── ReferencesResponseTest.java │ │ │ │ ├── ReferencesTest.java │ │ │ │ ├── RequestsTest.java │ │ │ │ ├── RequiredTest.java │ │ │ │ ├── ResponseHeaderTest.java │ │ │ │ ├── ResponseTest.java │ │ │ │ ├── ResponsesTest.java │ │ │ │ ├── SchemaValidatorTest.java │ │ │ │ ├── StatuscodeWildcardsTest.java │ │ │ │ ├── StatuscodesTest.java │ │ │ │ ├── StringTest.java │ │ │ │ ├── exceptions │ │ │ │ └── ExceptionInterceptorTest.java │ │ │ │ └── security │ │ │ │ ├── AbstractSecurityValidatorTest.java │ │ │ │ ├── AndOrSecurityValidatorTest.java │ │ │ │ ├── ApiKeySecurityValidatorTest.java │ │ │ │ ├── BasicAuthSecurityValidationTest.java │ │ │ │ ├── JWTInterceptorAndSecurityValidatorTest.java │ │ │ │ ├── NoSecuritySchemesSecurityValidatorTest.java │ │ │ │ ├── OAuth2SecurityValidatorTest.java │ │ │ │ ├── OpenIdConnectSecurityValidatorTest.java │ │ │ │ ├── ScopesSecurityValidatorTest.java │ │ │ │ └── SecuritySchemesSecurityValidatorTest.java │ │ ├── proxies │ │ │ ├── APIProxyKeyTest.java │ │ │ ├── AbstractProxyTest.java │ │ │ ├── AbstractServiceProxyTest.java │ │ │ ├── InternalProxyTest.java │ │ │ ├── ProxyRuleTest.java │ │ │ ├── ProxySSLTest.java │ │ │ ├── ProxyTest.java │ │ │ ├── SOAPProxyIntegrationTest.java │ │ │ ├── SOAPProxyTest.java │ │ │ ├── SOAPProxyWSDLPublisherInterceptorTest.java │ │ │ ├── ServiceProxyKeyTest.java │ │ │ ├── ServiceProxyTest.java │ │ │ ├── ServiceProxyWSDLInterceptorsTest.java │ │ │ └── UnavailableSoapProxyTest.java │ │ ├── resolver │ │ │ ├── ResolverMapCombineTest.java │ │ │ ├── ResolverTest.java │ │ │ ├── RuleResolverTest.java │ │ │ ├── SingleResolverTest.java │ │ │ └── StaticStringResolver.java │ │ ├── security │ │ │ ├── JWTSecuritySchemeTest.java │ │ │ └── KeyStoreUtilTest.java │ │ ├── services │ │ │ ├── DummyWebServiceInterceptor.java │ │ │ └── RandomlyFailingDummyWebServiceInterceptor.java │ │ ├── transport │ │ │ ├── ExchangeTest.java │ │ │ ├── http │ │ │ │ ├── BoundConnectionTest.java │ │ │ │ ├── ConcurrentConnectionLimitTest.java │ │ │ │ ├── ConnectionTest.java │ │ │ │ ├── HostColonPortTest.java │ │ │ │ ├── Http2ClientTest.java │ │ │ │ ├── Http2DowngradeTest.java │ │ │ │ ├── HttpClientUtil.java │ │ │ │ ├── HttpKeepAliveTest.java │ │ │ │ ├── HttpTimeoutTest.java │ │ │ │ ├── HttpTransportTest.java │ │ │ │ ├── IllegalCharactersInURLTest.java │ │ │ │ ├── MockHttpTransport.java │ │ │ │ └── ServiceInvocationTest.java │ │ │ ├── http2 │ │ │ │ └── Http2ClientServerTest.java │ │ │ ├── ssl │ │ │ │ ├── HttpsKeepAliveTest.java │ │ │ │ ├── SSLContextTest.java │ │ │ │ ├── SessionResumptionTest.java │ │ │ │ └── acme │ │ │ │ │ ├── AcmeCASimulation.java │ │ │ │ │ ├── AcmeMiscTest.java │ │ │ │ │ ├── AcmeRenewTest.java │ │ │ │ │ ├── AcmeServerSimulator.java │ │ │ │ │ └── AcmeStepTest.java │ │ │ └── ws │ │ │ │ └── WebSocketConnectionTest.java │ │ ├── util │ │ │ ├── ByteUtilTest.java │ │ │ ├── CollectionsUtilTest.java │ │ │ ├── ContentTypeDetectorTest.java │ │ │ ├── DNSCacheTest.java │ │ │ ├── ExceptionUtilTest.java │ │ │ ├── FileUtilTest.java │ │ │ ├── HttpUtilTest.java │ │ │ ├── MediaTypeUtilTest.java │ │ │ ├── MemcachedConnectorTest.java │ │ │ ├── MimeTypeUtilTest.java │ │ │ ├── NetworkUtilTest.java │ │ │ ├── OSUtilTest.java │ │ │ ├── StringTestUtil.java │ │ │ ├── StringUtilTest.java │ │ │ ├── TextUtilTest.java │ │ │ ├── URITest.java │ │ │ ├── URIUtilTest.java │ │ │ ├── URLParamUtilTest.java │ │ │ ├── URLUtilTest.java │ │ │ ├── UtilTest.java │ │ │ ├── WSDLUtilTest.java │ │ │ ├── XMLUtilTest.java │ │ │ └── xml │ │ │ │ └── NodeListWrapperTest.java │ │ └── ws │ │ │ ├── SoapProxyInvocationTest.java │ │ │ └── relocator │ │ │ ├── RelocatorTest.java │ │ │ └── RelocatorWADLTest.java │ │ ├── evaluation │ │ ├── CompareNewStringWithStringBuffer.java │ │ ├── JDBCApiKeyStorePerformanceTest.java │ │ ├── RequestPerformanceTest.java │ │ ├── RequestPerformanceVersion1.java │ │ ├── RequestPerformanceVersion2.java │ │ ├── RequestPerformanceVersion3.java │ │ └── RequestPerformanceVersion4.java │ │ ├── integration │ │ ├── IntegrationTestsWithInternet.java │ │ ├── IntegrationTestsWithoutInternet.java │ │ ├── Util.java │ │ ├── withinternet │ │ │ ├── LargeBodyTest.java │ │ │ ├── OpenAPIRecordFactoryIntegrationTest.java │ │ │ ├── ProxySSLConnectionMethodTest.java │ │ │ └── ViaProxyTest.java │ │ └── withoutinternet │ │ │ ├── LimitedMemoryExchangeStoreIntegrationTest.java │ │ │ └── SessionManagerTest.java │ │ ├── interceptor │ │ ├── LimitInterceptorTest.java │ │ ├── LoadBalancingInterceptorFaultMonitoringStrategyTest.java │ │ ├── LoadBalancingInterceptorTest.java │ │ ├── MultipleLoadBalancersTest.java │ │ └── ws_addressing │ │ │ ├── WsaEndpointRewriterInterceptorTest.java │ │ │ └── WsaEndpointRewriterTest.java │ │ └── test │ │ └── TestUtil.java │ └── resources │ ├── .DS_Store │ ├── acl │ └── acl.xml │ ├── acme │ ├── authorization-valid.json │ ├── authorization.json │ ├── challenge-pending.json │ ├── directory.json │ ├── new-account-created.json │ ├── new-order-created.json │ ├── order-pending.json │ ├── order-processing.json │ ├── order-ready.json │ └── order-valid.json │ ├── alias-keystore.p12 │ ├── alias-truststore.p12 │ ├── alias-truststore2.p12 │ ├── apikeys │ ├── duplicate-api-keys.txt │ ├── keys.txt │ └── merge-keys.txt │ ├── apimanagement │ └── api.yaml │ ├── blz-httpget2soap-request.xsl │ ├── blz-service.wsdl │ ├── ca │ ├── ca-key.pem │ ├── ca.pem │ ├── client-key.pem │ ├── client.pem │ ├── server-key.pem │ └── server.pem │ ├── cbr │ ├── cbr.proxies.xml │ └── order.xml │ ├── chunked-body-with-trailer.txt │ ├── chunked-response-with-trailer.txt │ ├── custom-monitor-beans.xml │ ├── custom-rules.xml │ ├── custom-spring-beans.xml │ ├── customer.xml │ ├── customer2person.xsl │ ├── customer2personAddCompany.xsl │ ├── customerFromBonn.xml │ ├── customerFromBonnWithNS.xml │ ├── get-city.xml │ ├── get-lightning.txt │ ├── get-request.msg │ ├── getBank.xml │ ├── getBankInvalid.xml │ ├── getBankResponsewithSession.xml │ ├── getBankwithSession444444.xml │ ├── getBankwithSession555555.xml │ ├── getBankwithSession666666.xml │ ├── html │ ├── index.html │ └── page.html │ ├── internal-invocation │ └── proxies.xml │ ├── jd.xml │ ├── json │ ├── convert.json │ ├── order.json │ └── template_test.json │ ├── kubernetes │ └── api │ │ ├── apis-coordination-v1.json │ │ ├── apis.json │ │ ├── openapi-v2.json │ │ └── secret.json │ ├── lb.p12 │ ├── lightning-response.txt │ ├── log4j2.xml │ ├── membrane.p12 │ ├── messageAnalyser │ ├── getBuecherResponseSOAP11.xml │ └── getBuecherSOAP11.xml │ ├── multipart │ ├── embedded-byte-array-reassembled.xml │ └── embedded-byte-array.txt │ ├── namesservice.wsdl │ ├── namesservice.xsd │ ├── oauth2 │ ├── .well-known │ │ └── openid-configuration │ ├── consentFile.json │ └── loginDialog │ │ └── dialog │ │ ├── index.html │ │ └── main.css │ ├── openId │ ├── consentFile.json │ └── dialog │ │ ├── index.html │ │ └── main.css │ ├── openapi │ ├── messages │ │ ├── customer-additional-properties-invalid.json │ │ ├── customer.json │ │ ├── different-types.json │ │ ├── invalid-customer.json │ │ ├── invalid.json │ │ ├── missing-required-properties.json │ │ ├── missing-required-property.json │ │ ├── nested-objects-arrays-invalid.json │ │ ├── nested-objects-arrays.json │ │ ├── references-customer-invalid.json │ │ ├── references-customer-ok.json │ │ ├── references-requests-responses-customer-invalid.json │ │ └── references-requests-responses-customer.json │ ├── openapi-proxy │ │ ├── no-extensions.yml │ │ ├── validate-only-security-extensions.yml │ │ ├── validate-requests-extensions.yml │ │ ├── validate-responses-extensions.yml │ │ ├── validate-security-extensions.yml │ │ └── validation-details-false-extensions.yml │ └── specs │ │ ├── array.yml │ │ ├── arrays-openapi.yml │ │ ├── boolean.yml │ │ ├── composition.yml │ │ ├── content-type-wildcards.yml │ │ ├── customers.yml │ │ ├── default-response.yml │ │ ├── discriminator.yml │ │ ├── enum.yml │ │ ├── exceptions │ │ └── error-in-spec.yml │ │ ├── fruitshop-api-v2-openapi-3.yml │ │ ├── fruitshop-swagger-2.0.json │ │ ├── header-params.yml │ │ ├── info-3-servers.yml │ │ ├── info-no-servers.yml │ │ ├── info-servers.yml │ │ ├── integer.yml │ │ ├── mimetypes.yml │ │ ├── multiple-content.yml │ │ ├── nested-objects-arrays.yml │ │ ├── nullable.yml │ │ ├── number.yml │ │ ├── oas31 │ │ ├── const-value.yaml │ │ ├── exclusive-min-max.yaml │ │ ├── multiple-types-complex.yaml │ │ ├── multiple-types-document.yaml │ │ ├── multiple-types-nested.yaml │ │ ├── multiple-types.yaml │ │ ├── number-validation.yaml │ │ ├── references │ │ │ ├── deep │ │ │ │ ├── deep.oas.yaml │ │ │ │ ├── paths │ │ │ │ │ └── users.oas.yaml │ │ │ │ └── types │ │ │ │ │ └── user.schema.yaml │ │ │ ├── request-reference.yaml │ │ │ ├── request-schema.yaml │ │ │ └── user-schema.yaml │ │ ├── request-reference.yaml │ │ ├── request-schema.yaml │ │ ├── simple-reference.yaml │ │ └── user-schema.yaml │ │ ├── object.yml │ │ ├── path-parameters.yml │ │ ├── paths │ │ ├── api-a-path-foo.yml │ │ ├── api-b-path-foo.yml │ │ └── api-c-multiple-server-urls.yml │ │ ├── petstore-v3.1.json │ │ ├── query-params.yml │ │ ├── read-write-only.yml │ │ ├── references-request.yml │ │ ├── references-response.yml │ │ ├── references.yml │ │ ├── required.yml │ │ ├── rewrite-integration-test.yml │ │ ├── security │ │ ├── and-or.yml │ │ ├── api-key.yml │ │ ├── bearer-jwt.yml │ │ ├── http-basic.yml │ │ ├── no-security-schemes.yml │ │ ├── oauth2.yml │ │ ├── openid.yml │ │ ├── security-schemes.yml │ │ └── security.yml │ │ ├── servers-without-slash.yml │ │ ├── statuscode-wildcards.yml │ │ ├── statuscodes.yml │ │ ├── strings.yml │ │ ├── swagger-v2 │ │ └── petstore-v2.json │ │ └── x-membrane.yaml │ ├── order.xml │ ├── post-request-chunked.msg │ ├── post-request-http10.msg │ ├── post-request-large.msg │ ├── proxies-using-spring-refs.xml │ ├── proxies.xml │ ├── proxies.xsd │ ├── proxy-rules-test-monitor-beans.xml │ ├── ref.proxies.xml │ ├── request-chunked-soap.msg │ ├── request-post.msg │ ├── request.txt │ ├── resolver │ ├── 1.xsd │ ├── 2.xsd │ ├── 3.xsd │ ├── 4.xsd │ ├── 5.xsd │ ├── 6.xsd │ ├── 7.xsd │ └── a.wsdl │ ├── response-205-reset.http │ ├── response-chunked-html.msg │ ├── response-chunked.txt │ ├── response-no-content-length.txt │ ├── response-no-content.http │ ├── response-unchunked-html.msg │ ├── response-unchunked-image.msg │ ├── singlelinejsonsample.json │ ├── soap-proxy.xml │ ├── soap-sample │ ├── soap-request-bonn.xml │ ├── soap-request-london.xml │ ├── soap-request-new-york.xml │ ├── soapfault-with-java-stacktrace.xml │ └── wrong-request.xml │ ├── soapOperationExtractor │ ├── getBuecher.xml │ ├── getBuecherWithHeader.xml │ └── notSoap.xml │ ├── ssl-rsa-pub.keystore │ ├── ssl-rsa-pub2.keystore │ ├── ssl-rsa.keystore │ ├── ssl-rsa2.keystore │ ├── strip-soap-envelope.xsl │ ├── test-proxies.xml │ ├── userFeature │ └── proxies.xml │ ├── validation │ ├── ArticleService-bom.xml │ ├── ArticleService.wsdl │ ├── ArticleService.xsd │ ├── ArticleType-bom.xsd │ ├── ArticleType.xsd │ ├── BLZService.xml │ ├── CommonDataTypes.xsd │ ├── CurrencyType.xsd │ ├── XWebEmailValidation.wsdl.xml │ ├── XWebEmailValidation.xsd │ ├── articleRequest-bom.xml │ ├── articleRequest.xml │ ├── articleRequestInvalid-bom.xml │ ├── articleRequestInvalid.xml │ ├── articleResponse.xml │ ├── articleResponse.xml.br │ ├── articleResponse.xml.gz │ ├── inline-anytype.wsdl │ ├── invalid-order.xml │ ├── invalidEmail.xml │ ├── invalidEmail2.xml │ ├── invalidEmail3.xml │ ├── order.xml │ ├── order.xsd │ └── validEmail.xml │ ├── wadls │ └── search.wadl │ ├── ws │ ├── abstract-service-no-binding.wsdl │ ├── cities-2-services.wsdl │ ├── cities.wsdl │ ├── multiple-ports-in-a-service.wsdl │ └── two-separated-services.wsdl │ ├── wsdlValidator │ ├── soapFaultCustom.xml │ └── soapFaultFromSpec.xml │ └── xml │ ├── convert.xml │ ├── convert_without_encoding.xml │ ├── entity-expansion.lmx │ ├── entity-external.xml │ ├── long-element-name.xml │ ├── many-attributes.xml │ ├── not-wellformed.xml │ ├── project.xml │ ├── project_template.xml │ └── xsd-with-bom.xsd ├── distribution ├── conf │ ├── convert-request-to-new-version.xslt │ ├── convert-response-to-old-version.xslt │ ├── fruitshop-api.yml │ ├── k8s-proxies.xml │ ├── keys.txt │ ├── log4j2.xml │ └── security-api-v1.yml ├── docker │ ├── Dockerfile │ ├── README.md │ └── log4j2.xml ├── examples │ ├── .gitignore │ ├── README.md │ ├── api-testing │ │ └── api-greasing │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ ├── deployment │ │ ├── docker │ │ │ ├── Dockerfile │ │ │ ├── Readme.md │ │ │ └── proxies.xml │ │ └── windows-service │ │ │ ├── INSTALL_TANUKI.txt │ │ │ └── build-install-wrapper.xml │ ├── extending-membrane │ │ ├── configuration-properties │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── custom-interceptor │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── pom.xml │ │ │ ├── proxies.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── predic8 │ │ │ │ └── MyInterceptor.java │ │ ├── embedding-java │ │ │ ├── README.md │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── predic8 │ │ │ │ │ └── membrane │ │ │ │ │ └── api │ │ │ │ │ ├── AddMyHeaderInterceptor.java │ │ │ │ │ └── EmbeddingJava.java │ │ │ │ └── resources │ │ │ │ └── log4j2.xml │ │ ├── error-handling │ │ │ └── custom-error-messages │ │ │ │ ├── cities.wsdl │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ └── requests.http │ │ ├── file-exchangestore │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── global-interceptor │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── if │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ │ ├── mongo-exchange-store │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── reusable-plugin-chains │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── service-discovery-with-etcd │ │ │ ├── README.md │ │ │ ├── configurator │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ │ └── publisher │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ ├── graphql │ │ └── graphql-validation │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ ├── loadbalancing │ │ ├── 1-static │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── 2-dynamic │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── 3-client │ │ │ ├── README.md │ │ │ ├── client.properties │ │ │ ├── lb-client-secured.proxies.xml │ │ │ ├── lbclient.cmd │ │ │ ├── lbclient.sh │ │ │ ├── membrane-secured.cmd │ │ │ ├── membrane-secured.sh │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── 4-xml-session │ │ │ ├── README.md │ │ │ ├── data │ │ │ │ ├── ChatService.wsdl │ │ │ │ └── ChatService.xsd │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── pom.xml │ │ │ ├── proxies.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── predic8 │ │ │ │ └── chat │ │ │ │ ├── Client.java │ │ │ │ └── Server.java │ │ ├── 5-multiple │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── README.md │ ├── logging │ │ ├── README.md │ │ ├── access │ │ │ ├── README.md │ │ │ ├── log4j2_access.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── console │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── csv │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── jdbc-database │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── json │ │ │ ├── ExampleLayout.json │ │ │ ├── README.md │ │ │ ├── log4j2_json.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ ├── message-transformation │ │ ├── json2xml │ │ │ ├── README.md │ │ │ ├── call-api.sh │ │ │ ├── customers.json │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ │ ├── replace │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── transformation-using-javascript │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── order.json │ │ │ ├── proxies.xml │ │ │ └── requests.http │ │ └── xml2json │ │ │ ├── README.md │ │ │ ├── jobs.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ ├── monitoring-tracing │ │ ├── opentelemetry │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── resources │ │ │ │ ├── otel_example.png │ │ │ │ └── otel_sample.png │ │ └── prometheus │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── docker-compose.yml │ │ │ ├── grafana │ │ │ └── provisioning │ │ │ │ └── datasources │ │ │ │ └── datasource.yml │ │ │ ├── prometheus-grafana-example.png │ │ │ ├── prometheus │ │ │ └── prometheus.yml │ │ │ └── proxies.xml │ ├── openapi │ │ ├── README.md │ │ ├── openapi-proxy │ │ │ ├── README.md │ │ │ ├── api-overview.png │ │ │ ├── fruitshop-api.yml │ │ │ ├── log4j2.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── post-products.png │ │ │ ├── proxies.xml │ │ │ ├── swagger-ui.png │ │ │ └── try-it.png │ │ ├── validation-security │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── requests.http │ │ │ └── security-api-v1.yml │ │ ├── validation-simple │ │ │ ├── README.md │ │ │ ├── contacts-api-v1.yml │ │ │ ├── curl.sh │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ │ └── validation │ │ │ ├── README.md │ │ │ ├── contacts-api-v1.yml │ │ │ ├── contacts-xxl-api-v1.yml │ │ │ ├── curl.sh │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ ├── orchestration │ │ ├── call-authentication │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── call-get │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── call-post │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── for-loop │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ ├── rate-limiting │ │ ├── README.md │ │ ├── membrane.cmd │ │ ├── membrane.sh │ │ └── proxies.xml │ ├── routing-traffic │ │ ├── content-based-router │ │ │ ├── README.md │ │ │ ├── express.xml │ │ │ ├── import.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── order.xml │ │ │ └── proxies.xml │ │ ├── internalproxy │ │ │ ├── README.md │ │ │ ├── express.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── normal.xml │ │ │ ├── proxies.xml │ │ │ └── requests.http │ │ ├── rewriter │ │ │ ├── README.md │ │ │ ├── openapi │ │ │ │ ├── README.md │ │ │ │ ├── demo-api-v1.yml │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ │ └── regex │ │ │ │ ├── README.md │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ ├── shadowing │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── throttle │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── timing.bat │ │ │ └── timing.sh │ ├── scripting │ │ ├── groovy │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── order.json │ │ │ └── proxies.xml │ │ └── javascript │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── order.json │ │ │ ├── proxies.xml │ │ │ └── requests.http │ ├── security │ │ ├── README.md │ │ ├── access-control-list │ │ │ ├── README.md │ │ │ ├── acl.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── api-key │ │ │ ├── apikey-openapi │ │ │ │ ├── README.md │ │ │ │ ├── demo-keys.txt │ │ │ │ ├── fruitshop-api-v2-openapi-3-security.yml │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ │ ├── jdbc-api-key-store │ │ │ │ ├── README.md │ │ │ │ ├── insert_apikeys.sql │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ │ ├── mongodb-api-key-store │ │ │ │ ├── README.md │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ │ ├── rbac │ │ │ │ ├── README.md │ │ │ │ ├── demo-keys.txt │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ └── requests.http │ │ │ └── simple │ │ │ │ ├── README.md │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ └── requests.http │ │ ├── basic-auth │ │ │ ├── README.md │ │ │ ├── database │ │ │ │ ├── README.md │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ ├── run_h2.bat │ │ │ │ └── run_h2.sh │ │ │ └── simple │ │ │ │ ├── .htpasswd │ │ │ │ ├── README.md │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ ├── cors │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── page.html │ │ │ ├── proxies.xml │ │ │ └── style.css │ │ ├── json-protection │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── requests.bat │ │ │ ├── requests.http │ │ │ ├── requests.sh │ │ │ └── requests │ │ │ │ ├── max_array_size.json │ │ │ │ ├── max_depth.json │ │ │ │ ├── max_key_length.json │ │ │ │ ├── max_object_size.json │ │ │ │ ├── max_size.json │ │ │ │ ├── max_string_length.json │ │ │ │ ├── max_tokens.json │ │ │ │ └── valid.json │ │ ├── jwt │ │ │ └── apikey-to-jwt-conversion │ │ │ │ ├── README.md │ │ │ │ ├── demo-keys.txt │ │ │ │ ├── jwk.json │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ └── requests.http │ │ ├── login │ │ │ ├── README.md │ │ │ ├── dialog │ │ │ │ ├── index.html │ │ │ │ └── main.css │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── ntlm │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── oauth2 │ │ │ ├── README.md │ │ │ ├── api │ │ │ │ ├── OAuth2TrustedClient.java │ │ │ │ ├── README.md │ │ │ │ ├── authorization_server │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ │ ├── client.cmd │ │ │ │ ├── client.ps1 │ │ │ │ ├── client.sh │ │ │ │ ├── oauth2-password-flow-for-apis.png │ │ │ │ ├── rest.http │ │ │ │ └── token_validator │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ ├── azure-ad-with-jwts │ │ │ │ ├── README.md │ │ │ │ ├── images │ │ │ │ │ ├── 00-overview.png │ │ │ │ │ ├── 01-backend-registration.png │ │ │ │ │ ├── 03-client-registration.png │ │ │ │ │ ├── 04-client-secret-creation.png │ │ │ │ │ ├── 05-client-permission-granting.png │ │ │ │ │ ├── 06-client-permission-granting2.png │ │ │ │ │ └── 07-client-permission-granting3.png │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ │ ├── credentials │ │ │ │ ├── OAuth2TrustedClient.java │ │ │ │ ├── README.md │ │ │ │ ├── authorization_server │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ │ ├── client.cmd │ │ │ │ ├── client.ps1 │ │ │ │ ├── client.sh │ │ │ │ └── token_validator │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ ├── github │ │ │ │ ├── README.md │ │ │ │ ├── dialog │ │ │ │ │ ├── index.html │ │ │ │ │ └── main.css │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ ├── proxiesSSL.xml │ │ │ │ ├── service-proxySSL.ps1 │ │ │ │ └── service-proxySSL.sh │ │ │ ├── google │ │ │ │ ├── README.md │ │ │ │ ├── dialog │ │ │ │ │ ├── index.html │ │ │ │ │ └── main.css │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── proxies.xml │ │ │ │ ├── proxiesSSL.xml │ │ │ │ ├── service-proxySSL.ps1 │ │ │ │ └── service-proxySSL.sh │ │ │ ├── implicit │ │ │ │ ├── JavaScriptClient.html │ │ │ │ ├── README.md │ │ │ │ ├── authorization_server │ │ │ │ │ ├── consentFile.json │ │ │ │ │ ├── logindialog │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ └── main.css │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ │ └── webserver │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ ├── membrane │ │ │ │ ├── README.md │ │ │ │ ├── authorization_server │ │ │ │ │ ├── consentFile.json │ │ │ │ │ ├── logindialog │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ └── main.css │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ │ └── client │ │ │ │ │ ├── membrane.cmd │ │ │ │ │ ├── membrane.sh │ │ │ │ │ └── proxies.xml │ │ │ └── openid │ │ │ │ ├── README.md │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ └── proxies.xml │ │ ├── padding-header │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── ssl-tls │ │ │ ├── README.md │ │ │ ├── api-with-tls-pem │ │ │ ├── README.md │ │ │ ├── membrane-key.pem │ │ │ ├── membrane.cmd │ │ │ ├── membrane.pem │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ │ ├── api-with-tls-pkcs12 │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ │ └── to-backend │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ ├── templating │ │ ├── README.md │ │ ├── json │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── text │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── requests.http │ │ └── xml │ │ │ ├── README.md │ │ │ ├── cities.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── requests.http │ │ │ └── template.xml │ ├── validation │ │ ├── form │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── json-schema │ │ │ ├── README.md │ │ │ ├── bad2000.json │ │ │ ├── bad2001.json │ │ │ ├── good2000.json │ │ │ ├── good2001.json │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── schema2000.json │ │ │ └── schema2001.json │ ├── web-services-soap │ │ ├── add-soap-header │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── pom.xml │ │ │ ├── proxies.xml │ │ │ ├── soap-message-without-header.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── predic8 │ │ │ │ └── AddSoapHeaderInterceptor.java │ │ ├── rest2soap-json │ │ │ ├── README.md │ │ │ ├── get2soap.xsl │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── strip-env.xsl │ │ ├── rest2soap-template │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── rest2soap │ │ │ ├── README.md │ │ │ ├── get2soap.xsl │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── strip-env.xsl │ │ ├── sample-soap-service │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── request.xml │ │ │ └── requests.http │ │ ├── secured-wsdl │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ ├── soap-wsdl-validation │ │ │ ├── README.md │ │ │ ├── city-service.wsdl │ │ │ ├── city-soap.xml │ │ │ ├── invalid-city-soap.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ └── proxies.xml │ │ └── versioning-soap-xslt │ │ │ ├── README.md │ │ │ ├── convert-request-to-new-version.xslt │ │ │ ├── convert-response-to-old-version.xslt │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── request-new.xml │ │ │ └── request-old.xml │ ├── websockets │ │ ├── custom-websocket-interceptor │ │ │ ├── README.md │ │ │ ├── embedded │ │ │ │ ├── README.md │ │ │ │ ├── pom.xml │ │ │ │ ├── src │ │ │ │ │ └── main │ │ │ │ │ │ ├── java │ │ │ │ │ │ └── com │ │ │ │ │ │ │ └── predic8 │ │ │ │ │ │ │ ├── application │ │ │ │ │ │ │ └── MyApplication.java │ │ │ │ │ │ │ └── membrane │ │ │ │ │ │ │ └── core │ │ │ │ │ │ │ └── interceptor │ │ │ │ │ │ │ └── websocket │ │ │ │ │ │ │ └── custom │ │ │ │ │ │ │ └── MyWebSocketLogInterceptor.java │ │ │ │ │ │ └── resources │ │ │ │ │ │ └── log4j2.xml │ │ │ │ ├── start.bat │ │ │ │ └── start.sh │ │ │ └── standalone │ │ │ │ ├── README.md │ │ │ │ ├── compile-and-copy.bat │ │ │ │ ├── compile-and-copy.sh │ │ │ │ ├── membrane.cmd │ │ │ │ ├── membrane.sh │ │ │ │ ├── pom.xml │ │ │ │ ├── proxies.xml │ │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── predic8 │ │ │ │ └── membrane │ │ │ │ └── core │ │ │ │ └── interceptor │ │ │ │ └── websocket │ │ │ │ └── custom │ │ │ │ └── MyWebSocketLogInterceptor.java │ │ ├── stomp-over-websocket-intercepting │ │ │ ├── README.md │ │ │ ├── index.html │ │ │ ├── jquery.min.js │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── stomp.js │ │ ├── websocket-intercepting │ │ │ ├── README.md │ │ │ ├── index.js │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── package.json │ │ │ ├── proxies.xml │ │ │ ├── startWebsocket.ps1 │ │ │ └── startWebsocket.sh │ │ └── websocket-stomp │ │ │ ├── README.md │ │ │ ├── index.html │ │ │ ├── jquery.min.js │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── stomp.js │ ├── xml │ │ ├── basic-xml-interceptor │ │ │ ├── README.md │ │ │ ├── example.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── pom.xml │ │ │ ├── proxies.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── predic8 │ │ │ │ └── BasicXmlInterceptor.java │ │ ├── stax-interceptor │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── pom.xml │ │ │ ├── proxies.xml │ │ │ ├── request.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── predic8 │ │ │ │ └── StaxConverterInterceptor.java │ │ ├── xml-validation │ │ │ ├── README.md │ │ │ ├── amount.xsd │ │ │ ├── invalid-year.xml │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ ├── year.xml │ │ │ └── year.xsd │ │ └── xslt │ │ │ ├── README.md │ │ │ ├── membrane.cmd │ │ │ ├── membrane.sh │ │ │ ├── proxies.xml │ │ │ └── reformat.xsl │ └── yaml-configuration │ │ ├── README.md │ │ ├── membrane.cmd │ │ ├── membrane.sh │ │ └── proxies.yaml ├── media │ ├── membrane-logo-m-text.png │ └── membrane-logo.png ├── pom.xml ├── release-notes │ ├── 0.0.0.md │ ├── 5.1.17.md │ ├── 5.1.18.md │ └── 5.1.19.md ├── router │ ├── CHANGELOG.txt │ ├── LICENSE.txt │ ├── NOTICE.txt │ ├── README.txt │ ├── conf │ │ ├── acl.xml │ │ ├── client.cer │ │ ├── client.p12 │ │ ├── fruitshop-api.yml │ │ ├── generate-ssl-keys.bat │ │ ├── generate-ssl-keys.sh │ │ ├── log4j2.xml │ │ ├── membrane.cer │ │ ├── membrane.p12 │ │ ├── proxies-full-sample.xml │ │ ├── proxies-offline.xml │ │ ├── proxies-security.xml │ │ ├── proxies-soap.xml │ │ ├── proxies.xml │ │ └── wrapper.conf │ ├── membrane.cmd │ └── membrane.sh ├── src │ ├── assembly │ │ └── distribution.xml │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── predic8 │ │ │ └── membrane │ │ │ └── core │ │ │ └── IDEStarter.java │ └── test │ │ ├── java │ │ └── com │ │ │ └── predic8 │ │ │ └── membrane │ │ │ ├── errorhandling │ │ │ └── OpenAPIConfigErrorTest.java │ │ │ └── examples │ │ │ ├── ConfigSerializationTest.java │ │ │ ├── ExampleTests.java │ │ │ ├── ExampleTestsWithInternet.java │ │ │ ├── ExampleTestsWithoutInternet.java │ │ │ ├── ExampleUnitTests.java │ │ │ ├── util │ │ │ ├── AbstractSampleMembraneStartStopTestcase.java │ │ │ ├── BalancerClientScriptUtil.java │ │ │ ├── BufferLogger.java │ │ │ ├── ConsoleLogger.java │ │ │ ├── ConsoleWatcher.java │ │ │ ├── DistributionExtractingTestcase.java │ │ │ ├── LoadBalancerUtil.java │ │ │ ├── Process2.java │ │ │ ├── ProxiesXmlUtil.java │ │ │ ├── SubstringWaitableConsoleEvent.java │ │ │ ├── TestFileUtil.java │ │ │ └── WaitableConsoleEvent.java │ │ │ ├── withinternet │ │ │ ├── TutorialSoapExampleTest.java │ │ │ ├── config │ │ │ │ ├── GettingStartedExampleTest.java │ │ │ │ ├── ProxiesXMLExampleTest.java │ │ │ │ ├── ProxiesXMLFullExampleTest.java │ │ │ │ ├── ProxiesXMLSoapExampleTest.java │ │ │ │ └── ProxiesYAMLExampleTest.java │ │ │ ├── env │ │ │ │ └── HelpLinkExistenceTest.java │ │ │ ├── openapi │ │ │ │ └── OpenAPIRewriteExampleTest.java │ │ │ ├── rest │ │ │ │ ├── TutorialRestInitialExampleTest.java │ │ │ │ └── TutorialRestStepsExampleTest.java │ │ │ ├── rest2soap │ │ │ │ └── Rest2SOAPTemplateExampleTest.java │ │ │ ├── ssl │ │ │ │ └── ToBackendExampleTest.java │ │ │ └── test │ │ │ │ ├── ACLExampleTest.java │ │ │ │ ├── BasicAuthExampleTest.java │ │ │ │ ├── BasicXmlInterceptorExampleTest.java │ │ │ │ ├── CustomInterceptorExampleTest.java │ │ │ │ ├── FileExchangeStoreExampleTest.java │ │ │ │ ├── FormValidationExampleTest.java │ │ │ │ ├── Loadbalancing4XmlSessionExampleTest.java │ │ │ │ ├── LoggingCSVExampleTest.java │ │ │ │ ├── LoggingExampleTest.java │ │ │ │ ├── LoggingJDBCExampleTest.java │ │ │ │ ├── LoginExampleTest.java │ │ │ │ ├── PaddingHeaderExampleTest.java │ │ │ │ ├── RewriterExampleTest.java │ │ │ │ ├── SpELExampleTest.java │ │ │ │ ├── ThrottleExampleTest.java │ │ │ │ ├── VersioningSoapXsltExampleTest.java │ │ │ │ ├── orchestration │ │ │ │ ├── CallGetExampleTest.java │ │ │ │ ├── CallPostExampleTest.java │ │ │ │ └── ForLoopExampleTest.java │ │ │ │ └── soap │ │ │ │ └── TutorialSoapExampleTest.java │ │ │ └── withoutinternet │ │ │ ├── ChainExampleTest.java │ │ │ ├── config │ │ │ ├── ProxiesXMLOfflineExampleTest.java │ │ │ └── ProxiesXMLSecurityExampleTest.java │ │ │ ├── custom_error_messages │ │ │ └── CustomErrorHandlingExampleTest.java │ │ │ ├── env │ │ │ ├── ConsistentVersionNumbers.java │ │ │ └── JavaLicenseInfoTest.java │ │ │ ├── integration │ │ │ ├── OAuth2ExampleTest.java │ │ │ └── OAuth2RaceCondition.java │ │ │ ├── message_transformation │ │ │ ├── TransformationUsingJavascriptExampleTest.java │ │ │ └── Xml2JsonExampleTest.java │ │ │ ├── oauth2 │ │ │ └── OAuth2Membrane2ExampleTest.java │ │ │ ├── openapi │ │ │ ├── APIProxyExampleTest.java │ │ │ ├── OpenAPIValidationExampleTest.java │ │ │ └── OpenAPIValidationSimpleExampleTest.java │ │ │ ├── opentelemetry │ │ │ ├── OpenTelemetryExampleTest.java │ │ │ ├── Traceparent.java │ │ │ └── TraceparentTest.java │ │ │ ├── ssl │ │ │ ├── SSLServerApiWithTlsPemExampleTest.java │ │ │ └── SSLServerApiWithTlsPkcs12ExampleTest.java │ │ │ ├── test │ │ │ ├── APIKeyExampleTest.java │ │ │ ├── APIKeyRBACExampleTest.java │ │ │ ├── APIKeySimpleExampleTest.java │ │ │ ├── APIKeyWithOpenAPIExampleTest.java │ │ │ ├── AccessLogExampleTest.java │ │ │ ├── AddSoapHeaderExampleTest.java │ │ │ ├── ApiKeyToJwtTest.java │ │ │ ├── CBRXPathExampleTest.java │ │ │ ├── CallAuthenticationExampleTest.java │ │ │ ├── GlobalInterceptorExampleTest.java │ │ │ ├── GroovyExampleTest.java │ │ │ ├── IfInterceptorExampleTest.java │ │ │ ├── InternalProxyExampleTest.java │ │ │ ├── JavascriptExampleTest.java │ │ │ ├── Json2XmlExampleTest.java │ │ │ ├── JsonProtectionExampleTest.java │ │ │ ├── JsonTemplateExampleTest.java │ │ │ ├── Loadbalancing1StaticExampleTest.java │ │ │ ├── Loadbalancing2DynamicExampleTest.java │ │ │ ├── Loadbalancing3ClientExampleTest.java │ │ │ ├── Loadbalancing5MultipleExampleTest.java │ │ │ ├── OAuth2APIExampleTest.java │ │ │ ├── OAuth2CredentialsExampleTest.java │ │ │ ├── OAuth2MembraneExampleTest.java │ │ │ ├── RateLimiterExampleTest.java │ │ │ ├── SampleSoapServiceExampleTest.java │ │ │ ├── SecuredWsdlExampleTest.java │ │ │ ├── StaxInterceptorExampleTest.java │ │ │ ├── TextTemplateExampleTest.java │ │ │ ├── XMLTemplateExampleTest.java │ │ │ └── XMLValidationExampleTest.java │ │ │ └── validation │ │ │ ├── JSONSchemaValidationExampleTest.java │ │ │ └── SOAPProxyValidationExampleTest.java │ │ └── resources │ │ ├── OAuth2 │ │ ├── .well-known │ │ │ └── openid-configuration │ │ ├── auth │ │ │ ├── index.html │ │ │ └── main.css │ │ ├── client.xml │ │ ├── consentFile.json │ │ ├── proxies-subpath.xml │ │ ├── proxies.xml │ │ └── server.xml │ │ ├── com │ │ └── predic8 │ │ │ └── membrane │ │ │ ├── errorhandling │ │ │ ├── wrong-content-proxies.xml │ │ │ ├── wrong-file-location-proxies.xml │ │ │ └── wrong-url-location-proxies.xml │ │ │ └── examples │ │ │ └── tutorials │ │ │ ├── rest │ │ │ └── rest-tutorial-steps-proxies.xml │ │ │ └── soap │ │ │ └── soap-tutorial-steps-proxies.xml │ │ └── log4j2.xml └── tutorials │ ├── rest │ ├── README.md │ ├── membrane.cmd │ ├── membrane.sh │ └── proxies.xml │ └── soap │ ├── README.md │ ├── get2soap.xsl │ ├── membrane.cmd │ ├── membrane.sh │ ├── proxies.xml │ └── strip-env.xsl ├── docs ├── ADRs.md ├── BUILD.md ├── CONVENTIONS.md ├── DEVELOPING.md ├── MIGRATION-GUIDE.md ├── RELEASE_NOTES.md ├── ROADMAP.md └── SECURITY.md ├── maven-plugin ├── README.md ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── predic8 │ └── membrane │ └── plugin │ ├── RouterFacade.java │ ├── RunMojo.java │ ├── StartMojo.java │ └── StopMojo.java ├── membrane.spec ├── pom.xml ├── starter ├── README.md ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── predic8 │ └── membrane │ └── core │ ├── ClassloaderUtil.java │ └── Starter.java ├── test ├── README.md ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── predic8 │ └── membrane │ └── test │ ├── HttpAssertions.java │ ├── OAuth2AuthFlowClient.java │ ├── OAuth2AuthFlowFormPostClient.java │ ├── OAuth2AuthFlowNormalClient.java │ ├── StringAssertions.java │ └── WSDLTestUtil.java └── war ├── .factorypath ├── pom.xml └── src ├── assembly └── integration-test-war.xml ├── main ├── java │ └── com │ │ └── predic8 │ │ └── membrane │ │ └── servlet │ │ ├── FileSchemaWebAppResolver.java │ │ ├── MembraneServletContextListener.java │ │ ├── RouterUtil.java │ │ ├── config │ │ └── spring │ │ │ ├── BaseLocationXmlWebApplicationContext.java │ │ │ └── NamespaceHandler.java │ │ └── embedded │ │ ├── HttpServletHandler.java │ │ ├── MembraneServlet.java │ │ └── ServletTransport.java ├── resources │ └── META-INF │ │ ├── spring.handlers │ │ └── spring.schemas └── webapp │ ├── README.txt │ └── WEB-INF │ ├── classes │ └── log4j2.xml │ ├── proxies.xml │ └── web.xml └── test ├── java └── com │ └── predic8 │ └── membrane │ └── servlet │ └── test │ ├── AdminConsoleTest.java │ ├── ForwardingTest.java │ ├── IntegrationTests.java │ ├── ReleaseConfigurationTest.java │ ├── ResolverTestTriggerTest.java │ ├── WSDLPublisherTest.java │ └── WSDLRewritingTest.java ├── resources └── META-INF │ ├── spring.handlers │ └── spring.schemas └── webapp └── WEB-INF ├── ArticleService.wsdl ├── ArticleService.xsd ├── ArticleType.xsd ├── CommonDataTypes.xsd ├── CurrencyType.xsd ├── embedded-proxies.xml ├── proxies.xml └── web.xml /.gitattributes: -------------------------------------------------------------------------------- 1 | *.sh eol=lf 2 | -------------------------------------------------------------------------------- /.run/IDEStarter.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.9.8-amazoncorretto-21-al2023 2 | 3 | ADD pom.xml /app/ 4 | ADD annot/pom.xml /app/annot/ 5 | ADD core/pom.xml /app/core/ 6 | ADD distribution/pom.xml /app/distribution/ 7 | WORKDIR /app 8 | 9 | RUN if [ -d .m2 ] ; then mv .m2 /root ; fi 10 | 11 | # fake maven run to pre-cache a few maven dependencies 12 | RUN mvn install ; exit 0 13 | 14 | ADD . /app 15 | 16 | RUN mvn install -------------------------------------------------------------------------------- /annot/src/main/resources/META-INF/services/javax.annotation.processing.Processor: -------------------------------------------------------------------------------- 1 | com.predic8.membrane.annot.SpringConfigurationXSDGeneratingAnnotationProcessor -------------------------------------------------------------------------------- /core/.factorypath: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/RuleManager.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/java/com/predic8/membrane/core/RuleManager.java -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/azure/api/dns/DnsProvisionable.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2023 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.azure.api.dns; 15 | 16 | public interface DnsProvisionable { 17 | void provisionDns(String domain, String record); 18 | } 19 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/config/security/acme/AcmeSynchronizedStorage.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2022 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.config.security.acme; 15 | 16 | public interface AcmeSynchronizedStorage { 17 | } 18 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/exchange/ExchangeState.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2009 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | 15 | package com.predic8.membrane.core.exchange; 16 | 17 | public enum ExchangeState { 18 | 19 | STARTED, SENT, RECEIVED, COMPLETED, FAILED 20 | 21 | } 22 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/graphql/model/ExecutableDefinition.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2023 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | 15 | package com.predic8.membrane.core.graphql.model; 16 | 17 | public abstract class ExecutableDefinition implements Definition { 18 | } 19 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/graphql/package-info.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2023 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | 15 | /** 16 | * An implementation of a https://spec.graphql.org/October2021/ parser. 17 | */ 18 | package com.predic8.membrane.core.graphql; -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/interceptor/acl/TypeMatcher.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2023 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.interceptor.acl; 15 | 16 | public interface TypeMatcher { 17 | 18 | boolean matches(String value, String schema); 19 | } 20 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/interceptor/lang/Polyglot.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.interceptor.lang; 15 | 16 | public interface Polyglot { 17 | 18 | void setLanguage(String language); 19 | } 20 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/interceptor/registration/ErrorMessages.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/java/com/predic8/membrane/core/interceptor/registration/ErrorMessages.java -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/interceptor/registration/SecurityUtils.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/java/com/predic8/membrane/core/interceptor/registration/SecurityUtils.java -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/interceptor/registration/entity/User.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/java/com/predic8/membrane/core/interceptor/registration/entity/User.java -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/kubernetes/BeanRegistry.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2022 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.kubernetes; 15 | 16 | public interface BeanRegistry { 17 | Object resolveReference(String url); 18 | } 19 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/kubernetes/client/WatchAction.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2022 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.kubernetes.client; 15 | 16 | public enum WatchAction { 17 | ADDED, MODIFIED, DELETED 18 | } 19 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/openapi/serviceproxy/Rewrite.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/java/com/predic8/membrane/core/openapi/serviceproxy/Rewrite.java -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/proxies/NotPortOpeningProxy.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2023 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | 15 | package com.predic8.membrane.core.proxies; 16 | 17 | public interface NotPortOpeningProxy { 18 | } 19 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/transport/http2/frame/StreamEnd.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | 15 | package com.predic8.membrane.core.transport.http2.frame; 16 | 17 | public interface StreamEnd { 18 | boolean isEndStream(); 19 | } 20 | -------------------------------------------------------------------------------- /core/src/main/java/com/predic8/membrane/core/util/Pair.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2023 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | 15 | package com.predic8.membrane.core.util; 16 | public record Pair(A first, B second) {} 17 | -------------------------------------------------------------------------------- /core/src/main/java/org/brotli/dec/BrotliRuntimeException.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2015 Google Inc. All Rights Reserved. 2 | 3 | Distributed under MIT license. 4 | See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 5 | */ 6 | 7 | package org.brotli.dec; 8 | 9 | /** 10 | * Unchecked exception used internally. 11 | */ 12 | class BrotliRuntimeException extends RuntimeException { 13 | 14 | BrotliRuntimeException(String message) { 15 | super(message); 16 | } 17 | 18 | BrotliRuntimeException(String message, Throwable cause) { 19 | super(message, cause); 20 | } 21 | } -------------------------------------------------------------------------------- /core/src/main/java/org/brotli/dec/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copied from https://github.com/google/brotli/tree/master/java/org/brotli/dec under the MIT license. 3 | * See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 4 | */ 5 | -------------------------------------------------------------------------------- /core/src/main/resources/META-INF/spring.handlers: -------------------------------------------------------------------------------- 1 | http\://membrane-soa.org/proxies/1/=com.predic8.membrane.core.config.spring.NamespaceHandler -------------------------------------------------------------------------------- /core/src/main/resources/META-INF/spring.schemas: -------------------------------------------------------------------------------- 1 | http\://membrane-soa.org/schemas/proxies-1.xsd=com/predic8/membrane/core/config/spring/router-conf.xsd -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/download.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/spv-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/spv-bottom.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/spv-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/spv-middle.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/spv-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/images/spv-top.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_flat_55_999999_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_flat_55_999999_40x100.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_flat_75_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_flat_75_aaaaaa_40x100.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_glass_45_0078ae_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_glass_45_0078ae_1x400.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_glass_55_f8da4e_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_glass_55_f8da4e_1x400.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_glass_75_79c9ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_glass_75_79c9ec_1x400.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_gloss-wave_45_e14f1c_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_gloss-wave_45_e14f1c_500x100.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_gloss-wave_50_6eac2c_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_gloss-wave_50_6eac2c_500x100.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_gloss-wave_75_2191c0_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_gloss-wave_75_2191c0_500x100.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_inset-hard_100_fcfdfd_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-bg_inset-hard_100_fcfdfd_1x100.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_0078ae_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_0078ae_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_056b93_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_056b93_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_d8e7f3_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_d8e7f3_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_e0fdff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_e0fdff_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_f5e175_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_f5e175_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_f7a50d_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_f7a50d_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_fcd113_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/main/resources/com/predic8/membrane/core/interceptor/administration/docBase/admin/jquery-ui/css/custom-theme/images/ui-icons_fcd113_256x240.png -------------------------------------------------------------------------------- /core/src/main/resources/openapi/swagger-ui.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ${openApiTitle} - Membrane API Gateway 9 | 10 | 11 | 12 |
13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /core/src/main/resources/test/foo.bar: -------------------------------------------------------------------------------- 1 | baz -------------------------------------------------------------------------------- /core/src/test/java/com/predic8/membrane/core/interceptor/templating/StaticInterceptorTest.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2024 predic8 GmbH, www.predic8.com 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. */ 14 | package com.predic8.membrane.core.interceptor.templating; 15 | 16 | class StaticInterceptorTest { 17 | 18 | } -------------------------------------------------------------------------------- /core/src/test/resources/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/.DS_Store -------------------------------------------------------------------------------- /core/src/test/resources/acl/acl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 192.168.23.131 5 | predic8.de 6 | sami 7 | 127.0.0.1 8 | 9 | 10 | 11 | 12 | 192.168.23.* 13 | pc1.predic8.de 14 | 192.168.11.2 15 | pc1.predic8.com 16 | pc1.xy.com 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /core/src/test/resources/acme/authorization-valid.json: -------------------------------------------------------------------------------- 1 | { 2 | "identifier": { 3 | "type": "dns", 4 | "value": "localhost" 5 | }, 6 | "status": "valid", 7 | "expires": "2022-03-01T12:17:49Z", 8 | "challenges": [ 9 | { 10 | "type": "http-01", 11 | "status": "valid", 12 | "url": "http://localhost:3050/acme/chall-v3/1555123456/abCd1E", 13 | "token": "79123-1234itunehnhtudixnhudindih-34hty5dn74", 14 | "validationRecord": [ 15 | { 16 | "url": "http://localhost/.well-known/acme-challenge/79123-1234itunehnhtudixnhudindih-34hty5dn74", 17 | "hostname": "localhost", 18 | "port": "80", 19 | "addressesResolved": [ 20 | "127.0.0.1" 21 | ], 22 | "addressUsed": "127.0.0.1" 23 | } 24 | ], 25 | "validated": "2022-01-30T12:17:48Z" 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/challenge-pending.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "http-01", 3 | "status": "pending", 4 | "url": "http://localhost:3050/acme/chall-v3/1555123456/abCd1E", 5 | "token": "79123-1234itunehnhtudixnhudindih-34hty5dn74" 6 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/directory.json: -------------------------------------------------------------------------------- 1 | { 2 | "_assIotCiXj": "http://localhost:3050/t/adding-random-entries-to-the-directory/12345", 3 | "keyChange": "http://localhost:3050/acme/key-change", 4 | "meta": { 5 | "caaIdentities": [ 6 | "localhost:3050" 7 | ], 8 | "termsOfService": "http://localhost:3050/documents/non-existent.pdf", 9 | "website": "http://localhost:3050/docs/staging-environment/" 10 | }, 11 | "newAccount": "http://localhost:3050/acme/new-acct", 12 | "newNonce": "http://localhost:3050/acme/new-nonce", 13 | "newOrder": "http://localhost:3050/acme/new-order", 14 | "renewalInfo": "http://localhost:3050/get/draft-aaron-ari/renewalInfo/", 15 | "revokeCert": "http://localhost:3050/acme/revoke-cert" 16 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/new-account-created.json: -------------------------------------------------------------------------------- 1 | { 2 | "key": { 3 | "use": "sig", 4 | "kty": "EC", 5 | "kid": "s3ds1is17rhnetlnlndnsbho4l", 6 | "crv": "P-256", 7 | "alg": "ES256", 8 | "x": "loB_k1eR0gvcTGDMKjFZjyKXxE4D8A3NPTsUWWxpOc0", 9 | "y": "bYr2E9NQSXD23hqWw-8eYEpvltXjVv5Kbczd7d1lYIg" 10 | }, 11 | "contact": [ 12 | "mailto:jsmith@example.com" 13 | ], 14 | "initialIp": "127.0.0.1", 15 | "createdAt": "2022-01-29T15:41:33.25410905Z", 16 | "status": "valid" 17 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/new-order-created.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "pending", 3 | "expires": "2022-02-05T21:01:47Z", 4 | "identifiers": [ 5 | { 6 | "type": "dns", 7 | "value": "localhost" 8 | } 9 | ], 10 | "authorizations": [ 11 | "http://localhost:3050/acme/authz-v3/151234567" 12 | ], 13 | "finalize": "http://localhost:3050/acme/finalize/42212345/1661234567" 14 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/order-pending.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "pending", 3 | "expires": "2022-02-05T21:01:47Z", 4 | "identifiers": [ 5 | { 6 | "type": "dns", 7 | "value": "localhost" 8 | } 9 | ], 10 | "authorizations": [ 11 | "http://localhost:3050/acme/authz-v3/151234567" 12 | ], 13 | "finalize": "http://localhost:3050/acme/finalize/42212345/1661234567", 14 | "certificate": "http://localhost:3050/acme/cert/fab123456789abcdef0123456789abcdef12" 15 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/order-processing.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "processing", 3 | "expires": "2022-02-05T21:01:47Z", 4 | "identifiers": [ 5 | { 6 | "type": "dns", 7 | "value": "localhost" 8 | } 9 | ], 10 | "authorizations": [ 11 | "http://localhost:3050/acme/authz-v3/151234567" 12 | ], 13 | "finalize": "http://localhost:3050/acme/finalize/42212345/1661234567", 14 | "certificate": "http://localhost:3050/acme/cert/fab123456789abcdef0123456789abcdef12" 15 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/order-ready.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "ready", 3 | "expires": "2022-02-05T21:01:47Z", 4 | "identifiers": [ 5 | { 6 | "type": "dns", 7 | "value": "localhost" 8 | } 9 | ], 10 | "authorizations": [ 11 | "http://localhost:3050/acme/authz-v3/151234567" 12 | ], 13 | "finalize": "http://localhost:3050/acme/finalize/42212345/1661234567", 14 | "certificate": "http://localhost:3050/acme/cert/fab123456789abcdef0123456789abcdef12" 15 | } -------------------------------------------------------------------------------- /core/src/test/resources/acme/order-valid.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "valid", 3 | "expires": "2022-02-05T21:01:47Z", 4 | "identifiers": [ 5 | { 6 | "type": "dns", 7 | "value": "localhost" 8 | } 9 | ], 10 | "authorizations": [ 11 | "http://localhost:3050/acme/authz-v3/151234567" 12 | ], 13 | "finalize": "http://localhost:3050/acme/finalize/42212345/1661234567", 14 | "certificate": "http://localhost:3050/acme/cert/fab123456789abcdef0123456789abcdef12" 15 | } -------------------------------------------------------------------------------- /core/src/test/resources/alias-keystore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/alias-keystore.p12 -------------------------------------------------------------------------------- /core/src/test/resources/alias-truststore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/alias-truststore.p12 -------------------------------------------------------------------------------- /core/src/test/resources/alias-truststore2.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/alias-truststore2.p12 -------------------------------------------------------------------------------- /core/src/test/resources/apikeys/duplicate-api-keys.txt: -------------------------------------------------------------------------------- 1 | # These are demo-keys. 2 | L62NA 3 | L62NA -------------------------------------------------------------------------------- /core/src/test/resources/apikeys/keys.txt: -------------------------------------------------------------------------------- 1 | # These are demo-keys. 2 | 5XF27: finance,internal 3 | 73D29: accounting, management 4 | # This is a demo comment 5 | 89D5C: internal, 6 | NMB3B: demo, test # This is an inline comment. 7 | L63NC 8 | AB6DE: -------------------------------------------------------------------------------- /core/src/test/resources/apikeys/merge-keys.txt: -------------------------------------------------------------------------------- 1 | # These are demo-keys. 2 | 5XF27:account,internal -------------------------------------------------------------------------------- /core/src/test/resources/blz-httpget2soap-request.xsl: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /core/src/test/resources/cbr/order.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/chunked-body-with-trailer.txt: -------------------------------------------------------------------------------- 1 | 7\r\n 2 | predic8\r\n 3 | 9\r\n 4 | Developer\r\n 5 | 7\r\n 6 | Network\r\n 7 | 0\r\n 8 | Expires: Mon, 12 Dec 2022 09:28:00 GMT\r\n 9 | \r\n 10 | -------------------------------------------------------------------------------- /core/src/test/resources/chunked-response-with-trailer.txt: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK\r\n 2 | Content-Type: text/plain\r\n 3 | Transfer-Encoding: chunked\r\n 4 | Trailer: Expires\r\n 5 | \r\n 6 | 7\r\n 7 | predic8\r\n 8 | 9\r\n 9 | Developer\r\n 10 | 7\r\n 11 | Network\r\n 12 | 0\r\n 13 | Expires: Mon, 12 Dec 2022 09:28:00 GMT\r\n 14 | \r\n 15 | -------------------------------------------------------------------------------- /core/src/test/resources/customer.xml: -------------------------------------------------------------------------------- 1 | 2 | -20 3 | Rick 4 | Cortés Ribotta 5 | Calle Pública "B" 5240 Casa 121 6 | Omaha 7 | -------------------------------------------------------------------------------- /core/src/test/resources/customer2person.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 |
13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
-------------------------------------------------------------------------------- /core/src/test/resources/customer2personAddCompany.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
-------------------------------------------------------------------------------- /core/src/test/resources/customerFromBonn.xml: -------------------------------------------------------------------------------- 1 | 2 | 1 3 | Jim 4 | Panse 5 | Moltkestrasse 44 6 | Bonn 7 | -------------------------------------------------------------------------------- /core/src/test/resources/customerFromBonnWithNS.xml: -------------------------------------------------------------------------------- 1 | 2 | 1 3 | Jim 4 | Panse 5 | Moltkestrasse 44 6 | Bonn 7 | -------------------------------------------------------------------------------- /core/src/test/resources/get-city.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bonn 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/test/resources/get-lightning.txt: -------------------------------------------------------------------------------- 1 | GET /icons/lightning.png HTTP/1.1 2 | Host: www.service-repository.com:1000 3 | User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 4 | Accept: image/png,image/*;q=0.8,*/*;q=0.5 5 | Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 6 | Accept-Encoding: gzip,deflate 7 | Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8 | Keep-Alive: 300 9 | Connection: keep-alive 10 | Referer: http://www.service-repository.com:1000/ 11 | Cookie: JSESSIONID=83A796145D6715C9EEBDE058EC0769EB -------------------------------------------------------------------------------- /core/src/test/resources/get-request.msg: -------------------------------------------------------------------------------- 1 | GET /foo?bar=baz HTTP/1.1 2 | Host: www.example.com 3 | User-Agent: jUnit Test 4 | Accept: text/html,text/*;q=0.8,*/*;q=0.5 5 | Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 6 | Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 7 | Connection: close 8 | Referer: http://www.example.com/ 9 | Cookie: JSESSIONID=83A796145D6715C9EEBDE058EC0769EB 10 | 11 | -------------------------------------------------------------------------------- /core/src/test/resources/getBank.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 66762332 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/getBankInvalid.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 66762332 5 | 66762334 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/test/resources/getBankResponsewithSession.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 444444 6 | Raiffeisenbank Kraichgau 7 | GENODE61KIR 8 | Kirchardt 9 | 74912 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /core/src/test/resources/getBankwithSession444444.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 444444 6 | 66762332 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/getBankwithSession555555.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 555555 6 | 66762332 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/getBankwithSession666666.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 666666 6 | 66762332 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/test/resources/html/page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/test/resources/jd.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | dasistemail@gmail.com 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/test/resources/json/convert.json: -------------------------------------------------------------------------------- 1 | { 2 | "employee": { 3 | "name": "sonooüöüö", 4 | "salary": 56000, 5 | "married": true 6 | } 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/test/resources/json/order.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "count": 22, 4 | "limit": 10, 5 | "page": 2, 6 | "previous_url": "/shop/products/?page=1&limit=10", 7 | "next_url": "/shop/products/?page=3&limit=10" 8 | }, 9 | "orders": [ 10 | { 11 | "createdAt": "2021-04-12", 12 | "state": "created", 13 | "order_url": "/shop/orders/7832", 14 | "items": ["food1", "food2", 3 , "food4"] 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /core/src/test/resources/json/template_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "meta": { 3 | "count": 22, 4 | "limit": 10, 5 | "page": 2, 6 | "previous_url": "/shop/products/?page=1&limit=10", 7 | "next_url": "/shop/products/?page=3&limit=10", 8 | "title": "${property.title}" 9 | }, 10 | "orders": [ 11 | { 12 | "createdAt": "2021-04-12", 13 | "state": "created", 14 | "order_url": "/shop/orders/7832", 15 | "items": [${property.items.join(",")}] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /core/src/test/resources/kubernetes/api/apis-coordination-v1.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "APIResourceList", 3 | "apiVersion": "v1", 4 | "groupVersion": "coordination.k8s.io/v1", 5 | "resources": [ 6 | { 7 | "name": "leases", 8 | "singularName": "", 9 | "namespaced": true, 10 | "kind": "Lease", 11 | "verbs": [ 12 | "create", 13 | "delete", 14 | "deletecollection", 15 | "get", 16 | "list", 17 | "patch", 18 | "update", 19 | "watch" 20 | ], 21 | "storageVersionHash": "gqkMMb/YqFM=" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /core/src/test/resources/kubernetes/api/apis.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "APIGroupList", 3 | "apiVersion": "v1", 4 | "groups": [ 5 | { 6 | "name": "coordination.k8s.io", 7 | "versions": [ 8 | { 9 | "groupVersion": "coordination.k8s.io/v1", 10 | "version": "v1" 11 | } 12 | ], 13 | "preferredVersion": { 14 | "groupVersion": "coordination.k8s.io/v1", 15 | "version": "v1" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /core/src/test/resources/kubernetes/api/secret.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "Secret", 3 | "apiVersion": "v1", 4 | "metadata": { 5 | "name": "existent", 6 | "namespace": "default", 7 | "uid": "4d689a25-f0b2-45cb-818a-dfb0480f7de5", 8 | "resourceVersion": "449479552", 9 | "creationTimestamp": "2022-01-24T14:11:03Z", 10 | "managedFields": [ 11 | { 12 | "manager": "kubectl-create", 13 | "operation": "Update", 14 | "apiVersion": "v1", 15 | "time": "2022-01-24T14:11:03Z", 16 | "fieldsType": "FieldsV1", 17 | "fieldsV1": { 18 | "f:data": { 19 | ".": {}, 20 | "f:key": {} 21 | }, 22 | "f:type": {} 23 | } 24 | } 25 | ] 26 | }, 27 | "data": { 28 | "key": "dmFsdWU=" 29 | }, 30 | "type": "Opaque" 31 | } -------------------------------------------------------------------------------- /core/src/test/resources/lb.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/lb.p12 -------------------------------------------------------------------------------- /core/src/test/resources/lightning-response.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/lightning-response.txt -------------------------------------------------------------------------------- /core/src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /core/src/test/resources/membrane.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/membrane.p12 -------------------------------------------------------------------------------- /core/src/test/resources/messageAnalyser/getBuecherResponseSOAP11.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dan Brown 7 | Meteor 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/test/resources/messageAnalyser/getBuecherSOAP11.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Dan Brown 6 | 100 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/multipart/embedded-byte-array-reassembled.xml: -------------------------------------------------------------------------------- 1 | MDEyMzQ1Njc4OQ== -------------------------------------------------------------------------------- /core/src/test/resources/multipart/embedded-byte-array.txt: -------------------------------------------------------------------------------- 1 | --uuid:168683dc-43b3-4e71-8e66-efb633ef406b 2 | Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"; 3 | Content-Transfer-Encoding: binary 4 | Content-ID: 5 | 6 | 7 | --uuid:168683dc-43b3-4e71-8e66-efb633ef406b 8 | Content-Type: application/octet-stream 9 | Content-Transfer-Encoding: binary 10 | Content-ID: 11 | 12 | 0123456789 13 | --uuid:168683dc-43b3-4e71-8e66-efb633ef406b-- -------------------------------------------------------------------------------- /core/src/test/resources/oauth2/.well-known/openid-configuration: -------------------------------------------------------------------------------- 1 | { 2 | "issuer" : "http://localhost:2000", 3 | "authorization_endpoint" : "http://localhost:2000/oauth2/auth", 4 | "token_endpoint" : "http://localhost:2000/oauth2/token", 5 | "userinfo_endpoint" : "http://localhost:2000/oauth2/userinfo", 6 | "revocation_endpoint" : "http://localhost:2000/oauth2/revoke", 7 | "jwks_uri" : "http://localhost:2000/oauth2/certs", 8 | "response_types_supported" : [ "code", "token" ], 9 | "subject_types_supported" : [ "public" ], 10 | "id_token_signing_alg_values_supported" : [ "RS256" ], 11 | "scopes_supported" : [ "username", "profile" ], 12 | "token_endpoint_auth_methods_supported" : [ "client_secret_post" ], 13 | "claims_supported" : [ "username", "sub", "email", "iss", "aud" ] 14 | } -------------------------------------------------------------------------------- /core/src/test/resources/oauth2/consentFile.json: -------------------------------------------------------------------------------- 1 | { 2 | "product_name":"authorization server", 3 | "logo_url":"url", 4 | "scopes":{ 5 | "scopeName1":"description1", 6 | "scopeName2":"description2", 7 | "profile":"Information about who you are" 8 | }, 9 | "claims":{ 10 | "claimName1":"description3", 11 | "claimName2":"description4", 12 | "username":"Your username" 13 | } 14 | } -------------------------------------------------------------------------------- /core/src/test/resources/oauth2/loginDialog/dialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 300px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } -------------------------------------------------------------------------------- /core/src/test/resources/openId/consentFile.json: -------------------------------------------------------------------------------- 1 | { 2 | "product_name":"membrane", 3 | "logo_url":"https://www.predic8.de/logo6.png", 4 | "scopes":{ 5 | "openid":"OpenID standard information", 6 | "profile":"Information about who you are" 7 | }, 8 | "claims":{ 9 | "aud":"Aud", 10 | "email":"Email", 11 | "iss":"Iss", 12 | "sub":"Sub", 13 | "username":"Username" 14 | } 15 | } -------------------------------------------------------------------------------- /core/src/test/resources/openId/dialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 300px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/customer-additional-properties-invalid.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CO134", 3 | "firstName": "Gustav", 4 | "age": 31, 5 | "address": { 6 | "street": "Unter den Linden", 7 | "city": "Berlin" 8 | }, 9 | "illegal": 7 10 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/customer.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CO134", 3 | "firstName": "Gustav", 4 | "age": 31, 5 | "address": { 6 | "street": "Unter den Linden", 7 | "city": "Berlin" 8 | }, 9 | "tags": ["GOLD","PREMIUM"] 10 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/different-types.json: -------------------------------------------------------------------------------- 1 | ["Foo",7,true] -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/invalid-customer.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CO134", 3 | "firstName": "Max Emil Herbert Gustav Michael", 4 | "age": 109, 5 | "address": { 6 | "street": "Unter den gruenen Linden Strasse", 7 | "city": "Berlin" 8 | } 9 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/invalid.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CO134", 3 | "firstName": "Gustav", 4 | "age": 31 5 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/missing-required-properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CO134", 3 | "firstName": "Gustav", 4 | "age": 31, 5 | "address": { 6 | } 7 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/missing-required-property.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CO134", 3 | "firstName": "Gustav", 4 | "age": 31, 5 | "address": { 6 | "street": "Unter den Linden" 7 | } 8 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/nested-objects-arrays-invalid.json: -------------------------------------------------------------------------------- 1 | { 2 | "b": [ 3 | { 4 | "c": ["a","b"] 5 | }, 6 | { 7 | "c": [] 8 | }, 9 | { 10 | "c": ["c",true] 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/nested-objects-arrays.json: -------------------------------------------------------------------------------- 1 | { 2 | "b": [ 3 | { 4 | "c": ["a","b"] 5 | }, 6 | { 7 | "c": [] 8 | }, 9 | { 10 | "c": ["c"] 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/references-customer-invalid.json: -------------------------------------------------------------------------------- 1 | { 2 | "contract": { 3 | "details": "foobar" 4 | } 5 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/references-customer-ok.json: -------------------------------------------------------------------------------- 1 | { 2 | "contract": { 3 | "details": "foo" 4 | } 5 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/references-requests-responses-customer-invalid.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Herbert too Long" 3 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/messages/references-requests-responses-customer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Uwe" 3 | } -------------------------------------------------------------------------------- /core/src/test/resources/openapi/openapi-proxy/no-extensions.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: OpenAPIProxy Test 4 | version: '1.0' 5 | servers: 6 | - url: https://localhost:3000 7 | paths: 8 | /boolean: 9 | get: 10 | parameters: 11 | - in: query 12 | name: truth 13 | schema: 14 | type: boolean 15 | required: false 16 | responses: 17 | '200': 18 | description: OK 19 | post: 20 | requestBody: 21 | content: 22 | application/json: 23 | schema: 24 | $ref: "#/components/schemas/Boolean" 25 | responses: 26 | '200': 27 | description: OK 28 | 29 | components: 30 | schemas: 31 | Boolean: 32 | type: object 33 | properties: 34 | good: 35 | type: boolean -------------------------------------------------------------------------------- /core/src/test/resources/openapi/openapi-proxy/validate-only-security-extensions.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: OpenAPIProxy Test - Validate Security 4 | version: '1.0' 5 | x-membrane-id: validate-security-api 6 | servers: 7 | - url: https://localhost:3000 8 | x-membrane-validation: 9 | security: true 10 | paths: 11 | /boolean: 12 | get: 13 | responses: 14 | '200': 15 | description: OK 16 | 17 | components: 18 | securitySchemes: 19 | openid: 20 | type: openIdConnect 21 | openIdConnectUrl: http://dummy -------------------------------------------------------------------------------- /core/src/test/resources/openapi/openapi-proxy/validate-security-extensions.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: OpenAPIProxy Test - Validate Security 4 | version: '1.0' 5 | x-membrane-id: validate-security-api 6 | servers: 7 | - url: https://localhost:3000 8 | x-membrane-validation: 9 | requests: true 10 | responses: true 11 | security: true 12 | paths: 13 | /boolean: 14 | get: 15 | responses: 16 | '200': 17 | description: OK 18 | 19 | components: 20 | securitySchemes: 21 | openid: 22 | type: openIdConnect 23 | openIdConnectUrl: http://dummy -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/boolean.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | # array.yml and boolean.yml have the same id on purpose! 4 | title: Test API 5 | version: '1.0' 6 | servers: 7 | - url: https://api.server.test/ 8 | paths: 9 | /boolean: 10 | get: 11 | parameters: 12 | - in: query 13 | name: truth 14 | schema: 15 | type: boolean 16 | required: false 17 | responses: 18 | '200': 19 | description: OK 20 | post: 21 | requestBody: 22 | content: 23 | application/json: 24 | schema: 25 | $ref: "#/components/schemas/Boolean" 26 | responses: 27 | '200': 28 | description: OK 29 | 30 | components: 31 | schemas: 32 | Boolean: 33 | type: object 34 | properties: 35 | good: 36 | type: boolean -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/info-3-servers.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Servers 3 API 4 | version: '1.0' 5 | servers: 6 | - url: https://localhost:3000/foo 7 | - url: https://localhost:4000/foo 8 | - url: https://localhost:5000/foo 9 | paths: 10 | /boo: 11 | get: 12 | responses: 13 | '200': 14 | description: OK 15 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/info-no-servers.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: No Servers 4 | version: '1.0' 5 | servers: [] 6 | paths: 7 | /foo: 8 | get: 9 | responses: 10 | '200': 11 | description: OK 12 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/info-servers.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Servers 1 API 4 | version: '1.0' 5 | servers: 6 | - url: https://localhost:3000/base/v2 7 | description: Test System 8 | paths: 9 | /foo: 10 | get: 11 | responses: 12 | '200': 13 | description: OK 14 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/nested-objects-arrays.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Nested Objects and Arrays Test API 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test/ 7 | paths: 8 | /nested: 9 | post: 10 | requestBody: 11 | content: 12 | application/json: 13 | schema: 14 | $ref: "#/components/schemas/A" 15 | responses: 16 | '200': 17 | description: OK 18 | 19 | components: 20 | schemas: 21 | A: 22 | type: object 23 | required: 24 | - b 25 | properties: 26 | b: 27 | type: array 28 | items: 29 | type: object 30 | properties: 31 | c: 32 | type: array 33 | items: 34 | type: string 35 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/nullable.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Nullable Test API 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test/ 7 | paths: 8 | /composition: 9 | post: 10 | responses: 11 | '200': 12 | description: OK 13 | requestBody: 14 | content: 15 | application/json: 16 | schema: 17 | type: object 18 | properties: 19 | email: 20 | type: string 21 | nullable: true 22 | telefon: 23 | type: string 24 | nullable: false 25 | contact: 26 | nullable: true 27 | address: 28 | type: object 29 | nullable: true -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/const-value.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Const Value API 4 | version: 1.0.0 5 | paths: 6 | /const-check: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | type: object 13 | properties: 14 | constantValue: 15 | type: string 16 | const: EXPECTED_VALUE 17 | responses: 18 | '200': 19 | description: Ok 20 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/exclusive-min-max.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Exclusive Minimum and Maximum API 4 | version: 1.0.0 5 | paths: 6 | /range-check: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | type: object 13 | properties: 14 | value: 15 | type: number 16 | exclusiveMinimum: 10 17 | exclusiveMaximum: 100 18 | responses: 19 | '200': 20 | description: Ok 21 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/multiple-types-document.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Simple API 4 | version: 1.0.0 5 | paths: 6 | /foo: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | type: [string, null] 13 | 14 | responses: 15 | '200': 16 | description: Ok 17 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/multiple-types-nested.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Nested Types API 4 | version: 1.0.0 5 | paths: 6 | /nested: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | type: object 13 | properties: 14 | root-object: 15 | type: [object, null] 16 | properties: 17 | string-null-date-time: 18 | type: [string, null] 19 | format: date-time 20 | boolean-null: 21 | type: [boolean, null] 22 | responses: 23 | '200': 24 | description: Ok 25 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/multiple-types.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Simple API 4 | version: 1.0.0 5 | paths: 6 | /foo: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | type: object 13 | properties: 14 | name: 15 | type: [string, null] 16 | responses: 17 | '200': 18 | description: Ok 19 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/number-validation.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Number and Integer Responses API 4 | version: 1.0.0 5 | paths: 6 | /number: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | type: [number, null] 13 | 14 | /integer: 15 | post: 16 | requestBody: 17 | content: 18 | application/json: 19 | schema: 20 | type: [integer, null] 21 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/references/deep/deep.oas.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Deep Refs 4 | version: 1.0.0 5 | servers: 6 | - url: http://localhost:3000 7 | paths: 8 | /users: 9 | $ref: 'paths/users.oas.yaml#/paths/~1users' -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/references/deep/paths/users.oas.yaml: -------------------------------------------------------------------------------- 1 | paths: 2 | /users: 3 | post: 4 | description: Demo 5 | requestBody: 6 | content: 7 | application/json: 8 | schema: 9 | $ref: '../types/user.schema.yaml#/components/schemas/User' 10 | responses: 11 | '200': 12 | description: Ok -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/references/deep/types/user.schema.yaml: -------------------------------------------------------------------------------- 1 | components: 2 | schemas: 3 | User: 4 | type: object 5 | required: 6 | - email 7 | properties: 8 | id: 9 | type: integer 10 | email: 11 | type: string 12 | format: email 13 | createdAt: 14 | type: string 15 | format: date-time -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/references/request-reference.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Demo 4 | version: 1.0.0 5 | servers: 6 | - url: http://localhost:3000 7 | paths: 8 | /users: 9 | $ref: 'request-schema.yaml#/paths/~1users' -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/references/request-schema.yaml: -------------------------------------------------------------------------------- 1 | paths: 2 | /users: 3 | post: 4 | description: Demo 5 | requestBody: 6 | content: 7 | application/json: 8 | schema: 9 | $ref: 'user-schema.yaml#/components/schemas/User' 10 | responses: 11 | '200': 12 | description: Ok -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/references/user-schema.yaml: -------------------------------------------------------------------------------- 1 | components: 2 | schemas: 3 | User: 4 | type: object 5 | required: 6 | - email 7 | properties: 8 | id: 9 | type: integer 10 | email: 11 | type: string 12 | format: email 13 | createdAt: 14 | type: string 15 | format: date-time -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/request-reference.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Demo 4 | version: 1.0.0 5 | servers: 6 | - url: http://localhost:3000 7 | paths: 8 | /users: 9 | $ref: 'request-schema.yaml#/paths/~1users' -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/request-schema.yaml: -------------------------------------------------------------------------------- 1 | paths: 2 | /users: 3 | post: 4 | description: Demo 5 | requestBody: 6 | content: 7 | application/json: 8 | schema: 9 | $ref: 'user-schema.yaml#/components/schemas/User' 10 | responses: 11 | '200': 12 | description: Ok -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/simple-reference.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: Einfache API 4 | version: 1.0.0 5 | paths: 6 | /users: 7 | post: 8 | requestBody: 9 | content: 10 | application/json: 11 | schema: 12 | $ref: '/openapi/specs/oas31/user-schema.yaml#/components/schemas/User' 13 | responses: 14 | '200': 15 | description: Ok 16 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/oas31/user-schema.yaml: -------------------------------------------------------------------------------- 1 | components: 2 | schemas: 3 | User: 4 | type: object 5 | required: 6 | - email 7 | properties: 8 | id: 9 | type: integer 10 | email: 11 | type: string 12 | format: email 13 | createdAt: 14 | type: string 15 | format: date-time -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/paths/api-a-path-foo.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: API A Path foo 4 | version: '1.0' 5 | servers: 6 | - url: https://api.predic8.de/foo 7 | paths: 8 | /doit: 9 | get: 10 | responses: 11 | '200': 12 | description: OK -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/paths/api-b-path-foo.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: API B Path foo 4 | version: '1.0' 5 | servers: 6 | - url: https://api.predic8.de/foo 7 | paths: 8 | /doit: 9 | get: 10 | responses: 11 | '200': 12 | description: OK -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/paths/api-c-multiple-server-urls.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: API A Path foo 4 | version: '1.0' 5 | servers: 6 | - url: https://api1.predic8.de/foo 7 | - url: https://api2.predic8.de/foo 8 | paths: 9 | /doit: 10 | get: 11 | responses: 12 | '200': 13 | description: OK -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/references-request.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.1' 2 | info: 3 | title: References Request Test 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test/ 7 | paths: 8 | /ref-request: 9 | post: 10 | requestBody: 11 | $ref: "#/components/requestBodies/CustomerRequest" 12 | responses: 13 | 206: 14 | description: No Content 15 | 16 | components: 17 | requestBodies: 18 | CustomerRequest: 19 | content: 20 | application/json: 21 | schema: 22 | $ref: "#/components/schemas/Customer" 23 | schemas: 24 | Customer: 25 | type: object 26 | properties: 27 | name: 28 | type: string 29 | maxLength: 5 30 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/references-response.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.1' 2 | info: 3 | title: References Response Test 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test/ 7 | paths: 8 | /ref-response: 9 | get: 10 | responses: 11 | 200: 12 | $ref: "#/components/responses/CustomerResponse" 13 | 14 | components: 15 | responses: 16 | CustomerResponse: 17 | description: Ok 18 | content: 19 | application/json: 20 | schema: 21 | $ref: "#/components/schemas/Customer" 22 | 23 | schemas: 24 | Customer: 25 | type: object 26 | properties: 27 | name: 28 | type: string 29 | maxLength: 5 30 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/rewrite-integration-test.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Rewriting Test 4 | version: '1.0' 5 | servers: 6 | - url: http://localhost:3000/api/v2 7 | description: URL Path Rewriting Test 8 | paths: 9 | /foo: 10 | get: 11 | responses: 12 | '200': 13 | description: OK 14 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/security/and-or.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: And and Or Security API 4 | version: '1.0' 5 | servers: 6 | - url: https://api.predic8.de 7 | paths: 8 | /both: 9 | get: 10 | security: 11 | - http: [] 12 | api-key: [] 13 | responses: 14 | '200': 15 | description: OK 16 | /one: 17 | get: 18 | security: 19 | - http: [] 20 | - api-key: [] 21 | responses: 22 | '200': 23 | description: OK 24 | 25 | components: 26 | securitySchemes: 27 | http: 28 | type: http 29 | scheme: basic 30 | api-key: 31 | type: apiKey 32 | name: "x-api-key" 33 | in: header -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/security/bearer-jwt.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: HTTP Bearer JWT API Test Sample 4 | version: '1.0' 5 | servers: 6 | - url: https://api.predic8.de/v1 7 | paths: 8 | /foo: 9 | get: 10 | security: 11 | - jwt: 12 | - read 13 | responses: 14 | '200': 15 | description: OK 16 | 17 | components: 18 | securitySchemes: 19 | jwt: 20 | type: http 21 | scheme: bearer 22 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/security/http-basic.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: HTTP Basic API Test Sample 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test/v1 7 | security: 8 | - basic-auth: [] 9 | paths: 10 | /foo: 11 | get: 12 | responses: 13 | '200': 14 | description: OK 15 | 16 | components: 17 | securitySchemes: 18 | basic-auth: 19 | type: http 20 | scheme: basic 21 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/security/no-security-schemes.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Security Scheme Tests API 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test 7 | paths: 8 | /no-scheme: 9 | get: 10 | security: 11 | - unknown: [] 12 | responses: 13 | '200': 14 | description: OK 15 | 16 | components: {} 17 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/security/openid.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: NPE Error Test API 4 | version: '1.0' 5 | servers: 6 | - url: https://api.server.test/ 7 | paths: 8 | /users: 9 | get: 10 | tags: 11 | - User 12 | summary: Rückgabe der Nutzerdaten eines Users 13 | operationId: getUser 14 | security: 15 | - openId: 16 | - user_get 17 | responses: 18 | '200': 19 | description: Ok 20 | 21 | components: 22 | securitySchemes: 23 | openId: 24 | type: openIdConnect 25 | openIdConnectUrl: /.well-known/openid-configuration -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/servers-without-slash.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Servers without Slash Test API 4 | version: '1.0' 5 | servers: 6 | - url: https://localhost:3000 7 | paths: 8 | /foo: 9 | get: 10 | responses: 11 | '200': 12 | description: OK 13 | -------------------------------------------------------------------------------- /core/src/test/resources/openapi/specs/statuscodes.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.3' 2 | info: 3 | title: Statuscodes API 4 | version: '1.0' 5 | servers: 6 | - url: https://api.predic8.de 7 | paths: 8 | /no-content: 9 | post: 10 | responses: 11 | '204': 12 | description: OK 13 | 14 | -------------------------------------------------------------------------------- /core/src/test/resources/order.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/proxies-using-spring-refs.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/src/test/resources/request-chunked-soap.msg: -------------------------------------------------------------------------------- 1 | POST /axis2/services/BLZService HTTP/1.1 2 | Content-Type: application/soap+xml; charset=UTF-8; action="http://thomas-bayer.com/blz/BLZServicePortType/getBankRequest" 3 | User-Agent: Axis2 4 | Host: localhost:7000 5 | Transfer-Encoding: chunked 6 | 7 | ff 8 | 66762332 9 | 0 10 | 11 | -------------------------------------------------------------------------------- /core/src/test/resources/request.txt: -------------------------------------------------------------------------------- 1 | POST /axis2/services/BLZService HTTP/1.1 2 | Host: www.thomas-bayer.com:80 3 | User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 4 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 5 | Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 6 | Accept-Encoding: gzip, deflate 7 | Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8 | Keep-Alive: 115 9 | Connection: keep-alive 10 | X-Forwarded-For: 0:0:0:0:0:0:0:1 11 | Content-Length: 237 12 | SOAPAction: 13 | Content-Type: text/xml;charset=UTF-8 14 | 15 | 17 | 18 | 19 | 37050198 20 | 21 | 22 | -------------------------------------------------------------------------------- /core/src/test/resources/resolver/3.xsd: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /core/src/test/resources/resolver/4.xsd: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /core/src/test/resources/resolver/5.xsd: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /core/src/test/resources/resolver/6.xsd: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /core/src/test/resources/resolver/7.xsd: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /core/src/test/resources/response-205-reset.http: -------------------------------------------------------------------------------- 1 | HTTP/1.1 205 Reset Content 2 | Server: Membrane 3 | Attention: Keep the two empty lines below! 4 | 5 | -------------------------------------------------------------------------------- /core/src/test/resources/response-no-content-length.txt: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache-Coyote/1.1 3 | Content-Type: text/html;charset=UTF-8 4 | Content-Language: de-DE 5 | Date: Wed, 15 Jul 2009 15:19:45 GMT 6 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /core/src/test/resources/response-no-content.http: -------------------------------------------------------------------------------- 1 | HTTP/1.1 204 No Content 2 | Server: Membrane 3 | Attention: Keep the two empty lines below! 4 | 5 | -------------------------------------------------------------------------------- /core/src/test/resources/response-unchunked-image.msg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/response-unchunked-image.msg -------------------------------------------------------------------------------- /core/src/test/resources/singlelinejsonsample.json: -------------------------------------------------------------------------------- 1 | {"Image": { "Width":800, "Height":600, "Title":"View from 15th Floor", "Thumbnail": { "Url":"http:\/\/scd.mm-b1.yimg.com\/image\/481989943", "Height": 125, "Width": "100" }, "IDs":[ 116, 943, 234, 38793 ] } } -------------------------------------------------------------------------------- /core/src/test/resources/soap-sample/soap-request-bonn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Bonn 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/soap-sample/soap-request-london.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | London 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/soap-sample/soap-request-new-york.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | New York 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/soap-sample/wrong-request.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Bonn 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/test/resources/soapOperationExtractor/getBuecher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Dan Brown 6 | 100 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/soapOperationExtractor/getBuecherWithHeader.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | me 4 | 5 | 6 | 7 | Dan Brown 8 | 100 9 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/test/resources/soapOperationExtractor/notSoap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 |
  • Apple
  • 4 |
  • Banana
  • 5 |
    6 |
    -------------------------------------------------------------------------------- /core/src/test/resources/ssl-rsa-pub.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/ssl-rsa-pub.keystore -------------------------------------------------------------------------------- /core/src/test/resources/ssl-rsa-pub2.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/ssl-rsa-pub2.keystore -------------------------------------------------------------------------------- /core/src/test/resources/ssl-rsa.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/ssl-rsa.keystore -------------------------------------------------------------------------------- /core/src/test/resources/ssl-rsa2.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/ssl-rsa2.keystore -------------------------------------------------------------------------------- /core/src/test/resources/strip-soap-envelope.xsl: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/ArticleType.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/CurrencyType.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleRequest-bom.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleRequest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleRequestInvalid-bom.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleRequestInvalid.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleResponse.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
    5 | ?XXX? 6 | ?XXX? 7 | 8 | 999.99 9 | 10 | 11 | EUR 12 | 13 | 14 | 15 | AB-12345 16 |
    17 |
    18 |
    19 |
    -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleResponse.xml.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/validation/articleResponse.xml.br -------------------------------------------------------------------------------- /core/src/test/resources/validation/articleResponse.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/validation/articleResponse.xml.gz -------------------------------------------------------------------------------- /core/src/test/resources/validation/invalid-order.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/invalidEmail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gaprindashvili@predic8.de 6 | gaprindashvili@predic8.de 7 | 8 | 9 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/invalidEmail2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gaprindashvili@predic8.de 6 | 7 | 8 | gaprindashvili@predic8.com 9 | 10 | 11 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/invalidEmail3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gaprindashvili@predic8.de 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/order.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core/src/test/resources/validation/validEmail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gaprindashvili@predic8.de 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/test/resources/wsdlValidator/soapFaultCustom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | xsl:apply-templates select="node()" /> 10 | ' 11 | -------------------------------------------------------------------------------- /core/src/test/resources/wsdlValidator/soapFaultFromSpec.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | SOAP-ENV:Server 6 | Server Error 7 | 8 | 9 | 10 | My application didn't work 11 | 12 | 13 | 1001 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/src/test/resources/xml/convert.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | aaas42 4 | üöüöüö 5 | -------------------------------------------------------------------------------- /core/src/test/resources/xml/convert_without_encoding.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/core/src/test/resources/xml/convert_without_encoding.xml -------------------------------------------------------------------------------- /core/src/test/resources/xml/entity-expansion.lmx: -------------------------------------------------------------------------------- 1 | >oof/oof< >] > ";l&;l&;l&;l&;l&;l&;l&;l&" m YTITNE!< > ";k&;k&;k&;k&;k&;k&;k&;k&" l YTITNE!< > ";j&;j&;j&;j&;j&;j&;j&;j&" k YTITNE!< > ";i&;i&;i&;i&;i&;i&;i&;i&" j YTITNE!< > ";h&;h&;h&;h&;h&;h&;h&;h&" i YTITNE!< > ";g&;g&;g&;g&;g&;g&;g&;g&" h YTITNE!< > ";f&;f&;f&;f&;f&;f&;f&;f&" g YTITNE!< > ";e&;e&;e&;e&;e&;e&;e&;e&" f YTITNE!< > ";d&;d&;d&;d&;d&;d&;d&;d&" e YTITNE!< > ";c&;c&;c&;c&;c&;c&;c&;c&" d YTITNE!< > ";b&;b&;b&;b&;b&;b&;b&;b&" c YTITNE!< > ";a&;a&;a&;a&;a&;a&;a&;a&" b YTITNE!< > "0987654321" a YTITNE!< [ oof EPYTCOD!< -------------------------------------------------------------------------------- /core/src/test/resources/xml/entity-external.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | ]> 6 | &c; -------------------------------------------------------------------------------- /core/src/test/resources/xml/not-wellformed.xml: -------------------------------------------------------------------------------- 1 | < -------------------------------------------------------------------------------- /core/src/test/resources/xml/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | Preparation 11 | 12 | 13 | 14 | Introduction 15 | Stuff about project 16 | 25 17 | More introductory stuff about project 18 | value value 19 | 20 | -------------------------------------------------------------------------------- /core/src/test/resources/xml/project_template.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | Preparation 10 | 11 | 12 | 13 | ${property.title} 14 | Stuff about project 15 | 16 | More introductory stuff about project 17 | 18 | -------------------------------------------------------------------------------- /core/src/test/resources/xml/xsd-with-bom.xsd: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /distribution/conf/convert-request-to-new-version.xslt: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /distribution/conf/convert-response-to-old-version.xslt: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /distribution/conf/k8s-proxies.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/conf/k8s-proxies.xml -------------------------------------------------------------------------------- /distribution/conf/keys.txt: -------------------------------------------------------------------------------- 1 | # API KEYS FOR DEMONSTRATION PURPOSES ONLY. 2 | 5XF27:finance,internal 3 | 73D29: accounting, management 4 | 89D5C: internal, 5 | -------------------------------------------------------------------------------- /distribution/conf/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /distribution/conf/security-api-v1.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Security Demo API 4 | version: '1.0' 5 | 6 | servers: 7 | - url: http://localhost:2000/security-api/v1/ 8 | 9 | paths: 10 | /: 11 | get: 12 | security: 13 | - apikey: [] 14 | responses: 15 | 200: 16 | description: OK 17 | 18 | components: 19 | securitySchemes: 20 | apikey: 21 | type: apiKey 22 | name: X-Api-Keyz 23 | in: query -------------------------------------------------------------------------------- /distribution/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:21-bookworm 2 | LABEL authors="info@predic8.de" 3 | ARG USERNAME=membrane 4 | ARG USER_UID=1000 5 | ARG USER_GID=$USER_UID 6 | 7 | COPY release-bin . 8 | RUN apt-get update \ 9 | && apt-get install unzip 10 | RUN unzip membrane-api-gateway-*.zip -x */examples* */tutorials* \ 11 | && rm membrane-api-gateway-*.zip \ 12 | && mv membrane-api-gateway-* /opt/membrane 13 | COPY log4j2.xml /opt/membrane/conf/. 14 | 15 | # Create the user 16 | RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME 17 | 18 | USER $USERNAME 19 | WORKDIR /opt/membrane 20 | ENTRYPOINT ["./membrane.sh"] 21 | -------------------------------------------------------------------------------- /distribution/docker/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /distribution/examples/.gitignore: -------------------------------------------------------------------------------- 1 | # Don't accidentally commit log files 2 | */*.log 3 | */*/*.log 4 | -------------------------------------------------------------------------------- /distribution/examples/api-testing/api-greasing/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/api-testing/api-greasing/requests.http: -------------------------------------------------------------------------------- 1 | POST http://localhost:2000 2 | Content-Type: application/json 3 | 4 | { 5 | "name": "John Doe", 6 | "age": 30, 7 | "email": "johndoe@example.com", 8 | "address": { 9 | "street": "123 Main St", 10 | "city": "Anytown", 11 | "state": "CA", 12 | "zip": "12345" 13 | } 14 | } -------------------------------------------------------------------------------- /distribution/examples/deployment/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM predic8/membrane 2 | 3 | COPY proxies.xml /opt/membrane/conf/ 4 | 5 | EXPOSE 2000 6 | 7 | ENTRYPOINT ["/opt/membrane/membrane.sh"] 8 | -------------------------------------------------------------------------------- /distribution/examples/deployment/docker/proxies.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/extending-membrane/embedding-java/README.md: -------------------------------------------------------------------------------- 1 | # Embedding Membrane API Gateway into your own Application - Example 2 | 3 | This example shows how to integrate _Membrane API Gateway_ into your own java application. 4 | 5 | ## Running the example 6 | 7 | 1. Open the project in this folder in your Java IDE. 8 | 2. Look at the class `EmbeddingJava` and run it. 9 | 3. Run command: 10 | ``` 11 | curl -v http://localhost:4000 12 | ``` 13 | 4. You can see on the console, that the `X-Hello` header was added -------------------------------------------------------------------------------- /distribution/examples/extending-membrane/embedding-java/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /distribution/examples/extending-membrane/file-exchangestore/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/examples/extending-membrane/service-discovery-with-etcd/configurator/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /distribution/examples/extending-membrane/service-discovery-with-etcd/publisher/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | /myService 11 | 12 | exc.response = Response.ok("Hello").build() 13 | RETURN 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /distribution/examples/graphql/graphql-validation/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/examples/loadbalancing/3-client/client.properties: -------------------------------------------------------------------------------- 1 | clusterManager=http://localhost:9010/clustermanager 2 | #key=6f488a642b740fb70c5250987a284dc0 -------------------------------------------------------------------------------- /distribution/examples/logging/README.md: -------------------------------------------------------------------------------- 1 | # Logging Requests and Responses 2 | 3 | |Example|Description| 4 | |---|---| 5 | |[Console](console)|Log into the console or log file | 6 | |[CSV](csv)|Log into a separate CSV file| 7 | |[JSON](json)|Log as JSON| 8 | |[Database](jdbc-database)|Logging into request and response statistics into a database| 9 | 10 | -------------------------------------------------------------------------------- /distribution/examples/logging/console/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/examples/logging/csv/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /distribution/examples/logging/json/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /distribution/examples/message-transformation/json2xml/call-api.sh: -------------------------------------------------------------------------------- 1 | curl -d @customers.json http://localhost:2000 -H "Content-Type: application/json" -------------------------------------------------------------------------------- /distribution/examples/message-transformation/json2xml/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /distribution/examples/message-transformation/json2xml/requests.http: -------------------------------------------------------------------------------- 1 | # Sample Requests 2 | # 3 | # 1. Start membrane.cmd or membrane.sh 4 | # 2. Execute the requests in this document using: 5 | # - IntelliJ (Plugin: https://plugins.jetbrains.com/plugin/13121-http-client) or 6 | # - Visual Studio Code (Plugin https://marketplace.visualstudio.com/items?itemName=humao.rest-client) 7 | # - Or try the curl statements in the README.md 8 | # 9 | 10 | POST http://localhost:2000 11 | Content-Type: application/json 12 | 13 | < customers.json 14 | 15 | 16 | -------------------------------------------------------------------------------- /distribution/examples/message-transformation/replace/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /distribution/examples/message-transformation/transformation-using-javascript/order.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 324, 3 | "items": [ 4 | { 5 | "article": "Tea", 6 | "quantity": 2, 7 | "price": 1.87 8 | }, 9 | { 10 | "article": "Butter", 11 | "quantity": 12, 12 | "price": 0.99 13 | }, 14 | { 15 | "article": "Coffee", 16 | "quantity": 3, 17 | "price": 5.20 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /distribution/examples/message-transformation/xml2json/jobs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | Preparation 9 | John/long_work.txt 10 | 11 | 12 | Presentation 13 | John/not_so_long_work.txt 14 | 15 | -------------------------------------------------------------------------------- /distribution/examples/message-transformation/xml2json/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/opentelemetry/resources/otel_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/monitoring-tracing/opentelemetry/resources/otel_example.png -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/opentelemetry/resources/otel_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/monitoring-tracing/opentelemetry/resources/otel_sample.png -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/prometheus/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM predic8/membrane 2 | 3 | COPY proxies.xml /opt/membrane/conf/ 4 | 5 | EXPOSE 2000-2003 6 | 7 | ENTRYPOINT ["/opt/membrane/membrane.sh"] 8 | -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/prometheus/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.44.0 6 | container_name: prometheus 7 | ports: 8 | - "9090:9090" 9 | volumes: 10 | - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml 11 | 12 | grafana: 13 | image: grafana/grafana:9.5.2 14 | container_name: grafana 15 | ports: 16 | - "3000:3000" 17 | restart: unless-stopped 18 | environment: 19 | - GF_SECURITY_ADMIN_USER=admin 20 | - GF_SECURITY_ADMIN_PASSWORD=admin 21 | volumes: 22 | - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources 23 | 24 | membrane: 25 | build: 26 | context: . 27 | dockerfile: Dockerfile 28 | container_name: membrane 29 | ports: 30 | - "2000-2003:2000-2003" -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/prometheus/grafana/provisioning/datasources/datasource.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | datasources: 3 | - name: Prometheus 4 | type: prometheus 5 | access: proxy 6 | url: http://prometheus:9090 7 | isDefault: true -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/prometheus/prometheus-grafana-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/monitoring-tracing/prometheus/prometheus-grafana-example.png -------------------------------------------------------------------------------- /distribution/examples/monitoring-tracing/prometheus/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | scrape_configs: 2 | - job_name: 'MembraneMetrics' 3 | metrics_path: '/actuator/prometheus' 4 | scrape_interval: 3s 5 | static_configs: 6 | - targets: ['membrane:2000'] 7 | labels: 8 | application: 'Membrane' -------------------------------------------------------------------------------- /distribution/examples/openapi/openapi-proxy/api-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/openapi/openapi-proxy/api-overview.png -------------------------------------------------------------------------------- /distribution/examples/openapi/openapi-proxy/post-products.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/openapi/openapi-proxy/post-products.png -------------------------------------------------------------------------------- /distribution/examples/openapi/openapi-proxy/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/examples/openapi/openapi-proxy/swagger-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/openapi/openapi-proxy/swagger-ui.png -------------------------------------------------------------------------------- /distribution/examples/openapi/openapi-proxy/try-it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/openapi/openapi-proxy/try-it.png -------------------------------------------------------------------------------- /distribution/examples/openapi/validation-security/README.md: -------------------------------------------------------------------------------- 1 | # Request & Response Validation against OpenAPI - Security Validation 2 | 3 | --- 4 | See: 5 | - [openapi](https://membrane-soa.org/api-gateway-doc/current/configuration/reference/openapi.htm) reference -------------------------------------------------------------------------------- /distribution/examples/openapi/validation-security/requests.http: -------------------------------------------------------------------------------- 1 | ### Successful Authentication. Correct api-key and location. 2 | GET http://localhost:2000/security-api/v1/?X-Api-Key=demo-key-foobar 3 | 4 | ### Validation Failure. Correct api-key, but wrong location. 5 | GET http://localhost:2000/security-api/v1/ 6 | X-Api-Key: demo-key-foobar 7 | 8 | -------------------------------------------------------------------------------- /distribution/examples/openapi/validation-security/security-api-v1.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Security Demo API 4 | version: '1.0' 5 | 6 | servers: 7 | - url: http://localhost:2000/security-api/v1/ 8 | 9 | paths: 10 | /: 11 | get: 12 | security: 13 | - apikey: [] 14 | responses: 15 | 200: 16 | description: OK 17 | 18 | components: 19 | securitySchemes: 20 | apikey: 21 | type: apiKey 22 | name: "X-API-KEY" 23 | in: query -------------------------------------------------------------------------------- /distribution/examples/openapi/validation-simple/curl.sh: -------------------------------------------------------------------------------- 1 | echo "------------------- Valid request => 200 Ok -------------------\n" 2 | 3 | curl http://localhost:2000/persons\ 4 | -H 'content-type: application/json' \ 5 | -d '{"name": "Johannes Gutenberg","age": 78}' -v 6 | 7 | 8 | echo "\n\n------------------- Invalid => 400 Bad Content ----------------\n" 9 | 10 | curl http://localhost:2000/persons \ 11 | -H 'content-type: application/json' \ 12 | -d '{"name": "Bo","email": "mailatme","age": -1}' -v -------------------------------------------------------------------------------- /distribution/examples/openapi/validation-simple/requests.http: -------------------------------------------------------------------------------- 1 | # 2 | # Request samples can be executed: 3 | # 4 | # a.) In Visual Studio Code with the HTTP Client Plugin 5 | # See: https://marketplace.visualstudio.com/items?itemName=mkloubert.vscode-http-client 6 | # 7 | # b.) In IntelliJ with the HTTP Client Plugin 8 | # See: https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html 9 | # 10 | 11 | 12 | ### Valid request, should work 13 | 14 | POST http://localhost:2000/persons 15 | Content-Type: application/json 16 | 17 | { 18 | "name": "Johannes Gutenberg", 19 | "age": 78 20 | } 21 | 22 | ### Invalid request, should fail 23 | 24 | POST http://localhost:2000/persons 25 | Content-Type: application/json 26 | 27 | { 28 | "name": "Bo", 29 | "email": "mailatme", 30 | "age": -1 31 | } -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/content-based-router/express.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/content-based-router/import.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/content-based-router/order.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/internalproxy/express.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/internalproxy/normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/internalproxy/requests.http: -------------------------------------------------------------------------------- 1 | POST http://localhost:2000 2 | Content-Type: text/xml 3 | 4 | 5 | 6 | ### 7 | 8 | POST http://localhost:2000 9 | Content-Type: text/xml 10 | 11 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/rewriter/README.md: -------------------------------------------------------------------------------- 1 | # Rewriter 2 | 3 | - [REGEX URL Rewriter](regex) 4 | - [OpenAPI Base Path Rewriter](openapi) -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/rewriter/openapi/demo-api-v1.yml: -------------------------------------------------------------------------------- 1 | openapi: '3.0.2' 2 | info: 3 | title: Demo API 4 | version: '1.0' 5 | 6 | servers: 7 | - url: http://localhost:2000/demo-api/v1/ 8 | 9 | paths: 10 | /bar: 11 | get: 12 | responses: 13 | 200: 14 | description: OK -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/rewriter/openapi/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/rewriter/regex/README.md: -------------------------------------------------------------------------------- 1 | # REGEX URL Rewriter 2 | With the plugin you can rewrite URLs by regular expressions. 3 | 4 | 5 | ### Running the example 6 | 7 | In this example we will rewrite a simple URL. Take a look at the URL: 8 | 9 | https://api.predic8.de/shop/v2/products/ 10 | 11 | We want to access this API with the path `store/products/`. To do this we have to replace the part `/store/` from the context path with `/shop/v2`. We can achieve this by using the rewriter plugin as follows: 12 | 13 | 1. Go to the `examples/routing-traffic/rewriter/regex` directory. 14 | 15 | 2. Execute `membrane.cmd` 16 | 17 | 3. Open the URL http://localhost:2000/store/products/ in your browser. 18 | --- 19 | See: 20 | - [rewriter](https://membrane-soa.org/api-gateway-doc/current/configuration/reference/rewriter.htm) reference -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/rewriter/regex/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/routing-traffic/throttle/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/scripting/groovy/order.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 731, 3 | "date": "7 Apr 2023", 4 | "customer": 17, 5 | "items": [ 6 | { 7 | "quantity": 5, 8 | "description": "Oolong", 9 | "price": 5.90 10 | }, 11 | { 12 | "quantity": 2, 13 | "description": "Assam", 14 | "price": 2.95 15 | }, 16 | { 17 | "quantity": 1, 18 | "description": "Darjeeling", 19 | "price": 2.95 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /distribution/examples/scripting/javascript/order.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 731, 3 | "date": "7 Apr 2023", 4 | "customer": 17, 5 | "items": [ 6 | { 7 | "quantity": 5, 8 | "description": "Oolong", 9 | "price": 5.90 10 | }, 11 | { 12 | "quantity": 2, 13 | "description": "Assam", 14 | "price": 2.95 15 | }, 16 | { 17 | "quantity": 1, 18 | "description": "Darjeeling", 19 | "price": 2.95 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /distribution/examples/scripting/javascript/requests.http: -------------------------------------------------------------------------------- 1 | GET http://localhost:2000 2 | 3 | ### 4 | 5 | POST http://localhost:2010 6 | Content-Type: application/json 7 | 8 | { 9 | "id": 731, 10 | "date": "7 Apr 2023", 11 | "customer": 17, 12 | "items": [ 13 | { 14 | "quantity": 5, 15 | "description": "Oolong", 16 | "price": 5.90 17 | }, 18 | { 19 | "quantity": 2, 20 | "description": "Assam", 21 | "price": 2.95 22 | }, 23 | { 24 | "quantity": 1, 25 | "description": "Darjeeling", 26 | "price": 2.95 27 | } 28 | ] 29 | } 30 | 31 | ### 32 | 33 | GET http://localhost:2020 -------------------------------------------------------------------------------- /distribution/examples/security/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/README.md -------------------------------------------------------------------------------- /distribution/examples/security/access-control-list/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /distribution/examples/security/api-key/apikey-openapi/demo-keys.txt: -------------------------------------------------------------------------------- 1 | # Simple key without any scope 2 | 111 3 | # Keys associated with roles/scopes 4 | 222: write -------------------------------------------------------------------------------- /distribution/examples/security/api-key/jdbc-api-key-store/insert_apikeys.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO key (apikey) 2 | VALUES ('3c7f6c34-89e6-4b4a-9dfb-708f8c28ef3d'), 3 | ('7842b294-5d58-4d29-914e-f84ec9266d3e'), 4 | ('c42e9ae1-4d4a-42ad-8b49-216912c8eb82'), 5 | ('unsecure2000'), 6 | ('flower2025'); 7 | 8 | INSERT INTO scope (apikey, scope) 9 | VALUES ('3c7f6c34-89e6-4b4a-9dfb-708f8c28ef3d', 'scope-1'), 10 | ('7842b294-5d58-4d29-914e-f84ec9266d3e', 'read'), 11 | ('c42e9ae1-4d4a-42ad-8b49-216912c8eb82', 'write'), 12 | ('unsecure2000', 'admin'), 13 | ('flower2025', 'read'); -------------------------------------------------------------------------------- /distribution/examples/security/api-key/rbac/demo-keys.txt: -------------------------------------------------------------------------------- 1 | # API KEYS ARE FOR DEMONSTRATION PURPOSES ONLY! 2 | # Replace them with secure production values like UUIDs 3 | 4 | # Format: 5 | # 6 | # : 7 | 8 | P8MBR # Simple key without any scope 9 | 10 | # Keys associated with roles/scopes 11 | key_321_abc: admin 12 | 3141: finance 13 | 123456789: finance, accounting 14 | 7a26cae9-ed29-40b3-bc99-5b1914bb8498: read, write -------------------------------------------------------------------------------- /distribution/examples/security/api-key/rbac/requests.http: -------------------------------------------------------------------------------- 1 | # Branch depending on scopes 2 | # See demo-keys.txt 3 | GET / HTTP/1.1 4 | Host: localhost:3000 5 | X-Key: 123456789 6 | ### 7 | 8 | GET / HTTP/1.1 9 | Host: localhost:3000 10 | X-Key: key_321_abc 11 | ### 12 | 13 | # Access will fail, no valid API key provided 14 | GET / HTTP/1.1 15 | Host: localhost:3000 16 | -------------------------------------------------------------------------------- /distribution/examples/security/api-key/simple/requests.http: -------------------------------------------------------------------------------- 1 | # 1. Access denied. Not Authenticated. No API key was provided on a resource that requires it. 2 | GET / 3 | Host: localhost:2000 4 | 5 | ### 6 | 7 | # 2. Access denied. Not Authorized. The API key provided was invalid. 8 | GET / 9 | Host: localhost:2000 10 | X-Api-Key: 98765 11 | 12 | ### 13 | 14 | # 3. Access granted. A valid API key was provided, we can access this endpoint. 15 | GET / 16 | Host: localhost:2000 17 | X-Api-Key: demokey 18 | 19 | ### 20 | 21 | # 4. We can provide the key through query parameters as well. 22 | GET /?api-key=demokey 23 | Host: localhost:2000 24 | 25 | ### -------------------------------------------------------------------------------- /distribution/examples/security/basic-auth/README.md: -------------------------------------------------------------------------------- 1 | # Basic Authentication 2 | 3 | These examples demonstrate how to protect an API or a Web application using __HTTP Basic Authentication__, utilizing a wide range of techniques to load the user data. 4 | 5 | --- 6 | - [Simple](simple) - proxies.xml inline data or htpasswd as data source. 7 | - [Database](datbase) - JDBC as data source. 8 | 9 | --- 10 | See: 11 | - [basicAuthentication](https://www.membrane-soa.org/api-gateway-doc/current/configuration/reference/basicAuthentication.htm) reference -------------------------------------------------------------------------------- /distribution/examples/security/basic-auth/database/run_h2.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | call ./h2/bin/h2.bat 3 | -------------------------------------------------------------------------------- /distribution/examples/security/basic-auth/database/run_h2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | bash ./h2/bin/h2.sh 3 | 4 | -------------------------------------------------------------------------------- /distribution/examples/security/basic-auth/simple/.htpasswd: -------------------------------------------------------------------------------- 1 | membrane:$5$9d3c06e19528aebb$cZBA3E3SdoUvk865.WyPA5iNUEA7uwDlDX7D5Npkh8/ 2 | john:$5$99a6391616158b48$PqFPn9f/ojYdRcu.TVsdKeeRHKwbWApdEypn6wlUQn5 -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_array_size.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": [ 3 | 1, 4 | 2, 5 | true, 6 | "Four" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_depth.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": { 3 | "b": { 4 | "c": { 5 | "d": "dv" 6 | } 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_key_length.json: -------------------------------------------------------------------------------- 1 | { 2 | "Key too long": "av" 3 | } 4 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_object_size.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": "av", 3 | "b": "bv", 4 | "c": "cv", 5 | "d": "dv" 6 | } 7 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_size.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": "av", 3 | "b": [ 4 | 2, 5 | "Tests", 6 | { 7 | "c": "too" 8 | } 9 | ], 10 | "d": { 11 | "e": "many", 12 | "f": "chars" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_string_length.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": "Exceeds max string length" 3 | } 4 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/max_tokens.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": {}, 3 | "b": [ 4 | 2, 5 | "Tests", 6 | { 7 | "c": "cv" 8 | } 9 | ], 10 | "d": { 11 | "e": { 12 | "f": "fv" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /distribution/examples/security/json-protection/requests/valid.json: -------------------------------------------------------------------------------- 1 | { 2 | "a": "av", 3 | "b": [ 4 | 2, 5 | "Tests", 6 | { 7 | "c": "cv" 8 | } 9 | ], 10 | "d": { 11 | "e": { 12 | "f": "fv" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /distribution/examples/security/jwt/apikey-to-jwt-conversion/demo-keys.txt: -------------------------------------------------------------------------------- 1 | # API KEYS ARE FOR DEMONSTRATION PURPOSES ONLY! 2 | # Replace them with secure production values like UUIDs 3 | 4 | 123456789: finance, accounting 5 | 7a26cae9-ed29-40b3-bc99-5b1914bb8498: read, write -------------------------------------------------------------------------------- /distribution/examples/security/jwt/apikey-to-jwt-conversion/requests.http: -------------------------------------------------------------------------------- 1 | ### Fetch JWT 2 | GET / HTTP/1.1 3 | Host: localhost:2000 4 | X-Api-Key: 123456789 5 | 6 | // Save the JWT for the next request 7 | > {% client.global.set("jwt", response.body); %} 8 | 9 | ### Access JWT Protected Resource 10 | GET / HTTP/1.1 11 | Host: localhost:2001 12 | Authorization: Bearer {{jwt}} 13 | -------------------------------------------------------------------------------- /distribution/examples/security/login/dialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 300px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } -------------------------------------------------------------------------------- /distribution/examples/security/ntlm/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/api/client.cmd: -------------------------------------------------------------------------------- 1 | powershell ./client.ps1 john password -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/api/oauth2-password-flow-for-apis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/api/oauth2-password-flow-for-apis.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/api/rest.http: -------------------------------------------------------------------------------- 1 | ### Get access token 2 | POST http://localhost:7007/oauth2/token 3 | Content-Type: application/x-www-form-urlencoded 4 | 5 | grant_type=password 6 | &username=john 7 | &password=password 8 | &client_id=abc 9 | &client_secret=def 10 | 11 | # Execute the POST request above. You should be a response like that: 12 | # 13 | # { 14 | # "access_token": "5ta3kbi948eav3dtqs8vqus8j4", 15 | # "token_type": "Bearer", 16 | # "refresh_token": "6b6ll21lu7l0a8lasi9rvnstaq" 17 | # } 18 | # 19 | # Copy the access_token and use it for the second request below 20 | 21 | ### Calling the resource. using access token 22 | GET http://localhost:2000 23 | Authorization: Bearer <> 24 | -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/00-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/00-overview.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/01-backend-registration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/01-backend-registration.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/03-client-registration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/03-client-registration.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/04-client-secret-creation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/04-client-secret-creation.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/05-client-permission-granting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/05-client-permission-granting.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/06-client-permission-granting2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/06-client-permission-granting2.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/azure-ad-with-jwts/images/07-client-permission-granting3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/examples/security/oauth2/azure-ad-with-jwts/images/07-client-permission-granting3.png -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/credentials/README.md: -------------------------------------------------------------------------------- 1 | This example shows the OAuth2 password flow. A client requests an access token and the token is verified through a token validator. 2 | 3 | Please follow https://www.membrane-soa.org/api-gateway-doc/current/security/oauth2-credentials-flow.html -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/credentials/client.cmd: -------------------------------------------------------------------------------- 1 | powershell ./client.ps1 john password -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/credentials/client.ps1: -------------------------------------------------------------------------------- 1 | $clientId = "abc" 2 | $clientSecret = "def" 3 | $tokenEndpoint = "http://localhost:8000/oauth2/token" 4 | $target = "http://localhost:2000" 5 | 6 | function getToken{ 7 | 8 | $postParams = @{grant_type="client_credentials";client_id=$clientId;client_secret=$clientSecret} 9 | return Invoke-WebRequest -Uri $tokenEndpoint -Method POST -Body $postParams | ConvertFrom-Json 10 | } 11 | 12 | function sendRequestToTarget($tokenResult){ 13 | $headers = @{"Authorization"=$tokenResult.token_type + " " + $tokenResult.access_token} 14 | return Invoke-WebRequest -Uri $target -Headers $headers 15 | } 16 | 17 | $tokenEndpointResult = getToken 18 | $result = sendRequestToTarget $tokenEndpointResult 19 | $result.StatusDescription -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/credentials/client.sh: -------------------------------------------------------------------------------- 1 | clientId="abc" 2 | clientSecret="def" 3 | tokenEndpoint="http://localhost:8000/oauth2/token" 4 | target="http://localhost:2000" 5 | 6 | parseResponse(){ 7 | 8 | IFS='"' read -ra ADDR <<< "$1" 9 | authHeader="Authorization: ${ADDR[7]} ${ADDR[3]}" 10 | } 11 | 12 | getToken(){ 13 | call=$(curl --data "grant_type=client_credentials&client_id=${clientId}&client_secret=${clientSecret}" $tokenEndpoint) 14 | parseResponse $call 15 | } 16 | 17 | sendRequestToTarget(){ 18 | targetResult=$(curl -v -s -H "$authHeader" $target 1> /dev/null) 19 | } 20 | 21 | getToken 22 | sendRequestToTarget 23 | echo $targetResult -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/github/README.md: -------------------------------------------------------------------------------- 1 | This example shows OAuth2 authorization with help of github as authorization server. 2 | 3 | Please follow https://www.membrane-soa.org/api-gateway-doc/current/oauth2-github.html -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/github/dialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 300px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/github/service-proxySSL.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | homeSet() { 3 | echo "MEMBRANE_HOME variable is now set" 4 | CLASSPATH="$MEMBRANE_HOME/conf" 5 | CLASSPATH="$CLASSPATH:$MEMBRANE_HOME/starter.jar" 6 | export CLASSPATH 7 | echo Membrane Router running... 8 | java -classpath "$CLASSPATH" com.predic8.membrane.core.Starter -c proxiesSSL.xml 9 | } 10 | 11 | terminate() { 12 | echo "Starting of Membrane Router failed." 13 | echo "Please execute this script from the appropriate subfolder of MEMBRANE_HOME/examples/" 14 | } 15 | 16 | homeNotSet() { 17 | echo "MEMBRANE_HOME variable is not set" 18 | 19 | if [ -f "`pwd`/../../starter.jar" ] 20 | then 21 | export MEMBRANE_HOME="`pwd`/../.." 22 | homeSet 23 | else 24 | terminate 25 | fi 26 | } 27 | 28 | if [ "$MEMBRANE_HOME" ] 29 | then homeSet 30 | else homeNotSet 31 | fi 32 | -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/google/README.md: -------------------------------------------------------------------------------- 1 | This example shows OAuth2 authorization with help of Google as authorization server. 2 | 3 | Please follow https://www.membrane-soa.org/api-gateway-doc/current/oauth2-google.html -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/google/dialog/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | predic8 Login 6 | 7 | 8 | 9 | 10 |
    11 | 15 |
    16 | 17 | This website requires you to login via Google using this link. 18 |
    19 | Your ID is ${authid} 20 | 21 |
    22 |
    23 | 24 | 25 | -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/google/dialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 300px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/google/service-proxySSL.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | homeSet() { 3 | echo "MEMBRANE_HOME variable is now set" 4 | CLASSPATH="$MEMBRANE_HOME/conf" 5 | CLASSPATH="$CLASSPATH:$MEMBRANE_HOME/starter.jar" 6 | export CLASSPATH 7 | echo Membrane Router running... 8 | java -classpath "$CLASSPATH" com.predic8.membrane.core.Starter -c proxiesSSL.xml 9 | } 10 | 11 | terminate() { 12 | echo "Starting of Membrane Router failed." 13 | echo "Please execute this script from the appropriate subfolder of MEMBRANE_HOME/examples/" 14 | } 15 | 16 | homeNotSet() { 17 | echo "MEMBRANE_HOME variable is not set" 18 | 19 | if [ -f "`pwd`/../../../starter.jar" ] 20 | then 21 | export MEMBRANE_HOME="`pwd`/../../.." 22 | homeSet 23 | else 24 | terminate 25 | fi 26 | } 27 | 28 | if [ "$MEMBRANE_HOME" ] 29 | then homeSet 30 | else homeNotSet 31 | fi 32 | -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/implicit/README.md: -------------------------------------------------------------------------------- 1 | This example shows the OAuth2 implicit flow. It uses a Javascript client. 2 | 3 | Please follow https://www.membrane-soa.org/api-gateway-doc/current/oauth2-implicit-flow-example.html -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/implicit/authorization_server/consentFile.json: -------------------------------------------------------------------------------- 1 | { 2 | "product_name":"authorization server", 3 | "logo_url":"url", 4 | "scopes":{ 5 | "scopeName1":"description1", 6 | "scopeName2":"description2", 7 | "profile":"Information about who you are" 8 | }, 9 | "claims":{ 10 | "claimName1":"description3", 11 | "claimName2":"description4", 12 | "username":"Your username" 13 | } 14 | } -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/implicit/authorization_server/logindialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 400px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } 34 | 35 | div.product_name { 36 | text-align: center; 37 | font-size: 3em; 38 | font-weight:bold; 39 | } 40 | 41 | div.askForInformationQuestion { 42 | font-size: 1.5em; 43 | } 44 | 45 | div.consentButtonDeny{ 46 | float: left; 47 | } 48 | 49 | div.consentButtonAccept{ 50 | float: right; 51 | } 52 | 53 | div.italic{ 54 | font-style: italic; 55 | } -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/membrane/README.md: -------------------------------------------------------------------------------- 1 | This example shows OAuth2 authorization with OpenID-Connect and OpenID-Discovery. It uses Membrane as authorization server. 2 | 3 | Please follow https://www.membrane-soa.org/api-gateway-doc/current/oauth2-code-flow-example.html -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/membrane/authorization_server/consentFile.json: -------------------------------------------------------------------------------- 1 | { 2 | "product_name":"authorization server", 3 | "logo_url":"url", 4 | "scopes":{ 5 | "scopeName1":"description1", 6 | "scopeName2":"description2", 7 | "profile":"Information about who you are" 8 | }, 9 | "claims":{ 10 | "claimName1":"description3", 11 | "claimName2":"description4", 12 | "username":"Your username" 13 | } 14 | } -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/membrane/authorization_server/logindialog/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 400px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } 34 | 35 | div.product_name { 36 | text-align: center; 37 | font-size: 3em; 38 | font-weight:bold; 39 | } 40 | 41 | div.askForInformationQuestion { 42 | font-size: 1.5em; 43 | } 44 | 45 | div.consentButtonDeny{ 46 | float: left; 47 | } 48 | 49 | div.consentButtonAccept{ 50 | float: right; 51 | } 52 | 53 | div.italic{ 54 | font-style: italic; 55 | } -------------------------------------------------------------------------------- /distribution/examples/security/oauth2/openid/README.md: -------------------------------------------------------------------------------- 1 | This example shows OAuth2 authorization with OpenID-Connect and OpenID-Discovery. It uses Google as authorization server. 2 | 3 | Please follow https://www.membrane-soa.org/api-gateway-doc/current/oauth2-openid.html -------------------------------------------------------------------------------- /distribution/examples/security/padding-header/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /distribution/examples/security/ssl-tls/to-backend/README.md: -------------------------------------------------------------------------------- 1 | # Routing to Backends over TLS/SSL 2 | 3 | 4 | ## Running the Example 5 | 6 | In the example we will route to an SSL protected API. 7 | 8 | 1. Execute `membrane.sh` or `membrane.cmd` 9 | 10 | 2. Open the URL http://localhost:2000 in your browser. 11 | 12 | 3. Have a look at the `proxies.xml` file. 13 | 14 | ``` 15 | 16 | 17 | 18 | 19 | 20 | ``` 21 | 22 | --- 23 | See: 24 | - [ssl](https://membrane-soa.org/api-gateway-doc/current/configuration/reference/ssl.htm) reference -------------------------------------------------------------------------------- /distribution/examples/security/ssl-tls/to-backend/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /distribution/examples/templating/text/requests.http: -------------------------------------------------------------------------------- 1 | GET http://localhost:2000/text?name=Joe 2 | 3 | ### 4 | 5 | GET http://localhost:2000/variables?name=Joe -------------------------------------------------------------------------------- /distribution/examples/templating/xml/cities.xml: -------------------------------------------------------------------------------- 1 | 2 | Hong Kong 3 | Tokio 4 | Berlin 5 | -------------------------------------------------------------------------------- /distribution/examples/templating/xml/requests.http: -------------------------------------------------------------------------------- 1 | POST http://localhost:2000 2 | Content-Type: application/xml 3 | 4 | 5 | 6 | ### 7 | 8 | POST http://localhost:2001 9 | Content-Type: application/xml 10 | 11 | 12 | Hong Kong 13 | Tokio 14 | Berlin 15 | -------------------------------------------------------------------------------- /distribution/examples/templating/xml/template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | def answer = 42; 4 | answer 5 | 6 | 7 | import groovy.xml.XmlSlurper 8 | def xml = new XmlSlurper().parseText(message.bodyAsStringDecoded) 9 | 10 | 11 | xml.children().each { 12 | it 13 | } 14 | 15 | -------------------------------------------------------------------------------- /distribution/examples/validation/form/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /distribution/examples/validation/json-schema/bad2000.json: -------------------------------------------------------------------------------- 1 | { 2 | "p2": null 3 | } -------------------------------------------------------------------------------- /distribution/examples/validation/json-schema/bad2001.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "93241279A", 3 | "name": "CITROEN Berlingo HDi 90", 4 | "price": { "incl_vat": 7972.00 }, 5 | "tags": "diesel", 6 | "weight": 131, 7 | "transmission": "5 gears" 8 | } -------------------------------------------------------------------------------- /distribution/examples/validation/json-schema/good2000.json: -------------------------------------------------------------------------------- 1 | { 2 | "p1": "2010-11-15", 3 | "p2": "+3927166273" 4 | } -------------------------------------------------------------------------------- /distribution/examples/validation/json-schema/good2001.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 106825605, 3 | "name": "FORD Fusion 1.25 Style", 4 | "price": 8990.00, 5 | "tags": ["black", "metallic", "gasoline" ], 6 | "weight": 1145, 7 | "co2": 140, 8 | "transmission":"manual" 9 | } -------------------------------------------------------------------------------- /distribution/examples/validation/json-schema/schema2000.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": [ "p1" ], 3 | "properties": { 4 | "p1": { 5 | "format": "date" 6 | }, 7 | "p2": { 8 | "format": "phone" 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/add-soap-header/soap-message-without-header.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 112358 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/rest2soap-json/get2soap.xsl: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/rest2soap-json/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/rest2soap-json/strip-env.xsl: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/rest2soap/get2soap.xsl: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/rest2soap/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/rest2soap/strip-env.xsl: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/sample-soap-service/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/sample-soap-service/request.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Bonn 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/sample-soap-service/requests.http: -------------------------------------------------------------------------------- 1 | GET http://localhost:2000?WSDL 2 | 3 | ### 4 | 5 | POST http://localhost:2000 6 | Content-Type: text/xml 7 | 8 | 9 | 10 | 11 | London 12 | 13 | 14 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/secured-wsdl/README.md: -------------------------------------------------------------------------------- 1 | # Securing a WSDL 2 | 3 | ## How it works 4 | - The `soapProxy` acts as an entry point, listening on port `2010` and forwarding WSDL requests to the internal `wsdl-proxy`. 5 | - The `wsdl-proxy` provides full authentication configuration. 6 | - To secure a WSDL service, replace `` with a definition specifying the actual WSDL endpoint. Authentication settings should be configured within the `wsdl-proxy` to ensure proper access control. 7 | 8 | **Refer to [`proxies.xml`](./proxies.xml) for further details, settings, and modifications.** 9 | 10 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/soap-wsdl-validation/city-soap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Bonn 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/soap-wsdl-validation/invalid-city-soap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | foobar 5 | 6 | 7 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/soap-wsdl-validation/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/versioning-soap-xslt/convert-response-to-old-version.xslt: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/versioning-soap-xslt/request-new.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bonn 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /distribution/examples/web-services-soap/versioning-soap-xslt/request-old.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | Bonn 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /distribution/examples/websockets/custom-websocket-interceptor/README.md: -------------------------------------------------------------------------------- 1 | ### CUSTOM WEBSOCKET INTERCEPTORS 2 | 3 | 4 | Please visit https://www.membrane-soa.org/service-proxy-doc/current/websockets/create-websocket-interceptor.htm to learn how to create custom WebSocket interceptors. 5 | 6 | In this folder you will find two sub-folders. Both show different ways how you can add your own WebSocket interceptor to Membrane. 7 | 8 | The embedded example creates an embedded Membrane instance and adds the custom WebSocket interceptor. 9 | 10 | The standalone example compiles the custom WebSocket interceptor and integrates it into a standalone Membrane application. 11 | 12 | -------------------------------------------------------------------------------- /distribution/examples/websockets/custom-websocket-interceptor/embedded/start.bat: -------------------------------------------------------------------------------- 1 | mvn package 2 | java -cp custom-websocket-interceptor-1.0-jar-with-dependencies com.predic8.application.MyApplication -------------------------------------------------------------------------------- /distribution/examples/websockets/custom-websocket-interceptor/embedded/start.sh: -------------------------------------------------------------------------------- 1 | mvn package 2 | java -cp custom-websocket-interceptor-1.0-jar-with-dependencies com.predic8.application.MyApplication -------------------------------------------------------------------------------- /distribution/examples/websockets/custom-websocket-interceptor/standalone/compile-and-copy.bat: -------------------------------------------------------------------------------- 1 | mvn package & copy target\custom-websocket-interceptor-1.0.jar ..\..\..\lib\custom-websocket-interceptor-1.0.jar -------------------------------------------------------------------------------- /distribution/examples/websockets/custom-websocket-interceptor/standalone/compile-and-copy.sh: -------------------------------------------------------------------------------- 1 | mvn package 2 | cp ./target/custom-websocket-interceptor-1.0.jar ../../../lib -------------------------------------------------------------------------------- /distribution/examples/websockets/websocket-intercepting/index.js: -------------------------------------------------------------------------------- 1 | const WebSocket = require('ws'); 2 | 3 | const server = new WebSocket.Server({ port: 8080 }); 4 | server.on('connection', function connection(connection) { 5 | connection.on('message', function incoming(message) { 6 | connection.send("i am the server"); 7 | }); 8 | }); 9 | 10 | const client = new WebSocket('ws://localhost:9999'); 11 | client.on('open', function open() { 12 | client.send('i am the client'); 13 | }); 14 | 15 | client.on('message', function incoming(message) { 16 | console.log("Finished"); 17 | process.exit(); 18 | }); -------------------------------------------------------------------------------- /distribution/examples/websockets/websocket-intercepting/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "websocket_responder", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "test": "test" 9 | }, 10 | "author": "predic8 GmbH", 11 | "license": "Apache-2.0", 12 | "dependencies": { 13 | "ws": "^8.17.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /distribution/examples/websockets/websocket-intercepting/startWebsocket.ps1: -------------------------------------------------------------------------------- 1 | echo "please wait" 2 | npm install 3 | npm start -------------------------------------------------------------------------------- /distribution/examples/websockets/websocket-intercepting/startWebsocket.sh: -------------------------------------------------------------------------------- 1 | echo please wait 2 | npm install 3 | npm start 4 | 5 | -------------------------------------------------------------------------------- /distribution/examples/xml/basic-xml-interceptor/example.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 42 4 | -------------------------------------------------------------------------------- /distribution/examples/xml/stax-interceptor/request.xml: -------------------------------------------------------------------------------- 1 | 2 | 42 3 | -------------------------------------------------------------------------------- /distribution/examples/xml/xml-validation/amount.xsd: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /distribution/examples/xml/xml-validation/invalid-year.xml: -------------------------------------------------------------------------------- 1 | 07-09-2011 -------------------------------------------------------------------------------- /distribution/examples/xml/xml-validation/year.xml: -------------------------------------------------------------------------------- 1 | 2011 -------------------------------------------------------------------------------- /distribution/examples/xml/xml-validation/year.xsd: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /distribution/examples/xml/xslt/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /distribution/examples/yaml-configuration/README.md: -------------------------------------------------------------------------------- 1 | ## YAML CONFIGURATION 2 | 3 | Membrane can be configured with YAML files instead of using the traditional XML syntax. 4 | 5 | Please note that this is experimental. 6 | 7 | #### RUNNING THE EXAMPLE 8 | 9 | 1. Start Membrane from this directory by executing `membrane.sh` or `membrane.cmd`. 10 | 2. Open http://localhost:2000/api-docs in the Web Browser. 11 | 3. Open http://localhost:9000/ in the Web Browser. 12 | 13 | -------------------------------------------------------------------------------- /distribution/examples/yaml-configuration/proxies.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: membrane-soa.org/v1beta1 2 | kind: api 3 | metadata: 4 | name: fruitshop-demo 5 | spec: 6 | port: 2000 7 | specs: 8 | - openapi: 9 | location: ../../conf/fruitshop-api.yml 10 | 11 | --- 12 | 13 | apiVersion: membrane-soa.org/v1beta1 14 | kind: serviceProxy 15 | metadata: 16 | name: admin-console 17 | spec: 18 | port: 9000 19 | interceptors: 20 | - adminConsole: {} 21 | -------------------------------------------------------------------------------- /distribution/media/membrane-logo-m-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/media/membrane-logo-m-text.png -------------------------------------------------------------------------------- /distribution/media/membrane-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/media/membrane-logo.png -------------------------------------------------------------------------------- /distribution/release-notes/0.0.0.md: -------------------------------------------------------------------------------- 1 | ## Release Notes 2 | -------------------------------------------------------------------------------- /distribution/release-notes/5.1.17.md: -------------------------------------------------------------------------------- 1 | This is a test release, testing the automatic deployment. Please ignore. -------------------------------------------------------------------------------- /distribution/release-notes/5.1.18.md: -------------------------------------------------------------------------------- 1 | This is a test release, testing the automatic deployment. Please ignore. -------------------------------------------------------------------------------- /distribution/release-notes/5.1.19.md: -------------------------------------------------------------------------------- 1 | This is a test release, testing the automatic deployment. Please ignore. -------------------------------------------------------------------------------- /distribution/router/conf/acl.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | localhost 15 | 127.0.0.1 16 | 0:0:0:0:0:0:0:1 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/router/conf/client.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/router/conf/client.cer -------------------------------------------------------------------------------- /distribution/router/conf/client.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/router/conf/client.p12 -------------------------------------------------------------------------------- /distribution/router/conf/membrane.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/router/conf/membrane.cer -------------------------------------------------------------------------------- /distribution/router/conf/membrane.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/membrane/api-gateway/521697497419fe9bc9989b611f527ae33bb2a3b2/distribution/router/conf/membrane.p12 -------------------------------------------------------------------------------- /distribution/src/test/resources/OAuth2/.well-known/openid-configuration: -------------------------------------------------------------------------------- 1 | { 2 | "authorization_endpoint": "http://localhost:2000/oauth2/auth", 3 | "token_endpoint": "http://localhost:2000/oauth2/token", 4 | "userinfo_endpoint": "http://localhost:2000/oauth2/userinfo", 5 | "revocation_endpoint": "http://localhost:2000/oauth2/revoke", 6 | "response_types_supported": [ 7 | "code" 8 | ], 9 | "scopes_supported": [ 10 | "username", 11 | "profile" 12 | ] 13 | } -------------------------------------------------------------------------------- /distribution/src/test/resources/OAuth2/auth/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: sans-serif; 3 | font-size: 10pt; 4 | } 5 | 6 | body { 7 | max-width: 800px; 8 | margin: auto; 9 | } 10 | 11 | .content { 12 | } 13 | 14 | img.logo { 15 | float: right; 16 | } 17 | 18 | div.logo { 19 | clear: both; 20 | } 21 | 22 | .loginbox { 23 | margin: 200px auto; 24 | width: 300px; 25 | } 26 | 27 | .error { 28 | color:red; 29 | } 30 | 31 | input { 32 | margin-bottom: 8pt; 33 | } -------------------------------------------------------------------------------- /distribution/src/test/resources/OAuth2/consentFile.json: -------------------------------------------------------------------------------- 1 | { 2 | "product_name":"authorization server", 3 | "logo_url":"url", 4 | "scopes":{ 5 | "scopeName1":"description1", 6 | "scopeName2":"description2", 7 | "profile":"Information about who you are" 8 | }, 9 | "claims":{ 10 | "claimName1":"description3", 11 | "claimName2":"description4", 12 | "username":"Your username" 13 | } 14 | } -------------------------------------------------------------------------------- /distribution/src/test/resources/com/predic8/membrane/errorhandling/wrong-content-proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /distribution/src/test/resources/com/predic8/membrane/errorhandling/wrong-file-location-proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /distribution/src/test/resources/com/predic8/membrane/errorhandling/wrong-url-location-proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /distribution/tutorials/rest/README.md: -------------------------------------------------------------------------------- 1 | # REST Tutorial 2 | 3 | This folder contains files for a [tutorial](https://membrane-api.io/tutorials/rest/) showing how to use Membrane for REST API. 4 | 5 | See: https://membrane-api.io/tutorials/rest/ -------------------------------------------------------------------------------- /distribution/tutorials/rest/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/tutorials/soap/README.md: -------------------------------------------------------------------------------- 1 | # SOAP Web Services Tutorial 2 | 3 | This folder contains files for a [tutorial](https://membrane-api.io/tutorials/soap/) showing how to use Membrane for Web Services using SOAP and WSDL. 4 | 5 | See: https://membrane-api.io/tutorials/soap/ -------------------------------------------------------------------------------- /distribution/tutorials/soap/get2soap.xsl: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /distribution/tutorials/soap/proxies.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /distribution/tutorials/soap/strip-env.xsl: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /docs/BUILD.md: -------------------------------------------------------------------------------- 1 | # Building Membrane API Gateway 2 | 3 | ### What you need 4 | * Java JDK 21 5 | * Apache Maven 6 | * git 7 | 8 | ### Building 9 | 10 | You can skip the tests for speed. 11 | 12 | ```sh 13 | git clone https://github.com/membrane/api-gateway 14 | cd api-gateway 15 | mvn install -DskipTests 16 | ``` 17 | 18 | NOTE: For a Release Checkout use 19 | 20 | git clone --branch v5.X.X https://github.com/membrane/api-gateway 21 | 22 | ```sh 23 | After the build find the distribution and the WAR at: 24 | ``` 25 | 26 | After building you'll find the distribution here: 27 | 28 | ```sh 29 | ../distribution/target/membrane-service-proxy-X.X.X.zip 30 | ../war/target/service-proxy-war-X.X.X.war 31 | ``` 32 | -------------------------------------------------------------------------------- /docs/CONVENTIONS.md: -------------------------------------------------------------------------------- 1 | # Parameters 2 | 3 | Parameter names in the definition of interfaces should not be abbreviated. In private methods it is fine. -------------------------------------------------------------------------------- /docs/RELEASE_NOTES.md: -------------------------------------------------------------------------------- 1 | # 6.0.0 2 | 3 | Membrane Version 6 is a big step forward from Membrane 5. Big parts of the code base were refactored and improved. 4 | 5 | ## New Features 6 | - setHeader now supports also Groovy, XPath, Jsonpath 7 | - New plugins `call`, `destination` 8 | - API key stores for JDBC and MongoDB 9 | 10 | ## Improvements 11 | - New flow control through plugins. Not based on a stack of executed interceptors but on the definition in the 'proxies.xml' file. 12 | - New `log` plugin with more features and cleaner configuration. It can now dump the exchange and properties 13 | - ProblemDetails format is used for most of the error messages 14 | - Ordered fields in ProblemDetails 15 | - References in OpenAPI are now supported 16 | - In SpEL and Groovy plugins besides `headers.` and `properties.` now also the singulars `header.` will work 17 | -------------------------------------------------------------------------------- /docs/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Currently, we are supporting the following versions with security updates. 6 | 7 | | Version | Supported | 8 | | ------- | ------------------ | 9 | | 6.0.x | :white_check_mark: | 10 | | 5.8.x | :white_check_mark: | 11 | | 5.5.x | :white_check_mark: | 12 | | 4.9.x | :x: | 13 | 14 | ## Reporting a Vulnerability 15 | 16 | To report a security vulnerability create an [issue](https://github.com/membrane/service-proxy/issues) or send an email to info@predic8.de . We will have a look at your report immediately and evaluate it. Do not send confidential information or encrypt the email body using the GPG key https://keys.openpgp.org/vks/v1/by-fingerprint/2FB0F3ED57EF0A8A9CE847C18A006E355B8A65F6 ." 17 | 18 | -------------------------------------------------------------------------------- /maven-plugin/README.md: -------------------------------------------------------------------------------- 1 | # membrane-maven-plugin 2 | -------------------------------------------------------------------------------- /starter/README.md: -------------------------------------------------------------------------------- 1 | # Starter 2 | 3 | Starts Membrane from the commandline. The starter is written in Java 8, it starts the core that is written with Java 17 or newer. The purpose of the starter is to display an error message if the Java version does not fit. -------------------------------------------------------------------------------- /test/README.md: -------------------------------------------------------------------------------- 1 | # Shared Test Resources 2 | 3 | Here you'll find: 4 | 5 | - Classes used in different modules like core, distribution 6 | - [Test scripts](scripts) 7 | 8 | The contents from this module are not put into the distribution. -------------------------------------------------------------------------------- /war/.factorypath: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /war/src/main/resources/META-INF/spring.handlers: -------------------------------------------------------------------------------- 1 | http\://membrane-soa.org/war/1/=com.predic8.membrane.servlet.config.spring.NamespaceHandler 2 | -------------------------------------------------------------------------------- /war/src/main/resources/META-INF/spring.schemas: -------------------------------------------------------------------------------- 1 | http\://membrane-soa.org/schemas/war-1.xsd=com/predic8/membrane/servlet/config/spring/router-conf.xsd -------------------------------------------------------------------------------- /war/src/main/webapp/README.txt: -------------------------------------------------------------------------------- 1 | INSTALLATION 2 | 3 | Deploy this .war into a J2EE web server and change the context path to '/'. You 4 | are then able to access the admin console on '/admin', and a proxied version of 5 | www.predic8.com on '/'. 6 | 7 | See WEB-INF/web.xml and WEB-INF/proxies.xml for more details. -------------------------------------------------------------------------------- /war/src/test/resources/META-INF/spring.handlers: -------------------------------------------------------------------------------- 1 | http\://membrane-soa.org/war/1/=com.predic8.membrane.servlet.config.spring.NamespaceHandler 2 | -------------------------------------------------------------------------------- /war/src/test/resources/META-INF/spring.schemas: -------------------------------------------------------------------------------- 1 | http\://membrane-soa.org/schemas/war-1.xsd=com/predic8/membrane/servlet/config/spring/router-conf.xsd 2 | -------------------------------------------------------------------------------- /war/src/test/webapp/WEB-INF/ArticleType.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /war/src/test/webapp/WEB-INF/CurrencyType.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | --------------------------------------------------------------------------------