caddy/caddytest/integration
Francis Lavoie 95b6ac44a6
caddyhttp: Fix fallback for the error handler chain
This is mainly a problem with the default behaviour of the Caddyfile's `handle_errors` routes, but it's kinda tricky to solve well. I went with an approach that involves a smidge of magic which might not really be desirable.

See https://caddy.community/t/problem-with-basicauth-handle-errors/12243/9 for context.

So we do already have a default fallback for error routes, i.e. `errorEmptyHandler` in `caddyhttp.go` which is always configured as the last handler in the chain (implicitly, not visible in the config).

The problem is that when subroutes come into play with `"terminal": true`, then this fallback handler will never be reached. This is the case when the Caddyfile generates a config which has a host matcher from a site block (which is most of the time) when the user configured `handle_errors` to handle specific errors (such as 502s or 404s to serve HTML pages for those, etc). If other errors, like `basicauth`'s 401s are emitted in that case, then the result is that the default of HTTP status 200 will be served instead of the 401, which breaks `basicauth` completely.

The fix I went with is to make the Caddyfile adapter append special `error` handlers inside of the `handle_errors` subroutes which throw error `-1`, which `server.go` then picks up, and seeing `-1` responds with the original error code of `401` instead. The `-1` thing is the aforementioned magic.

At first, I had this implemented with `static_response` setting the StatusCode to `{http.error.status_code}`, but it didn't feel right to use a placeholder because it's inherently slightly less efficient, and it wasn't 100% correct because non-handler errors wouldn't be handled as 500s properly I think (because if it's not a `HandlerError`, then `http.error.status_code` doesn't exist, so it would maybe try to write an the placeholder replacement result of an empty string as `0` for the status code).
2021-05-05 07:27:33 -04:00
..
caddyfile_adapt caddyhttp: Fix fallback for the error handler chain 2021-05-05 07:27:33 -04:00
testdata
autohttps_test.go caddyhttp: Implement better logic for inserting the HTTP->HTTPS redirs (#4033) 2021-04-19 19:54:12 -06:00
caddyfile_adapt_test.go encode,staticfiles: Content negotiation, precompressed files (#4045) 2021-03-29 18:47:19 -06:00
caddyfile_test.go
handler_test.go browse: align template to struct field renames from 4940325 (#3706) 2020-09-08 10:45:48 -06:00
map_test.go map: Accept regex substitution in outputs (#3991) 2021-03-10 14:22:33 -07:00
reverseproxy_test.go reverseproxy: Fix dial placeholders, SRV, active health checks (#3780) 2020-10-13 10:35:20 -06:00
sni_test.go map: Reimplement; multiple outputs; optimize 2020-10-02 14:23:56 -06:00
stream_test.go reverse_proxy: fix bidirectional streams with encodings (fix #3606) (#3620) 2020-08-03 20:50:38 -06:00