Flag --default-http-code for the serve subcommand added (#44)

This commit is contained in:
Paramtamtam 2022-01-03 21:51:30 +05:00 committed by GitHub
parent 1dec69d726
commit 79bbf3d71e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 53 additions and 9 deletions

View File

@ -196,12 +196,12 @@ jobs: # Docs: <https://git.io/JvxXE>
run: docker load < docker-image.tar run: docker load < docker-image.tar
- name: Run container with the app - name: Run container with the app
run: docker run --rm -d -p "8080:8080/tcp" --name app app:ci run: docker run --rm -d -p "8080:8080/tcp" -e "DEFAULT_HTTP_CODE=401" --name app app:ci
- name: Wait for container "healthy" state - name: Wait for container "healthy" state
run: until [[ "`docker inspect -f {{.State.Health.Status}} app`" == "healthy" ]]; do echo "wait 1 sec.."; sleep 1; done run: until [[ "`docker inspect -f {{.State.Health.Status}} app`" == "healthy" ]]; do echo "wait 1 sec.."; sleep 1; done
- run: curl --fail http://127.0.0.1:8080/ - run: test $(curl --write-out %{http_code} --silent --output /dev/null http://127.0.0.1:8080/) -eq 401
- run: curl --fail http://127.0.0.1:8080/500.html - run: curl --fail http://127.0.0.1:8080/500.html
- run: curl --fail http://127.0.0.1:8080/400.html - run: curl --fail http://127.0.0.1:8080/400.html
- run: curl --fail http://127.0.0.1:8080/health/live - run: curl --fail http://127.0.0.1:8080/health/live

View File

@ -5,6 +5,8 @@ run:
skip-dirs: skip-dirs:
- .github - .github
- .git - .git
- tmp
- temp
modules-download-mode: readonly modules-download-mode: readonly
allow-parallel-runners: true allow-parallel-runners: true

View File

@ -6,10 +6,16 @@ The format is based on [Keep a Changelog][keepachangelog] and this project adher
## UNRELEASED ## UNRELEASED
### Added
- Flag `--default-http-code` for the `serve` subcommand (`404` is used by default instead of `200`, environment name `DEFAULT_HTTP_CODE`) [#41]
### Changed ### Changed
- Go updated from `1.17.1` up to `1.17.5` - Go updated from `1.17.1` up to `1.17.5`
[#41]:https://github.com/tarampampam/error-pages/issues/41
## v2.2.0 ## v2.2.0
### Added ### Added

View File

@ -65,7 +65,8 @@ WORKDIR /opt
ENV LISTEN_PORT="8080" \ ENV LISTEN_PORT="8080" \
TEMPLATE_NAME="ghost" \ TEMPLATE_NAME="ghost" \
DEFAULT_ERROR_PAGE="404" DEFAULT_ERROR_PAGE="404" \
DEFAULT_HTTP_CODE="404"
# Docs: <https://docs.docker.com/engine/reference/builder/#healthcheck> # Docs: <https://docs.docker.com/engine/reference/builder/#healthcheck>
HEALTHCHECK --interval=7s --timeout=2s CMD [ \ HEALTHCHECK --interval=7s --timeout=2s CMD [ \

View File

@ -144,7 +144,7 @@ func run(parentCtx context.Context, log *zap.Logger, f flags, cfg *config.Config
server := appHttp.NewServer(log) server := appHttp.NewServer(log)
// register server routes, middlewares, etc. // register server routes, middlewares, etc.
server.Register(&errorPages, picker, f.defaultErrorPage) server.Register(&errorPages, picker, f.defaultErrorPage, f.defaultHTTPCode)
startedAt, startingErrCh := time.Now(), make(chan error, 1) // channel for server starting error startedAt, startingErrCh := time.Now(), make(chan error, 1) // channel for server starting error
@ -156,6 +156,7 @@ func run(parentCtx context.Context, log *zap.Logger, f flags, cfg *config.Config
zap.String("addr", f.listen.ip), zap.String("addr", f.listen.ip),
zap.Uint16("port", f.listen.port), zap.Uint16("port", f.listen.port),
zap.String("default error page", f.defaultErrorPage), zap.String("default error page", f.defaultErrorPage),
zap.Uint16("default HTTP response code", f.defaultHTTPCode),
) )
if err := server.Start(f.listen.ip, f.listen.port); err != nil { if err := server.Start(f.listen.ip, f.listen.port); err != nil {

View File

@ -19,6 +19,7 @@ type flags struct {
name string name string
} }
defaultErrorPage string defaultErrorPage string
defaultHTTPCode uint16
} }
const ( const (
@ -26,6 +27,7 @@ const (
portFlagName = "port" portFlagName = "port"
templateNameFlagName = "template-name" templateNameFlagName = "template-name"
defaultErrorPageFlagName = "default-error-page" defaultErrorPageFlagName = "default-error-page"
defaultHTTPCodeFlagName = "default-http-code"
) )
const ( const (
@ -61,9 +63,15 @@ func (f *flags) init(flagSet *pflag.FlagSet) {
"404", "404",
fmt.Sprintf("default error page [$%s]", env.DefaultErrorPage), fmt.Sprintf("default error page [$%s]", env.DefaultErrorPage),
) )
flagSet.Uint16VarP(
&f.defaultHTTPCode,
defaultHTTPCodeFlagName, "",
404, //nolint:gomnd
fmt.Sprintf("default HTTP response code [$%s]", env.DefaultHTTPCode),
)
} }
func (f *flags) overrideUsingEnv(flagSet *pflag.FlagSet) (lastErr error) { func (f *flags) overrideUsingEnv(flagSet *pflag.FlagSet) (lastErr error) { //nolint:gocognit
flagSet.VisitAll(func(flag *pflag.Flag) { flagSet.VisitAll(func(flag *pflag.Flag) {
// flag was NOT defined using CLI (flags should have maximal priority) // flag was NOT defined using CLI (flags should have maximal priority)
if !flag.Changed { //nolint:nestif if !flag.Changed { //nolint:nestif
@ -91,6 +99,15 @@ func (f *flags) overrideUsingEnv(flagSet *pflag.FlagSet) (lastErr error) {
if envVar, exists := env.DefaultErrorPage.Lookup(); exists { if envVar, exists := env.DefaultErrorPage.Lookup(); exists {
f.defaultErrorPage = strings.TrimSpace(envVar) f.defaultErrorPage = strings.TrimSpace(envVar)
} }
case defaultHTTPCodeFlagName:
if envVar, exists := env.DefaultHTTPCode.Lookup(); exists {
if code, err := strconv.ParseUint(envVar, 10, 16); err == nil { //nolint:gomnd
f.defaultHTTPCode = uint16(code)
} else {
lastErr = fmt.Errorf("wrong default HTTP response code environment variable [%s] value", envVar)
}
}
} }
} }
}) })
@ -103,5 +120,9 @@ func (f *flags) validate() error {
return fmt.Errorf("wrong IP address [%s] for listening", f.listen.ip) return fmt.Errorf("wrong IP address [%s] for listening", f.listen.ip)
} }
if f.defaultHTTPCode > 599 { //nolint:gomnd
return fmt.Errorf("wrong default HTTP response code [%d]", f.defaultHTTPCode)
}
return nil return nil
} }

1
internal/env/env.go vendored
View File

@ -11,6 +11,7 @@ const (
TemplateName envVariable = "TEMPLATE_NAME" // template name TemplateName envVariable = "TEMPLATE_NAME" // template name
ConfigFilePath envVariable = "CONFIG_FILE" // path to the config file ConfigFilePath envVariable = "CONFIG_FILE" // path to the config file
DefaultErrorPage envVariable = "DEFAULT_ERROR_PAGE" // default error page (code) DefaultErrorPage envVariable = "DEFAULT_ERROR_PAGE" // default error page (code)
DefaultHTTPCode envVariable = "DEFAULT_HTTP_CODE" // default HTTP response code
) )
// String returns environment variable name in the string representation. // String returns environment variable name in the string representation.

