httpserver

package
v0.1.2 Latest Latest
Warning

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

Go to latest
Published: Nov 4, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

Package httpserver 提供独立 HTTP 服务端、普通请求停收和实际排空,不管理 WebSocket 等已接管连接。 默认请求头读取 5 秒、完整请求读取 10 秒、响应写入 15 秒、空闲连接 60 秒、请求头上限 64 KiB。 ReadTimeout/WriteTimeout 负值禁用对应网络期限;网络期限不替代业务 context 的执行期限。

应用可通过 apprun 统一管理;独立使用时由调用方提供排空 context(需导入 context、errors、 net/http、os、os/signal、syscall、time 和 httpserver):

server, err := httpserver.New(httpserver.Config{
	Addr: ":8888",
}, http.NotFoundHandler())
if err != nil {
	return err
}
stop, release := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer release()
ran := make(chan error, 1)
go func() { ran <- server.Run() }()
var runErr error
select {
case runErr = <-ran:
case <-stop.Done():
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
stopErr := server.Stop()
waitErr := server.Wait(ctx)
if waitErr != nil {
	server.Cancel()
}
return errors.Join(runErr, stopErr, waitErr)

Stop 封闭入口并异步排空,不等待 Handler。请求接纳与停收同步,停收后不再启动新业务 Handler。 Run 的监听退出不代表请求完成;Wait(ctx) 等待启动过程、实际 Handler 与连接收尾,期限仅控制等待。 排空期间请求 context 保持有效;Cancel 先复用 Stop,再取消剩余请求并关闭普通连接,不强杀业务。 Stop/Cancel 可先于或并发于 Run,停收后禁止重启;重复 Stop 复用同一次排空。 组件不设独立关闭计时。入口无论排空是否超时都进行有界资源回收,日志最后关闭,随后退出。

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrClosed  = errors.New("httpserver: closed")
	ErrStarted = errors.New("httpserver: already started")
)

Functions

This section is empty.

Types

type Config

type Config struct {
	// Addr 是 Run 使用的监听地址,空值默认使用 :8888。
	Addr string `mapstructure:"addr"`
	// ReadHeaderTimeout 是读取请求头的最长时间,零值默认使用 5 秒。
	ReadHeaderTimeout time.Duration `mapstructure:"readHeaderTimeout"`
	// ReadTimeout 是读取完整请求(含请求体)的最长时间,零值默认使用 10 秒,负值不设上限。
	ReadTimeout time.Duration `mapstructure:"readTimeout"`
	// WriteTimeout 是写入响应的超时时间,零值默认使用 15 秒,负值不设上限。
	WriteTimeout time.Duration `mapstructure:"writeTimeout"`
	// IdleTimeout 是长连接等待下一次请求的最长时间,零值默认使用 60 秒。
	IdleTimeout time.Duration `mapstructure:"idleTimeout"`
	// MaxHeaderBytes 限制请求行与请求头的总字节数,零值默认使用 64 KiB,不限制请求体。
	MaxHeaderBytes int `mapstructure:"maxHeaderBytes"`
}

Config 配置监听地址和网络期限,零值使用普通 API 默认配置。 仅 ReadTimeout、WriteTimeout 允许负值,表示不设上限。

type Server

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

Server 独立管理普通 HTTP 连接;不管理 hijacked 连接。

func New

func New(cfg Config, handler http.Handler) (*Server, error)

New 校验配置并构造实例,不启动监听。

func (*Server) Cancel

func (s *Server) Cancel()

Cancel 先复用 Stop,再通知剩余请求取消并关闭普通连接;不管理 hijacked 连接。

func (*Server) Run

func (s *Server) Run() error

Run 监听配置地址并阻塞运行,由 Stop 发起停收,Wait 等待业务排空。

func (*Server) Stop

func (s *Server) Stop() error

Stop 封闭普通请求入口并启动排空,不等待已有 Handler;可先于 Run 调用。

func (*Server) Wait

func (s *Server) Wait(ctx context.Context) error

Wait 等待启动过程、连接排空以及实际 Handler 返回,ctx 到期只结束本次等待。

Jump to

Keyboard shortcuts

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