Help us shape the future of Go! Take the 2026 Go Developer Survey

httpserver

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Nov 3, 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