{"id":26059776,"url":"https://github.com/orange-cloudfoundry/osb-reverse-proxy","last_synced_at":"2026-04-17T16:01:38.340Z","repository":{"id":39884336,"uuid":"297656175","full_name":"orange-cloudfoundry/osb-reverse-proxy","owner":"orange-cloudfoundry","description":"A reverse proxy for open service broker endpoints","archived":false,"fork":false,"pushed_at":"2023-03-06T15:56:48.000Z","size":219,"stargazers_count":1,"open_issues_count":7,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-08T13:30:28.210Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orange-cloudfoundry.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-22T13:23:04.000Z","updated_at":"2022-04-04T15:21:21.000Z","dependencies_parsed_at":"2023-01-31T00:21:56.368Z","dependency_job_id":null,"html_url":"https://github.com/orange-cloudfoundry/osb-reverse-proxy","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/orange-cloudfoundry/osb-reverse-proxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fosb-reverse-proxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fosb-reverse-proxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fosb-reverse-proxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fosb-reverse-proxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orange-cloudfoundry","download_url":"https://codeload.github.com/orange-cloudfoundry/osb-reverse-proxy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orange-cloudfoundry%2Fosb-reverse-proxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31935697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-17T12:37:54.787Z","status":"ssl_error","status_checked_at":"2026-04-17T12:37:25.095Z","response_time":62,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-08T13:28:23.221Z","updated_at":"2026-04-17T16:01:38.295Z","avatar_url":"https://github.com/orange-cloudfoundry.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# osb-reverse-proxy\n\n[![CircleCI Build status](https://circleci.com/gh/orange-cloudfoundry/osb-reverse-proxy.svg?style=svg)](https://app.circleci.com/pipelines/github/orange-cloudfoundry/osb-reverse-proxy)\n\nA reverse http proxy tailored for open service broker (OSB) api endpoints\n\n## Introduction\n\nSome osb-clients such as Cloud Foundry do not support brokers that need to be reached through the http(s) proxy. \n\nosb-reverse-proxy provides a generic reverse proxy to front service brokers. \n\nThe following ascii art diagram illustrates the network path when a developer requests a `cf create-service` command\n\n```\ndeveloper -\u003e Cloud Foundry cloud controller -\u003e osb-reverse-proxy -\u003e http proxy -\u003e service broker  \n```\n\n## Configuration\n\nThe broker is configureable through usual spring-boot configuration style. The [OsbReverseProxyProperties.java](https://github.com/orange-cloudfoundry/osb-reverse-proxy/blob/master/src/main/java/com/orange/oss/osbreverseproxy/OsbReverseProxyProperties.java) document the supported properties.\n\n## Operations \n\nOsb-reverse-proxy is designed to support multiple hostnames. The property (`whiteListedOsbDomain`) controls which hostnames are whitelisted to accept OSB API calls. The host may be used to expose operation endpoints, including spring-boot actuator endpoints\n\n\n### Actuator endpoints\n\nOsb-reverse-proxy embeds spring boot actuator endpoints (\"beans,conditions,info,gateway,health,httptrace,loggers,metrics,threaddump\") protected by a user configured by the `spring.security.user.name` and `spring.security.user.password` environment variables. See [SecurityConfigTest.java](src/test/java/com/orange/oss/osbreverseproxy/SecurityConfigTest.java) and [application.yml](src/main/resources/application.yml) for full details.\n\nThis enables dynamic log level assignment through\n\n```bash\ncurl -vvv -X POST -u redacted-user:redacted-password https://osb-reverse-proxy.mydomain.org/actuator/loggers/logging.level.org.springframework.cloud.gateway.debug -X POST -H 'Content-Type: application/json' -d '{\"configuredLevel\": \"trace\"}'\n```\n\nSample relevant loggers are also available in the `verbose` osb-reverse-proxy spring profile. This may be set by setting the `SPRING_PROFILES_ACTIVE` env var to `verbose`.\n\n\n\n### Osb api logs\n\nOsb-reverse proxy collects and serves logs of OSB API requests using an extension of springboot actuator httptrace support with request and response body added as http headers\n\n```bash\n$ curl -u redacted-user:redacted-password https://osb-reverse-proxy.redacted-domain.org/actuator/httptrace | jq .\n[\n    {\n      \"timestamp\": \"2020-10-27T11:22:53.529Z\",\n      \"principal\": null,\n      \"session\": null,\n      \"request\": {\n        \"method\": \"GET\",\n        \"uri\": \"https://osb-reverse-proxy.internal-controlplane-cf.paas/v2/catalog\",\n        \"headers\": {\n          \"X-Cf-Instanceid\": [\n            \"fa7644e2-7faf-4bb7-49a0-b3aa\"\n          ],\n          \"X-Broker-Api-Version\": [\n            \"2.15\"\n          ],\n          \"Accept\": [\n            \"application/json\"\n          ],\n          \"X-Forwarded-Proto\": [\n            \"https\"\n          ],\n          \"X-Broker-Api-Request-Identity\": [\n            \"e452c1f5-fdfe-4e47-b754-fbb31665f6ad\"\n          ],\n          \"User-Agent\": [\n            \"HTTPClient/1.0 (2.8.3, ruby 2.5.5 (2019-03-15))\"\n          ],\n          \"X-Request-Start\": [\n            \"1603797773450\"\n          ],\n          \"X-Broker-Api-Originating-Identity\": [\n            \"cloudfoundry ewogICJ1c2VyX2lkIjogIjBkMDIxMTdiLWFhMjEtNDNlMi1iMzVlLThhZDZmODIyMzUxOSIKfQ==\"\n          ],\n          \"Host\": [\n            \"osb-reverse-proxy.internal-controlplane-cf.paas\"\n          ],\n          \"X-Vcap-Request-Id\": [\n            \"4ae90935-358e-45f4-6cde-83fca76bc6e7\"\n          ],\n          \"Date\": [\n            \"Tue, 27 Oct 2020 11:22:53 GMT\"\n          ],\n          \"X-Cf-Instanceindex\": [\n            \"0\"\n          ],\n          \"B3\": [\n            \"d23918d4d277397c-d23918d4d277397c\"\n          ],\n          \"X-Api-Info-Location\": [\n            \"api.redacted-cf-api-domain.org/v2/info\"\n          ],\n          \"X-B3-Spanid\": [\n            \"d23918d4d277397c\"\n          ],\n          \"X-Cf-Applicationid\": [\n            \"1c5cce4c-6f2c-439d-b647-8cb09d453c16\"\n          ],\n          \"X-Forwarded-For\": [\n            \"192.168.35.66, 192.168.35.50\"\n          ],\n          \"X-B3-Traceid\": [\n            \"d23918d4d277397c\"\n          ]\n        },\n        \"remoteAddress\": null\n      },\n      \"response\": {\n        \"status\": 200,\n        \"headers\": {\n          \"X-Content-Type-Options\": [\n            \"nosniff\"\n          ],\n          \"response_body\": [\n            \"{\\\"services\\\":[{\\\"name\\\":\\\"overview-service\\\",\\\"description\\\":\\\"Provides an ...\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"X-Vcap-Request-Id\": [\n            \"ceef1981-6c91-4d51-701a-17f1f6b5a54c\"\n          ],\n          \"Date\": [\n            \"Tue, 27 Oct 2020 11:22:53 GMT\"\n          ],\n          \"Referrer-Policy\": [\n            \"no-referrer\"\n          ],\n          \"X-Frame-Options\": [\n            \"DENY\"\n          ],\n          \"Strict-Transport-Security\": [\n            \"max-age=31536000 ; includeSubDomains\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Etag\": [\n            \"W/\\\"37ea-JtM0TfwLN4WsJxfxq42Qe2dtP7U\\\"\"\n          ],\n          \"Expires\": [\n            \"0\"\n          ],\n          \"X-XSS-Protection\": [\n            \"1 ; mode=block\"\n          ],\n          \"Content-Length\": [\n            \"14314\"\n          ],\n          \"X-Powered-By\": [\n            \"Express\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=utf-8\"\n          ]\n        }\n      },\n      \"timeTaken\": 0\n    },\n[...]\n]\n```\n\nSee sample jq query syntax below:\n\n```\n                    # filter PUT request                      # filter service binding uris \njq -r '.traces[] | select (.request.method==\"PUT\") | select ( .request.uri|test(\".binding\"))'\n                    # filter PUT request                      # filter status\njq -r '.traces[] | select (.request.method==\"PUT\" and .response.status!=200)'\n\n```\n\nWarning: the following two issues may require to query the httptrace endpoint multiple times:\n   * [#9 httptraces may be shared by osb-reverse-proxy instances](https://github.com/orange-cloudfoundry/osb-reverse-proxy/issues/9)\n   * [#8 http traces may be lost following osb-reverse-proxy restart](https://github.com/orange-cloudfoundry/osb-reverse-proxy/issues/8)\n\nPotential workaround by storing httptrace output in a local file and use jq to\n* merge files into a single array\n* remove duplicates (using [unique](https://gist.github.com/olih/f7437fb6962fb3ee9fe95bda8d2c8fa4))\n\nWorkaround:\n\n```bash\n#repeat in a loop\ncurl [...] \u003e trace-`date +%Y-%m-%d.%H:%M:%S`.json\n# remove duplicates and filter\njq -s . trace*.json | jq 'unique' \n```\n which results in paas-templates context to\n \n ```bash\n # on bosh-cli\nlog-credhub\n# repeat multiple times to reach both osb-reverse-proxy instances\ncurl -u serviceProvider:$(credhub-get /ops-depls/cf-apps-deployments/osb-reverse-proxy-4/service-provider-password) https://osb-reverse-proxy-4.internal-controlplane-cf.paas/actuator/httptrace | jq . \u003e trace-`date +%Y-%m-%d.%H:%M:%S`.json\n\njq -s . trace*.json | jq -r 'unique' | jq -r '.[].traces[] | select (.request.method==\"PUT\")' | less\n# clean up traces\nrm trace*.json\n```\n\n\nRandom Jq references:\n   * https://stedolan.github.io/jq/manual/ jq manual\n   * https://www.baeldung.com/linux/jq-command-json\n   * https://gist.github.com/olih/f7437fb6962fb3ee9fe95bda8d2c8fa4 jq-cheetsheet.md\n\n## Deploying \n\nThis reverse proxy is a java springboot app which can be deployed onto cloufoundry using the java buildpack.\n\nSee the expected environment variables in the [ApplicationTest](src/test/java/com/orange/oss/osbreverseproxy/ApplicationTest.java)\n\nIn this initial version, the jar distribution merely contains a packaged version of [spring-cloud-gateway](https://cloud.spring.io/spring-cloud-gateway/reference/html) and is designed to be configured using additional springboot configuration matching the [spring cloud gateway configuration](https://cloud.spring.io/spring-cloud-gateway/reference/html/#configuring-route-predicate-factories-and-gateway-filter-factories)\n\nMulti-tenancy support with osb-specific configuration is planned. See [TODO](TODO.md) for details. \n\n## Releasing\n\n* manually edit the version in `build.gradle` (e.g `version=0.2.0`), commit \u0026 push\n* git tag v0.2.0 -a -m \"0.2.0 release\"\n* git push origin  v0.2.0\n* let circle ci build and upload the binaries to github\n* edit the github release to complete release notes\n* manually edit the version in `gradle.properties`, commit \u0026 push e.g. `version=0.2.0.BUILD-SNAPSHOT`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forange-cloudfoundry%2Fosb-reverse-proxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forange-cloudfoundry%2Fosb-reverse-proxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forange-cloudfoundry%2Fosb-reverse-proxy/lists"}