Documentation
¶
Overview ¶
Package httpserver can host an HTTP server in the CLI app.
Index ¶
- Variables
- func ContextValue(s *Server) cli.Action
- func ExpandRequest(r *http.Request, ww wrapResponseWriter) expander.Interface
- func FlagsAndArgs() cli.Action
- func Handle(path string, h http.Handler) cli.Action
- func HandleFunc(path string, h http.HandlerFunc) cli.Action
- func HandleSpec(vpath httpclient.VirtualPath, spec HandlerSpec) cli.Action
- func ListHandlers() cli.Action
- func NewEchoHandler(failsafe bool) http.Handler
- func NewHeaderMiddleware(name, value string) func(http.Handler) http.Handler
- func NewPingHandler() http.Handler
- func NewReloadHandler(s *Server) http.Handler
- func NewRequestLogger(format string, out io.Writer, next http.Handler) http.Handler
- func RunServer(actionopt ...cli.Action) cli.Action
- func SetAccessLog(v ...string) cli.Action
- func SetAddr(s ...string) cli.Action
- func SetFileServerHandler(v ...httpclient.VirtualPath) cli.Action
- func SetHandler(v ...httpclient.VirtualPath) cli.Action
- func SetHideDirectoryListings() cli.Action
- func SetHostname(s ...string) cli.Action
- func SetIdleTimeout(d ...time.Duration) cli.Action
- func SetMaxHeaderBytes(v ...int) cli.Action
- func SetNoAccessLog() cli.Action
- func SetOpenInBrowser() cli.Action
- func SetPort(s ...int) cli.Action
- func SetReadHeaderTimeout(d ...time.Duration) cli.Action
- func SetReadTimeout(d ...time.Duration) cli.Action
- func SetServerHeader(v ...string) cli.Action
- func SetShutdownTimeout(d ...time.Duration) cli.Action
- func SetStaticDirectory(f ...*cli.File) cli.Action
- func SetTLSCertFile(v ...*cli.File) cli.Action
- func SetTLSKeyFile(v ...*cli.File) cli.Action
- func SetWriteTimeout(d ...time.Duration) cli.Action
- func SourceAnnotation() (string, string)
- type HandlerSpec
- type MiddlewareFunc
- type Option
- func AddReadyFunc(ready ReadyFunc) Option
- func AddShutdownFunc(shutdown ReadyFunc) Option
- func WithAccessLog(s string) Option
- func WithAction(a cli.Action) Option
- func WithAddr(addr string) Option
- func WithDefaultAction() Option
- func WithHandler(handler http.Handler) Option
- func WithHandlerFactory(f func(*Server) (http.Handler, error)) Option
- func WithHideDirectoryListings(v bool) Option
- func WithHostname(v string) Option
- func WithIdleTimeout(d time.Duration) Option
- func WithMaxHeaderBytes(n int) Option
- func WithMiddleware(m MiddlewareFunc) Option
- func WithNoAccessLog() Option
- func WithPort(v int) Option
- func WithReadHeaderTimeout(d time.Duration) Option
- func WithReadTimeout(d time.Duration) Option
- func WithReadyFunc(ready ReadyFunc) Option
- func WithServerHeader(s string) Option
- func WithShutdownFunc(shutdown ReadyFunc) Option
- func WithShutdownTimeout(d time.Duration) Option
- func WithStaticDirectory(path string) Option
- func WithTLSCertFile(filename string) Option
- func WithTLSKeyFile(filename string) Option
- func WithWriteTimeout(d time.Duration) Option
- type Options
- type ReadyFunc
- type ReloadableHandler
- type Server
- func (s *Server) AddMiddleware(m MiddlewareFunc) error
- func (s *Server) AddReadyFunc(ready ReadyFunc) error
- func (s *Server) AddShutdownFunc(shutdown ReadyFunc) error
- func (s *Server) Apply(opts ...Option)
- func (s *Server) Handle(path string, h http.Handler) (err error)
- func (s *Server) HideDirectoryListing() bool
- func (s *Server) ListenAndServe() error
- func (s *Server) OpenInBrowser(path ...string) error
- func (s *Server) Pipeline() cli.Action
- func (s *Server) ReloadAll()
- func (s *Server) ReportListening() error
- func (s *Server) SetAccessLog(v string) error
- func (s *Server) SetAddr(addr string) error
- func (s *Server) SetHideDirectoryListings(v bool) error
- func (s *Server) SetHostname(name string) error
- func (s *Server) SetIdleTimeout(v time.Duration) error
- func (s *Server) SetMaxHeaderBytes(v int) error
- func (s *Server) SetPort(port int) error
- func (s *Server) SetReadHeaderTimeout(v time.Duration) error
- func (s *Server) SetReadTimeout(v time.Duration) error
- func (s *Server) SetServerHeader(name string) error
- func (s *Server) SetShutdownTimeout(d time.Duration) error
- func (s *Server) SetStaticDirectory(path string) error
- func (s *Server) SetTLSCertFile(v string) error
- func (s *Server) SetTLSKeyFile(v string) error
- func (s *Server) SetWriteTimeout(v time.Duration) error
- func (s *Server) WithHandler(handler http.Handler) error
- func (s *Server) WithHandlerFactory(f func(*Server) (http.Handler, error)) error
- func (s *Server) WithReadyFunc(ready ReadyFunc) error
- func (s *Server) WithShutdownFunc(shutdown ReadyFunc) error
Constants ¶
This section is empty.
Variables ¶
var ( DefaultReadyFunc = ComposeReadyFuncs( ReportListening(), ReloadServer(), ) )
DefaultReadyFunc provides the default behavior when the server starts
var ( // ErrNotListening is reported when the server is not listening ErrNotListening = errors.New("server is not listening") )
var HandlerRegistry = &provider.Registry{ Name: "handlers", Providers: provider.Details{ "ping": { Factory: provider.FactoryOf(newPingHandlerWithOpts), HelpText: "Responds simply Generates a ping", }, "file": { Factory: provider.FactoryOf(newFileServerHandlerWithOpts), HelpText: "Serve a particular directory as static files", Defaults: map[string]string{ "directory": ".", "hide_directory_listing": "false", }, }, "reload": { Value: HandlerSpec(func(ctx context.Context, _ httpclient.VirtualPath) (http.Handler, error) { return NewReloadHandler(FromContext(ctx)), nil }), HelpText: "Reloads the server", }, "redirect": { Factory: provider.FactoryOf(newRedirectServerHandlerWithOpts), HelpText: "Redirect to the given path and provide a status code", Defaults: map[string]string{ "to": "/", "code": strconv.Itoa(http.StatusTemporaryRedirect), }, }, "echo": { Factory: provider.FactoryOf(newEchoHandlerWithOpts), HelpText: "Reflects out the request and connection information", Defaults: map[string]string{ "failsafe": "false", }, Aliases: []string{"reflect"}, }, }, }
HandlerRegistry provides the default handler registry.
Functions ¶
func ContextValue ¶
func ContextValue(s *Server) cli.Action
func FlagsAndArgs ¶
func FlagsAndArgs() cli.Action
FlagsAndArgs adds numerous flags that can be used to configure the server in the context. The default flags list contains all of the flag actions in this package except for SetHandler and its variants.
func HandleFunc ¶ added in v0.7.0
func HandleFunc(path string, h http.HandlerFunc) cli.Action
HandleFunc registers the given handler with the context server
func HandleSpec ¶ added in v0.7.1
func HandleSpec(vpath httpclient.VirtualPath, spec HandlerSpec) cli.Action
HandleSpec registers the given handler spec with the context server
func ListHandlers ¶
func ListHandlers() cli.Action
ListHandlers provides an action which lists the handlers for the handler flag. When used in the Uses pipeline, also sets reasonable defaults for a flag. This handler is not included in FlagsAndArgs
func NewEchoHandler ¶ added in v0.5.4
NewEchoHandler provides a handler which echoes the request back in the response. An option failsafe indicates whether the response will always be 200 OK even if the request is malformed.
func NewHeaderMiddleware ¶
NewHeaderMiddleware provides handler middleware which simply adds the given header
func NewPingHandler ¶
NewPingHandler provides a handler which simply replies with a message
func NewReloadHandler ¶ added in v0.7.4
NewReloadHandler provides a handler which triggers the server to reload all handlers
func NewRequestLogger ¶
NewRequestLogger provides handler middleware to write to access log
func RunServer ¶
func RunServer(actionopt ...cli.Action) cli.Action
RunServer locates the server in context and runs it until interrupt signal is detected. Optional actions run just before the server starts up, typically used to provide context-bound modifications to the server just in time.
func SetAccessLog ¶
func SetAccessLog(v ...string) cli.Action
func SetAddr ¶
func SetAddr(s ...string) cli.Action
SetAddr sets the server address, which either uses the specified value or reads from the corresponding flag/arg to get the value to set.
func SetFileServerHandler ¶
func SetFileServerHandler(v ...httpclient.VirtualPath) cli.Action
SetFileServerHandler adds the specified file server handler to the mux. This can be called multiple times. This handler is not included in FlagsAndArgs
func SetHandler ¶
func SetHandler(v ...httpclient.VirtualPath) cli.Action
SetHandler adds the specified handler to the mux. This can be called multiple times. SetHandler only works if a Registry named "handlers" is present in the context to convert the handler spec to the correct implementation. Consider adding HandlerRegistry to the Uses pipeline.. This handler is not included in FlagsAndArgs
func SetHideDirectoryListings ¶ added in v0.7.3
func SetHideDirectoryListings() cli.Action
SetHideDirectoryListings causes directories not to be listed
func SetHostname ¶
func SetHostname(s ...string) cli.Action
SetHostname sets the server address, which either uses the specified value or reads from the corresponding flag/arg to get the value to set.
func SetIdleTimeout ¶
SetIdleTimeout sets the maximum amount of time to wait for the next request when keep-alives are enabled, which either uses the specified value or reads from the corresponding flag/arg to get the value to set. If zero is set, then the value of read time is used, unless both are zero in which case there is no timeout.
func SetMaxHeaderBytes ¶
func SetMaxHeaderBytes(v ...int) cli.Action
SetMaxHeaderBytes sets the maximum header size in bytes
func SetNoAccessLog ¶
func SetNoAccessLog() cli.Action
func SetOpenInBrowser ¶
func SetOpenInBrowser() cli.Action
SetOpenInBrowser causes the default Web browser to open when the server is ready
func SetPort ¶
func SetPort(s ...int) cli.Action
SetPort sets the server port, which either uses the specified value or reads from the corresponding flag/arg to get the value to set.
func SetReadHeaderTimeout ¶
SetReadHeaderTimeout sets the amount of time allowed to read request headers, which either uses the specified value or reads from the corresponding flag/arg to get the value to set.
func SetReadTimeout ¶
SetReadTimeout sets the maximum duration for reading the entire request, including the body, which either uses the specified value or reads from the corresponding flag/arg to get the value to set.
func SetServerHeader ¶ added in v0.7.0
func SetServerHeader(v ...string) cli.Action
func SetShutdownTimeout ¶
SetShutdownTimeout sets the maximum duration to wait for shutting down the server.
func SetStaticDirectory ¶
func SetStaticDirectory(f ...*cli.File) cli.Action
SetStaticDirectory sets the static directory to host
func SetTLSCertFile ¶
func SetTLSCertFile(v ...*cli.File) cli.Action
func SetTLSKeyFile ¶
func SetTLSKeyFile(v ...*cli.File) cli.Action
func SetWriteTimeout ¶
SetWriteTimeout sets the maximum duration before timing out writes of the response, which either uses the specified value or reads from the corresponding flag/arg to get the value to set.
func SourceAnnotation ¶
SourceAnnotation gets the name and value of the annotation added to the Data of all flags that are initialized from this package
Types ¶
type HandlerSpec ¶
type HandlerSpec func(context.Context, httpclient.VirtualPath) (http.Handler, error)
HandlerSpec creates a handler from a virtual path. The virtual path defines how the handler works. Typically, the physical path identifies a useful feature or the location of a file, and the options may be used for any purpose of customization.
func FileServerHandlerSpec ¶
func FileServerHandlerSpec() HandlerSpec
FileServerHandlerSpec creates a file server. The physical path in the virtual path specifies the base directory for the file server. An option named hide_directory_listing controls whether the directory listing response is served. The handler also consults the server for whether directory listings can be served.
func RegistryHandlerSpec ¶
func RegistryHandlerSpec(name string) HandlerSpec
RegistryHandlerSpec creates a handler by looking it up as a provider in the registry that is named. The physical path in the virtual path specifies the name of the provider which is used. The virtual path's options are propagated to the registry factory function.
type MiddlewareFunc ¶
MiddlewareFunc defines a function that creates a middleware wrapper around another handler
type Option ¶
type Option interface {
cli.Action
// contains filtered or unexported methods
}
Option is an option to configure the server Option can be used as an Action, typically within the Uses or Before pipeline.
func AddReadyFunc ¶
AddReadyFunc appends a callback for when the server is ready
func AddShutdownFunc ¶
AddShutdownFunc adds a callback for when the server is shutting down
func WithAccessLog ¶ added in v0.7.0
WithAccessLog sets the format string for the access log
func WithDefaultAction ¶ added in v0.7.3
func WithDefaultAction() Option
WithDefaultAction sets the action to the default
func WithHandler ¶
WithHandler sets the handler which will run on the server
func WithHandlerFactory ¶
WithHandlerFactory sets how to create the handler which will run on the server
func WithHideDirectoryListings ¶ added in v0.7.3
WithHideDirectoryListings disables directory listings
func WithIdleTimeout ¶ added in v0.7.0
WithIdleTimeout sets the amount of time to allow for idling
func WithMaxHeaderBytes ¶ added in v0.7.0
WithMaxHeaderBytes sets the amount max header bytes
func WithMiddleware ¶
func WithMiddleware(m MiddlewareFunc) Option
WithMiddleware adds handler middleware
func WithNoAccessLog ¶ added in v0.7.0
func WithNoAccessLog() Option
WithNoAccessLog disables the access log
func WithReadHeaderTimeout ¶ added in v0.7.0
WithReadHeaderTimeout sets the amount of time to allow for reading headers
func WithReadTimeout ¶ added in v0.7.0
WithReadTimeout sets the amount of time to allow for reading requests
func WithReadyFunc ¶
WithReadyFunc sets a callback for when the server is listening
func WithServerHeader ¶ added in v0.7.0
WithServerHeader sets the contents of the server header
func WithShutdownFunc ¶
WithShutdownFunc sets a callback for when the server is shutting down
func WithShutdownTimeout ¶
WithShutdownTimeout sets the amount of time to allow the server to shutdown
func WithStaticDirectory ¶ added in v0.7.0
WithStaticDirectory hosts a static directory
func WithTLSCertFile ¶ added in v0.7.0
WithTLSCertFile sets the file to use for the TLS cert
func WithTLSKeyFile ¶ added in v0.7.0
WithTLSKeyFile sets the file to use for the TLS key
func WithWriteTimeout ¶ added in v0.7.0
WithWriteTimeout sets the amount of time to allow for writing responses
type Options ¶ added in v0.7.4
type Options struct {
Addr *string `toml:"addr" json:"addr,omitempty"`
Hostname *string `toml:"hostname" json:"hostname,omitempty"`
Port *int `toml:"port" json:"port,omitempty"`
TLSCertFile *string `toml:"tls-cert-file" json:"tlsCertFile,omitempty"`
TLSKeyFile *string `toml:"tls-key-file" json:"tlsKeyFile,omitempty"`
ServerHeader *string `toml:"server-header" json:"serverHeader,omitempty"`
AccessLog *string `toml:"access-log" json:"accessLog,omitempty"`
StaticDirectory *string `toml:"static-directory" json:"staticDirectory,omitempty"`
HideDirectoryListings *bool `toml:"hide-directory-listings" json:"hideDirectoryListings,omitempty"`
ShutdownTimeout *time.Duration `toml:"shutdown-timeout" json:"shutdownTimeout,omitempty"`
ReadTimeout *time.Duration `toml:"read-timeout" json:"readTimeout,omitempty"`
ReadHeaderTimeout *time.Duration `toml:"read-header-timeout" json:"readHeaderTimeout,omitempty"`
WriteTimeout *time.Duration `toml:"write-timeout" json:"writeTimeout,omitempty"`
IdleTimeout *time.Duration `toml:"idle-timeout" json:"idleTimeout,omitempty"`
MaxHeaderBytes *int `toml:"max-header-bytes" json:"maxHeaderBytes,omitempty"`
}
Options contains settings for the server which have data representations. Each non-nil field is applied when Options is used as an Option.
type ReadyFunc ¶
ReadyFunc provides a function for when the server has started or stopped
func ComposeReadyFuncs ¶
ComposeReadyFuncs provides a ReadyFunc that combines a sequence
func OpenInBrowser ¶
OpenInBrowser is a function to open the server in the browser. This function is passed as a value to WithReadyFunc
func ReloadServer ¶ added in v0.7.1
func ReloadServer() ReadyFunc
ReloadServer provides a function which reloads reloadable handlers. This is included in the default ready function for the server. To defer loading to the first time a handler is invoked, you should remove this ready func from the server. If the server does not support reloading, this operation fails silently
func ReportListening ¶
func ReportListening() ReadyFunc
ReportListening is a ready func that prints a message to stderr that the server is listening
type ReloadableHandler ¶ added in v0.7.1
ReloadableHandler provides a handler whose internal state can be invalidated so that the next time it serves, it recomputes it
func NewReloadableHandler ¶ added in v0.7.1
NewReloadableHandler provides a handler which is reloadable. When the server starts or when the server is restarted, the function is invoked to generate the actual handler that is called. If an error is returned, the server will respond with 503 Service Unavailable.
type Server ¶
type Server struct {
*http.Server
cli.Action
TLSCertFile string
TLSKeyFile string
// ShutdownTimeout specifies how long to wait for the server to shutdown
// when a signal is received
ShutdownTimeout time.Duration
// contains filtered or unexported fields
}
Server provides an HTTP server (indeed http.Server is embedded) that can be initialized and hosted within a CLI app. The server is used within the Uses pipeline where it registers itself as a context service. The action RunServer is used to actually run the server.
The simplest action to use is RunServer(), which runs the server:
&cli.App{
Name: "goserv",
Uses: &httpserver.New(httpserver.WithHandler(...)),
Action: httpserver.RunServer(),
}
This simple app has numerous flags to configure connection handling and to dynamically construct the server's router. Many dynamic server routing actions depend upon the server having a handler which is also a mux that contains a method Handle(string, http.Handler) to register additional handlers. (This is the same API provided by the built-in Go mux, http.ServeMux). There are other APIs provided by convention, documented in their respective contexts.
The cmd/weave package provides weave, which is a command line utility that hosts a server for files and some built-in handlers, which is similar to what the DefaultServer() does.
If you only want to add the Server to the context (typically in advanced scenarios where you are deeply customizing the behavior), you only use the action httpserver.ContextValue() with the server you want to add instead of add the server to the pipeline directly.
func DefaultServer ¶
func DefaultServer() *Server
func FromContext ¶
FromContext obtains the server from the context.
func (*Server) AddMiddleware ¶
func (s *Server) AddMiddleware(m MiddlewareFunc) error
AddMiddleware appends additional middleware to the server
func (*Server) AddReadyFunc ¶ added in v0.7.0
AddReadyFunc appens additional ready functions
func (*Server) AddShutdownFunc ¶ added in v0.7.0
AddShutdownFunc appends additional shutdown functions
func (*Server) HideDirectoryListing ¶
func (*Server) ListenAndServe ¶
func (*Server) OpenInBrowser ¶
OpenInBrowser opens in the browser. The request path can also be specified
func (*Server) ReloadAll ¶ added in v0.7.1
func (s *Server) ReloadAll()
ReloadAll causes the server to reload all reloadable handlers. To support reloading, the built-in mux must be used. In particular, you can't specify a handler or handler factory directly.
func (*Server) ReportListening ¶
func (*Server) SetAccessLog ¶
func (*Server) SetHideDirectoryListings ¶ added in v0.7.3
func (*Server) SetHostname ¶
func (*Server) SetMaxHeaderBytes ¶
func (*Server) SetServerHeader ¶ added in v0.7.0
func (*Server) SetStaticDirectory ¶
func (*Server) SetTLSCertFile ¶
func (*Server) SetTLSKeyFile ¶
func (*Server) WithHandler ¶ added in v0.7.0
WithHandler sets the handler for the server
func (*Server) WithHandlerFactory ¶ added in v0.7.0
WithHandlerFactory sets the handler factory for the server
func (*Server) WithReadyFunc ¶ added in v0.7.0
WithReadyFunc sets the ready function for the server
func (*Server) WithShutdownFunc ¶ added in v0.7.0
WithShutdownFunc sets the shutdown function