View File

@ -13,6 +13,7 @@ func TestConstants(t *testing.T) {
assert.Equal(t, "TEMPLATE_NAME", string(TemplateName)) assert.Equal(t, "TEMPLATE_NAME", string(TemplateName))
assert.Equal(t, "CONFIG_FILE", string(ConfigFilePath)) assert.Equal(t, "CONFIG_FILE", string(ConfigFilePath))
assert.Equal(t, "DEFAULT_ERROR_PAGE", string(DefaultErrorPage)) assert.Equal(t, "DEFAULT_ERROR_PAGE", string(DefaultErrorPage))
assert.Equal(t, "DEFAULT_HTTP_CODE", string(DefaultHTTPCode))
} }
func TestEnvVariable_Lookup(t *testing.T) { func TestEnvVariable_Lookup(t *testing.T) {
@ -24,6 +25,7 @@ func TestEnvVariable_Lookup(t *testing.T) {
{giveEnv: TemplateName}, {giveEnv: TemplateName},
{giveEnv: ConfigFilePath}, {giveEnv: ConfigFilePath},
{giveEnv: DefaultErrorPage}, {giveEnv: DefaultErrorPage},
{giveEnv: DefaultHTTPCode},
} }
for _, tt := range cases { for _, tt := range cases {

View File

@ -17,13 +17,18 @@ type (
) )
// NewHandler creates handler for the index page serving. // NewHandler creates handler for the index page serving.
func NewHandler(e errorsPager, p templatePicker, defaultPageCode string) fasthttp.RequestHandler { func NewHandler(
e errorsPager,
p templatePicker,
defaultPageCode string,
defaultHTTPCode uint16,
) fasthttp.RequestHandler {
return func(ctx *fasthttp.RequestCtx) { return func(ctx *fasthttp.RequestCtx) {
content, err := e.GetPage(p.Pick(), defaultPageCode) content, err := e.GetPage(p.Pick(), defaultPageCode)
if err == nil { if err == nil {
ctx.SetContentType("text/html; charset=utf-8") ctx.SetContentType("text/html; charset=utf-8")
ctx.SetStatusCode(fasthttp.StatusOK) ctx.SetStatusCode(int(defaultHTTPCode))
_, _ = ctx.Write(content) _, _ = ctx.Write(content)
return return

View File

@ -66,8 +66,13 @@ type (
// Register server routes, middlewares, etc. // Register server routes, middlewares, etc.
// Router docs: <https://github.com/fasthttp/router> // Router docs: <https://github.com/fasthttp/router>
func (s *Server) Register(errorsPager errorsPager, templatePicker templatePicker, defaultPageCode string) { func (s *Server) Register(
s.router.GET("/", indexHandler.NewHandler(errorsPager, templatePicker, defaultPageCode)) errorsPager errorsPager,
templatePicker templatePicker,
defaultPageCode string,
defaultHTTPCode uint16,
) {
s.router.GET("/", indexHandler.NewHandler(errorsPager, templatePicker, defaultPageCode, defaultHTTPCode))
s.router.GET("/version", versionHandler.NewHandler(version.Version())) s.router.GET("/version", versionHandler.NewHandler(version.Version()))
s.router.ANY("/health/live", healthzHandler.NewHandler(checkers.NewLiveChecker())) s.router.ANY("/health/live", healthzHandler.NewHandler(checkers.NewLiveChecker()))
s.router.GET("/{code}.html", errorpageHandler.NewHandler(errorsPager, templatePicker)) s.router.GET("/{code}.html", errorpageHandler.NewHandler(errorsPager, templatePicker))