GOV.UK Router is an HTTP reverse proxy built on top of triemux. It
loads a routing table into memory from a MongoDB database and:
- forwards requests to backend application servers according to the path in the request URL
- serves HTTP
301and302redirects for moved content and short URLs - serves
410 Goneresponses for resources that no longer exist
The sister project router-api provides a read/write
interface to the underlying database.
Recommended reading: How to Write Go Code
Checks run automatically on GitHub on PR and push. For faster feedback, you can run the tests locally.
The lint check uses golangci-lint, which you can install via Homebrew or your favourite package manager:
brew install golangci-lintYou can run all tests (some of which need Docker installed) by running:
make test
You can also run just the unit tests or just the integration tests, using the
unit_tests and integration_tests targets. The unit tests don't need Docker.
The trie and triemux packages have unit tests. To run these on their own:
go test -bench=. ./trie ./triemux
The integration tests need Docker in order to run MongoDB. They are intended to cover Router's overall request handling, error reporting and performance.
You can use --ginkgo.focus <partial regex> to run a subset of the integration
tests, for example:
go test ./integration_tests -v --ginkgo.focus 'redirect should preserve the query string'
To see debug messages when running tests, set both the ROUTER_DEBUG and
ROUTER_DEBUG_TESTS environment variables:
ROUTER_DEBUG=1 ROUTER_DEBUG_TESTS=1 make testThis project uses Go Modules to vendor its dependencies. To update the dependencies:
-
Update all the dependencies, including test dependencies, in your working copy:
make update_deps
-
Check for any errors and commit.
git commit -- go.{mod,sum} vendor -
Run the Router test suite. If you need to fix a failing test, keep your changes in separate commits to the
go get/go modcommit. -
Run the tests for all dependencies:
go test all- If there are failures, look into each one and determine whether it needs fixing.
- If anything under
vendor/needs changing then either raise a PR with the upstream project or revert to a set of versions that work together. Onlygo getandgo modshould touch files invendor/.
-
Raise a PR.
- Data structure
- Original thinking behind the router
- Example of adding a metric using the Go prometheus client library
GOV.UK Platform Engineering team looks after this repo. If you're inside GDS, you can find us in #govuk-platform-engineering or view our kanban board.