{"id":13547495,"url":"https://github.com/emgag/varnish-towncrier","last_synced_at":"2026-01-14T19:31:08.069Z","repository":{"id":57550610,"uuid":"114184384","full_name":"emgag/varnish-towncrier","owner":"emgag","description":"Distribute cache invalidation requests to a fleet of varnish instances.","archived":false,"fork":false,"pushed_at":"2022-11-03T13:18:52.000Z","size":7390,"stargazers_count":25,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-11T18:54:11.805Z","etag":null,"topics":["ban","broadcast","cache","cache-invalidation","cluster","docker","kubernetes","pubsub","purge","redis","varnish","xkey"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emgag.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":"2017-12-14T00:52:06.000Z","updated_at":"2024-10-02T15:44:10.000Z","dependencies_parsed_at":"2022-09-26T18:41:51.278Z","dependency_job_id":null,"html_url":"https://github.com/emgag/varnish-towncrier","commit_stats":null,"previous_names":["emgag/varnish-broadcast"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/emgag/varnish-towncrier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emgag%2Fvarnish-towncrier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emgag%2Fvarnish-towncrier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emgag%2Fvarnish-towncrier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emgag%2Fvarnish-towncrier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emgag","download_url":"https://codeload.github.com/emgag/varnish-towncrier/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emgag%2Fvarnish-towncrier/sbom","scorecard":{"id":375312,"data":{"date":"2025-08-11","repo":{"name":"github.com/emgag/varnish-towncrier","commit":"3419f0cc0d1602746dec6621f517d5d93d3f974b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/emgag/varnish-towncrier/release.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating alpine to alpine@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.6.0 not signed: https://api.github.com/repos/emgag/varnish-towncrier/releases/81956360","Warn: release artifact v1.5.0 not signed: https://api.github.com/repos/emgag/varnish-towncrier/releases/54136386","Warn: release artifact v1.4.0 not signed: https://api.github.com/repos/emgag/varnish-towncrier/releases/47032970","Warn: release artifact v1.3.1 not signed: https://api.github.com/repos/emgag/varnish-towncrier/releases/30909651","Warn: release artifact v1.3.0 not signed: https://api.github.com/repos/emgag/varnish-towncrier/releases/30538338","Warn: release artifact v1.6.0 does not have provenance: https://api.github.com/repos/emgag/varnish-towncrier/releases/81956360","Warn: release artifact v1.5.0 does not have provenance: https://api.github.com/repos/emgag/varnish-towncrier/releases/54136386","Warn: release artifact v1.4.0 does not have provenance: https://api.github.com/repos/emgag/varnish-towncrier/releases/47032970","Warn: release artifact v1.3.1 does not have provenance: https://api.github.com/repos/emgag/varnish-towncrier/releases/30909651","Warn: release artifact v1.3.0 does not have provenance: https://api.github.com/repos/emgag/varnish-towncrier/releases/30538338"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T14:08:05.195Z","repository_id":57550610,"created_at":"2025-08-18T14:08:05.195Z","updated_at":"2025-08-18T14:08:05.195Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28432621,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T18:57:19.464Z","status":"ssl_error","status_checked_at":"2026-01-14T18:52:48.501Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["ban","broadcast","cache","cache-invalidation","cluster","docker","kubernetes","pubsub","purge","redis","varnish","xkey"],"created_at":"2024-08-01T12:00:56.925Z","updated_at":"2026-01-14T19:31:08.042Z","avatar_url":"https://github.com/emgag.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# varnish-towncrier\n\n![build](https://github.com/emgag/varnish-towncrier/workflows/build/badge.svg)\n![release](https://github.com/emgag/varnish-towncrier/workflows/release/badge.svg)\n[![Go Report Card](https://goreportcard.com/badge/github.com/emgag/varnish-towncrier)](https://goreportcard.com/report/github.com/emgag/varnish-towncrier)\n![License](https://img.shields.io/github/license/emgag/varnish-towncrier)\n\n**varnish-towncrier** is designed to distribute cache invalidation requests to a fleet of\n[varnish](http://varnish-cache.org/) instances. The agent daemon is listening for PURGE and BAN requests on\na [Redis Pub/Sub](https://redis.io/docs/manual/pubsub/) channel and forwards incoming cache invalidation requests to its\nlocal\nvarnish instance. It's the successor of [varnish-cache-reaper](https://github.com/emgag/varnish-cache-reaper), which is\nalso used to fan out invalidation requests to multiple varnish instances, though its host list is static while with\nvarnish-towncrier, each varnish instance registers itself automatically.\n\nIt supports PURGE and BAN requests as well as surrogate keys (cache tags) using the\n[xkey module](https://github.com/varnish/varnish-modules/blob/master/src/vmod_xkey.vcc), formerly known as Hashtwo.\n\n## Requirements\n\n* [Redis](https://redis.io) service, accessible from both the applications issuing invalidation requests as well as the\n  varnish instances running the agent.\n* [Varnish](http://varnish-cache.org/), obviously. Although as it doesn't use any specific varnish APIs and uses plain\n  HTTP, it can probably be configured for other proxies as well.\n* VCL has to be modified to support purging, banning and distinguishing the two different xkey purging methods supported\n  by varnish-towncrier. See VCL example below.\n* Go \u003e=1.19 for building.\n\n## Agent\n\n### Configuration\n\nThe agent configuration is done using either a YAML file (\nsee [varnish-towncrier.yml.dist]([varnish-towncrier.yml.dist])), default location is\n*/etc/varnish-towncrier.yml* or through environment variables.\n\n**redis** section:\n\n* uri (*VT_REDIS_URI*): redis host to connect to. Use redis:// for unencrypted, rediss:// for an encrypted connection.\n* password (*VT_REDIS_PASSWORD*): provide password if the connection needs to be authenticated.\n* subscribe (*VT_REDIS_SUBSCRIBE*): list of pubsub channels the agent will subscribe to. When used within an environment\n  variable, a space separated string is used to list multiple values.\n\n**endpoint** section:\n\n* uri (*VT_ENDPOINT_URI*): the HTTP endpoint of the varnish instance.\n* xkeyheader (*VT_ENDPOINT_XKEYHEADER*): The header used to supply list of keys to purge using *xkey.purge()*.\n* softxkeyheader (*VT_ENDPOINT_SOFTXKEYHEADER*): The header used to supply list of keys to purge using *\n  xkey.softpurge()*.\n* banheader (*VT_ENDPOINT_BANHEADER*): The header used to supply the expression for *ban()*.\n* banurlheader (*VT_ENDPOINT_BANURLHEADER*): The header used to supply the pattern for an URL ban.\n\nExample (default values):\n\n```YAML\nredis:\n  uri: redis://127.0.0.1:6379\n  password: thepasswordifneeeded\n  subscribe:\n    - varnish.purge\nendpoint:\n  uri: http://127.0.0.1:8080/\n  xkeyheader: x-xkey\n  softxkeyheader: x-xkey-soft\n  banheader: x-ban-expression\n  banurlheader: x-ban-url  \n```\n\n### Usage\n\n```\nDistribute cache invalidation requests to a fleet of varnish instances.\n\nUsage:\n  varnish-towncrier [command]\n\nAvailable Commands:\n  ban         Issue ban request to all registered instances\n  help        Help about any command\n  listen      Listen for incoming invalidation requests\n  purge       Issue purge request to all registered instances\n  version     Print the version number of varnish-towncrier\n  xkey        Invalidate selected surrogate keys on all registered instances\n\nFlags:\n  -c, --config string   config file (default is /etc/varnish-towncrier.yml)\n  -h, --help            help for varnish-towncrier\n\nUse \"varnish-towncrier [command] --help\" for more information about a command.\n```\n\nExample:\n\n```\n$ varnish-towncrier -c varnish-towncrier.yml listen\n2017/12/14 01:09:14 Connecting to redis...\n2017/12/14 01:09:14 Connected to redis://127.0.0.1:6379\n2017/12/14 01:09:14 subscribe: varnish.purge (1)\n[...]\n```\n\n## Docker\n\nvarnish-towncrier is packaged for docker with the image\n\n[ghcr.io/emgag/varnish-towncrier](https://github.com/orgs/emgag/packages/container/varnish-towncrier)\n\nand can be configured either by copying a config file to the root or by supplying environment variables.\n\nExample using baked in config file:\n\n``` \nFROM ghcr.io/emgag/varnish-towncrier\nCOPY varnish-towncrier.yml /varnish-towncrier.yml\n```\n\n### Run\n\n```\ndocker run emgag/varnish-towncrier:latest listen\n```\n\n### Kubernetes\n\nvarnish-towncrier can be run alongside a varnish container (\nlike [ghcr.io/emgag/varnish](https://github.com/orgs/emgag/packages/container/varnish))\nin a pod to handle cache resets, e.g.\n\n```\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: varnish-deployment\nspec:\n  selector:\n    matchLabels:\n      app: varnish\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        app: varnish\n    spec:\n      containers:\n      - name: varnish\n        image: ghcr.io/emgag/varnish:7.2.0\n        ports:\n        - containerPort: 80\n        env:\n        - name: VARNISH_STORAGE\n          value: \"malloc,512m\"\n        volumeMounts:\n        - name: config-volume\n          mountPath: /etc/varnish          \n      - name: varnish-towncrier\n        image: ghcr.io/emgag/varnish-towncrier:latest\n        args:\n        - listen\n        env:\n        - name: VT_REDIS_URI\n          value: redis://redis-service\n        - name: VT_ENDPOINT_URI\n          value: http://127.0.0.1:80/\n      volumes:\n      - name: config-volume\n        configMap:\n          name: varnish-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: varnish-service\nspec:\n  type: ClusterIP\n  ports:\n  - port: 80\n    targetPort: 80\n    protocol: TCP\n  selector:\n    app: varnish\n```\n\n## Invalidation request API\n\nInvalidation requests can be sent by publishing to a [Redis Pub/Sub](https://redis.io/docs/manual/pubsub/) channel.\n\n### Message format\n\nThe publish message payload consists of a JSON object with following properties:\n\n* **command**: string. Required. Either _ban_, _ban.url_, _purge_, _xkey_ or _xkey.soft_.\n* **host**: string. Optional. The _Host_ header used in the PURGE/BAN request to varnish. If omitted, the host is\n  derived from the local endpoint's URL.\n* **value**: string[]. Required. Meaning depends on the command.\n  _ban_: List of [ban() expressions](https://varnish-cache.org/docs/7.2/reference/vmod_std.html#std-ban),\n  _ban.url_: List of regular expressions matching the path portion of the URL to be banned,\n  _purge_: The path portion of the URL to be purged,\n  _xkey_ and _xkey.soft_: List of keys to (soft-)purge.\n\nExample:\n\n```JSON\n{\n  \"command\": \"xkey\",\n  \"host\": \"www.example.org\",\n  \"value\": [\n    \"still\",\n    \"flying\"\n  ]\n}\n```\n\nUsing _varnish-towncrier_:\n\n```\n$ varnish-towncrier -c config.yml xkey --host www.example.org still flying\n```\n\nUsing _redis-cli_:\n\n```\n$ redis-cli\n127.0.0.1:6379\u003e publish varnish.purge '{\"command\": \"xkey\", \"host\": \"www.example.org\", \"value\": [\"still\", \"flying\"]}'\n```\n\nUsing PHP \u0026 [Predis](https://github.com/nrk/predis):\n\n```PHP\n$client = new Predis\\Client([\n    'scheme' =\u003e 'tcp',\n    'host'   =\u003e '127.0.0.1',\n    'port'   =\u003e '6379'\n]);\n\n$message = json_encode([\n    'command' =\u003e 'xkey',\n    'host'    =\u003e 'www.example.org',\n    'value'   =\u003e ['still', 'flying']\n]);\n\n$client-\u003epublish('varnish.purge', $message);\n```\n\nUsing PHP, [Predis](https://github.com/nrk/predis)\n\u0026 [varnish-towncrier-php](https://github.com/emgag/varnish-towncrier-php):\n\n```PHP\n$client = new Predis\\Client([\n    'scheme' =\u003e 'tcp',\n    'host'   =\u003e '127.0.0.1',\n    'port'   =\u003e '6379'\n]);\n\n$vt = new VarnishTowncrier($client);\n$vt-\u003exkey('example.org', ['still', 'flying']);\n```\n\n## VCL example\n\n### Varnish 6.x / 7.x\n\nVarnish documentation\nor [varnish 6.0](https://www.varnish-cache.org/docs/6.0/users-guide/purging.html)\nor [varnish 7.1](https://www.varnish-cache.org/docs/7.1/users-guide/purging.html)\nor [varnish 7.2](https://www.varnish-cache.org/docs/7.2/users-guide/purging.html)\n\n```VCL\n[...]\n# use xkey module\nimport xkey;\n\n# purgers acl\n# - who is allowed to issue PURGE and BAN requests\n# \nacl purgers {\n    \"127.0.0.1\";\n}\n\nsub vcl_recv {\n    [...]\n    if (req.method == \"PURGE\") {\n        if (!client.ip ~ purgers) {\n            return(synth(405,\"Method not allowed\"));\n        }\n        \n        if(req.http.x-xkey) {\n            set req.http.n-gone = xkey.purge(req.http.x-xkey);\n            return (synth(200, \"Got \" + req.http.x-xkey + \", invalidated \" + req.http.n-gone + \" objects\"));\n        }\n        \n        if(req.http.x-xkey-soft) {\n            set req.http.n-gone = xkey.softpurge(req.http.x-xkey-soft);\n            return (synth(200, \"Got \" + req.http.x-xkey-soft + \", invalidated \" + req.http.n-gone + \" objects\"));\n        }\n        \n        return (purge);\n    }\n\n    if (req.method == \"BAN\") {\n        if (!client.ip ~ purgers) {\n            return(synth(405,\"Method not allowed\"));\n        }\n        \n        if (req.http.x-ban-expression) {\n            ban(req.http.x-ban-expression);\n            return(synth(200, \"Banned expression\"));\n        \n        } else if (req.http.x-ban-url) {\n            ban(\n                \"obj.http.x-host == \" + req.http.host + \" \u0026\u0026 \" +\n                \"obj.http.x-url ~ \" + req.http.x-ban-url\n            );\n            \n            return(synth(200, \"Banned URL\"));\n        }\n        \n        return(synth(400, \"No bans\"));        \n    }\n\n    [...]\n\n    return(hash);\n}\n\nsub vcl_backend_response {\n    [...]\n\n    # be friendly to ban lurker\n    set beresp.http.x-url = bereq.url;\n    set beresp.http.x-host = bereq.http.host;\n\n    [...]\n}\n\nsub vcl_deliver {\n    [...]\n    \n    # remove some variables we used before\n    unset resp.http.x-url;\n    unset resp.http.x-host;\n    unset resp.http.xkey;\n    \n    [...]\n}\n```\n\n## Build\n\nOn Linux:\n\n```\n$ git clone github.com/emgag/varnish-towncrier \n$ cd varnish-towncrier\n$ make \n```\n\n## License\n\nvarnish-towncrier is licensed under the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femgag%2Fvarnish-towncrier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femgag%2Fvarnish-towncrier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femgag%2Fvarnish-towncrier/lists"}