httpfx

package
v0.7.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 13, 2025 License: Apache-2.0 Imports: 15 Imported by: 0

README

ajan/httpfx

Overview

httpfx package provides a framework for building HTTP services with support for routing, middleware, and OpenAPI documentation generation.

The documentation below provides an overview of the package, its types, functions, and usage examples. For more detailed information, refer to the source code and tests.

Configuration

Configuration struct for the HTTP service:

type Config struct {
	Addr string `conf:"addr" default:":8080"`

	CertString        string        `conf:"cert_string"`
	KeyString         string        `conf:"key_string"`
	ReadHeaderTimeout time.Duration `conf:"read_header_timeout" default:"5s"`
	ReadTimeout       time.Duration `conf:"read_timeout"        default:"10s"`
	WriteTimeout      time.Duration `conf:"write_timeout"       default:"10s"`
	IdleTimeout       time.Duration `conf:"idle_timeout"        default:"120s"`

	InitializationTimeout   time.Duration `conf:"init_timeout"     default:"25s"`
	GracefulShutdownTimeout time.Duration `conf:"shutdown_timeout" default:"5s"`

	SelfSigned bool `conf:"self_signed" default:"false"`

	HealthCheckEnabled bool `conf:"health_check" default:"true"`
	OpenAPIEnabled     bool `conf:"openapi"      default:"true"`
	ProfilingEnabled   bool `conf:"profiling"    default:"false"`
}

Example configuration:

config := &httpfx.Config{
	Addr:            ":8080",
	ReadTimeout:     15 * time.Second,
	WriteTimeout:    15 * time.Second,
	IdleTimeout:     60 * time.Second,
	OpenAPIEnabled:  true,
	SelfSigned:      false,
}

API

NewRouter function

Create a new Router object.

// func NewRouter(path string) *RouterImpl

router := httpfx.NewRouter("/")
NewHTTPService function

Creates a new HTTPService object based on the provided configuration.

// func NewHTTPService(config *Config, router Router) *HTTPServiceImpl

router := httpfx.NewRouter("/")
hs := httpfx.NewHTTPService(config, router)

Key Features

  • HTTP routing with support for path parameters and wildcards
  • Middleware support for request/response processing
  • OpenAPI documentation generation
  • Graceful shutdown handling
  • Configurable timeouts and server settings
  • Integration with dependency injection
  • Support for CORS and security headers
  • Request logging and metrics

Example Usage

func main() {
	// Create router
	router := httpfx.NewRouter("/api")

	// Add routes
	router.Get("/health", func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		w.Write([]byte("OK"))
	})

	// Add middleware
	router.Use(httpfx.LoggerMiddleware())
	router.Use(httpfx.RecoveryMiddleware())

	// Create and start service
	config := &httpfx.Config{
		Addr: ":8080",
	}
	service := httpfx.NewHTTPService(config, router)

	if err := service.Start(); err != nil {
		log.Fatal(err)
	}
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrFailedToLoadCertificate        = errors.New("failed to load certificate")
	ErrFailedToGenerateSelfSignedCert = errors.New("failed to generate self-signed certificate")
	ErrFailedToCreateHTTPMetrics      = errors.New("failed to create HTTP metrics")
	ErrHTTPServiceNetListenError      = errors.New("HTTP service net listen error")
)
View Source
var (
	ErrFailedToBuildHTTPRequestsCounter = errors.New(
		"failed to build HTTP requests counter",
	)
	ErrFailedToBuildHTTPRequestDurationHistogram = errors.New(
		"failed to build HTTP request duration histogram",
	)
)

Functions

This section is empty.

Types

type Config

type Config struct {
	Addr string `conf:"addr" default:":8080"`

	CertString        string        `conf:"cert_string"`
	KeyString         string        `conf:"key_string"`
	ReadHeaderTimeout time.Duration `conf:"read_header_timeout" default:"5s"`
	ReadTimeout       time.Duration `conf:"read_timeout"        default:"10s"`
	WriteTimeout      time.Duration `conf:"write_timeout"       default:"10s"`
	IdleTimeout       time.Duration `conf:"idle_timeout"        default:"120s"`

	InitializationTimeout   time.Duration `conf:"init_timeout"     default:"25s"`
	GracefulShutdownTimeout time.Duration `conf:"shutdown_timeout" default:"5s"`

	SelfSigned bool `conf:"self_signed" default:"false"`

	HealthCheckEnabled bool `conf:"health_check" default:"true"`
	OpenAPIEnabled     bool `conf:"openapi"      default:"true"`
	ProfilingEnabled   bool `conf:"profiling"    default:"false"`
}

type Context

type Context struct {
	Request        *http.Request
	ResponseWriter http.ResponseWriter

	Results Results
	// contains filtered or unexported fields
}

func (*Context) Next

func (c *Context) Next() Result

func (*Context) UpdateContext

func (c *Context) UpdateContext(ctx context.Context)

type ContextKey

type ContextKey string

type HTTPService added in v0.7.0

type HTTPService struct {
	InnerServer  *http.Server
	InnerRouter  *Router
	InnerMetrics *Metrics

	Config *Config
	// contains filtered or unexported fields
}

func NewHTTPService added in v0.7.0

func NewHTTPService(
	config *Config,
	router *Router,
	metricsProvider *metricsfx.MetricsProvider,
	logger *logfx.Logger,
) *HTTPService

func (*HTTPService) Router added in v0.7.0

func (hs *HTTPService) Router() *Router

func (*HTTPService) Server added in v0.7.0

func (hs *HTTPService) Server() *http.Server

func (*HTTPService) SetupTLS added in v0.7.0

func (hs *HTTPService) SetupTLS(ctx context.Context) error

func (*HTTPService) Start added in v0.7.0

func (hs *HTTPService) Start(ctx context.Context) (func(), error)

type Handler

type Handler func(*Context) Result

type HandlerChain

type HandlerChain []Handler

type Metrics

type Metrics struct {
	Provider *metricsfx.MetricsProvider

	RequestsTotal   *metricsfx.CounterMetric
	RequestDuration *metricsfx.HistogramMetric
}

Metrics holds HTTP-specific metrics using the simplified MetricsBuilder approach.

func NewMetrics

func NewMetrics(provider *metricsfx.MetricsProvider) *Metrics

NewMetrics creates HTTP metrics using the simplified MetricsBuilder.

func (*Metrics) Init added in v0.7.0

func (metrics *Metrics) Init() error

type Middleware

type Middleware func() Handler

type Result

type Result struct {
	InnerRedirectToURI string
	results.Result

	InnerBody []byte

	InnerStatusCode int
}

func (Result) Body

func (r Result) Body() []byte

func (Result) RedirectToURI added in v0.7.0

func (r Result) RedirectToURI() string

func (Result) StatusCode

func (r Result) StatusCode() int

func (Result) WithBody

func (r Result) WithBody(body string) Result

func (Result) WithStatusCode

func (r Result) WithStatusCode(statusCode int) Result

type ResultOption added in v0.6.30

type ResultOption func(*Result)

Result Options.

func WithBody added in v0.6.30

func WithBody(body []byte) ResultOption

func WithJSON added in v0.7.0

func WithJSON(body any) ResultOption

func WithPlainText added in v0.6.30

func WithPlainText(body string) ResultOption

type Results

type Results struct{}

Results With Options.

func (*Results) Abort

func (r *Results) Abort() Result

func (*Results) Accepted added in v0.6.30

func (r *Results) Accepted(options ...ResultOption) Result

func (*Results) BadRequest

func (r *Results) BadRequest(options ...ResultOption) Result

func (*Results) Bytes

func (r *Results) Bytes(body []byte) Result

Results Without Options.

func (*Results) Error

func (r *Results) Error(statusCode int, options ...ResultOption) Result

func (*Results) JSON added in v0.7.0

func (r *Results) JSON(body any) Result

func (*Results) NotFound

func (r *Results) NotFound(options ...ResultOption) Result

func (*Results) Ok

func (r *Results) Ok(options ...ResultOption) Result

func (*Results) PlainText

func (r *Results) PlainText(body []byte) Result

func (*Results) Redirect

func (r *Results) Redirect(uri string) Result

func (*Results) Unauthorized

func (r *Results) Unauthorized(options ...ResultOption) Result

type Route

type Route struct {
	Pattern        *uris.Pattern
	Parameters     []RouterParameter
	Handlers       []Handler
	MuxHandlerFunc func(http.ResponseWriter, *http.Request)

	Spec RouteOpenAPISpec
}

func (*Route) HasDescription

func (r *Route) HasDescription(description string) *Route

func (*Route) HasOperationID added in v0.7.0

func (r *Route) HasOperationID(operationID string) *Route

func (*Route) HasPathParameter

func (r *Route) HasPathParameter(name string, description string) *Route

func (*Route) HasQueryParameter

func (r *Route) HasQueryParameter(name string, description string) *Route

func (*Route) HasRequestModel

func (r *Route) HasRequestModel(model any) *Route

func (*Route) HasResponse

func (r *Route) HasResponse(statusCode int) *Route

func (*Route) HasResponseModel

func (r *Route) HasResponseModel(statusCode int, model any) *Route

func (*Route) HasSummary

func (r *Route) HasSummary(summary string) *Route

func (*Route) HasTags

func (r *Route) HasTags(tags ...string) *Route

func (*Route) IsDeprecated

func (r *Route) IsDeprecated() *Route

type RouteOpenAPISpec added in v0.7.0

type RouteOpenAPISpec struct {
	OperationID string
	Summary     string
	Description string
	Tags        []string

	Requests   []RouteOpenAPISpecRequest
	Responses  []RouteOpenAPISpecResponse
	Deprecated bool
}

type RouteOpenAPISpecRequest added in v0.7.0

type RouteOpenAPISpecRequest struct {
	Model any
}

type RouteOpenAPISpecResponse added in v0.7.0

type RouteOpenAPISpecResponse struct {
	Model      any
	StatusCode int
	HasModel   bool
}

type RouteParameterType added in v0.6.17

type RouteParameterType int
const (
	RouteParameterTypeHeader RouteParameterType = iota
	RouteParameterTypeQuery
	RouteParameterTypePath
	RouteParameterTypeBody
)

func (RouteParameterType) String added in v0.7.0

func (i RouteParameterType) String() string

type Router

type Router struct {
	// contains filtered or unexported fields
}

func NewRouter

func NewRouter(path string) *Router

func (*Router) GetHandlers

func (r *Router) GetHandlers() []Handler

func (*Router) GetMux

func (r *Router) GetMux() *http.ServeMux

func (*Router) GetPath

func (r *Router) GetPath() string

func (*Router) GetRoutes

func (r *Router) GetRoutes() []*Route

func (*Router) Group

func (r *Router) Group(path string) *Router

func (*Router) Route

func (r *Router) Route(pattern string, handlers ...Handler) *Route

func (*Router) Use

func (r *Router) Use(handlers ...Handler)

type RouterParameter added in v0.6.17

type RouterParameter struct {
	Name        string
	Description string
	Validators  []RouterParameterValidator
	Type        RouteParameterType
	IsRequired  bool
}

type RouterParameterValidator added in v0.6.17

type RouterParameterValidator func(inputString string) (string, error)

Directories

Path Synopsis
modules

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL