diff --git a/.agents/skills/update-generate-config.md b/.agents/skills/update-generate-config.md new file mode 100644 index 0000000..553916a --- /dev/null +++ b/.agents/skills/update-generate-config.md @@ -0,0 +1,131 @@ +# Skill: 更新 -g 默认配置模板 + +当 config struct 新增/修改字段时,同步更新 `GenerateConfigYAML` 输出模板。 + +## 涉及文件 + +| 文件 | 职责 | +|------|------| +| `internal/config/*.go` | struct 定义(改字段) | +| `internal/config/defaults.go` | `DefaultConfig()` 默认值 + `GenerateConfigYAML()` 模板 | +| `internal/config/defaults_test.go` | `TestGenerateConfigYAML*` 覆盖率测试 | + +## 更新流程 + +### 1. 修改 struct + +在对应的 `*_config.go` 文件中添加/修改字段,确保: +- 有 `yaml` tag +- 有中文注释说明字段用途和有效值 + +### 2. 更新 DefaultConfig() + +在 `defaults.go` 的 `DefaultConfig()` 函数中为新字段设置合理默认值。 + +### 3. 更新 GenerateConfigYAML() + +在 `defaults.go` 的 `GenerateConfigYAML()` 函数中,找到对应区块,添加/修改模板行。 + +**规则:** + +1. **格式一致性**:使用 `buf.WriteString` 写注释行,`fmt.Fprintf` 写带默认值的行 +2. **注释行前缀**:可选配置用 `#` 注释,必填/有默认值的配置直接输出 +3. **注释规范**:每行末尾 `#` 注释说明用途,新字段加 `# 有效值: a, b, c` 格式的可选值说明 +4. **默认值来源**:使用 `cfg.Servers[0].Xxx` 读取 `DefaultConfig()` 的值,不硬编码 +5. **缩进层级**: + - 顶层配置无缩进(`logging:`, `http3:`) + - server 内配置 4 空格(` listen:`) + - server 子配置 6-8 空格(` access:`) + - 注释中的示例配置也保持正确缩进 + +### 4. struct 字段 → GenerateConfigYAML 区块对照表 + +| struct 文件 | GenerateConfigYAML 区块 | +|-------------|------------------------| +| `config.go` → `Config.Mode` | mode 注释块(~L254) | +| `config.go` → `Config.Mode` | servers 开头(~L263) | +| `server_config.go` → `ServerConfig` | servers 列表内(L264-288) | +| `server_config.go` → `TypesConfig` | types 注释块(~L292) | +| `server_config.go` → `LimitRateConfig` | limit_rate 注释块(~L302) | +| `monitoring_config.go` → `CacheAPIConfig` | cache_api 注释块(~L310) | +| `variable_config.go` → `LuaMiddlewareConfig` | lua 注释块(~L324) | +| `variable_config.go` → `CompressionConfig` | compression 块(~L607) | +| `variable_config.go` → `RewriteRule` | rewrite 注释块(~L598) | +| `server_config.go` → `StaticConfig` | static 块(~L349) | +| `proxy_config.go` → `ProxyConfig` | proxy 注释块(~L385) | +| `proxy_config.go` → `ProxyTimeout` | proxy.timeout(~L413) | +| `proxy_config.go` → `ProxyBufferingConfig` | proxy.buffering(~L418) | +| `proxy_config.go` → `HealthCheckConfig` | proxy.health_check(~L403) | +| `proxy_config.go` → `ProxyHeaders` | proxy.headers(~L424) | +| `cache_config.go` → `ProxyCacheConfig` | proxy.cache(~L435) | +| `cache_config.go` → `ProxyCacheValidConfig` | proxy.cache_valid(~L448) | +| `proxy_config.go` → `ProxySSLConfig` | proxy.proxy_ssl(~L454) | +| `proxy_config.go` → `NextUpstreamConfig` | proxy.next_upstream(~L464) | +| `proxy_config.go` → `BalancerByLuaConfig` | proxy.balancer_by_lua(~L467) | +| `proxy_config.go` → `RedirectRewriteConfig` | proxy.redirect_rewrite(~L472) | +| `ssl_config.go` → `SSLConfig` | ssl 注释块(~L486) | +| `ssl_config.go` → `SessionTicketsConfig` | ssl.session_tickets(~L506) | +| `ssl_config.go` → `ClientVerifyConfig` | ssl.client_verify(~L511) | +| `performance_config.go` → `HTTP2Config` | ssl.http2(~L517) | +| `security_config.go` → `SecurityConfig` | security 块(~L534) | +| `security_config.go` → `AccessConfig`/`GeoIPConfig` | security.access/geoip(~L537) | +| `security_config.go` → `RateLimitConfig` | security.rate_limit(~L555) | +| `security_config.go` → `AuthConfig` | security.auth(~L564) | +| `security_config.go` → `SecurityHeaders` | security.headers(~L573) | +| `security_config.go` → `ErrorPageConfig` | security.error_page(~L581) | +| `security_config.go` → `AuthRequestConfig` | security.auth_request(~L587) | +| `performance_config.go` → `ShutdownConfig` | shutdown 块(~L623) | +| `server_config.go` → `StreamConfig` | stream 注释块(~L631) | +| `monitoring_config.go` → `LoggingConfig` | logging 块(~L662) | +| `performance_config.go` → `PerformanceConfig` | performance 块(~L676) | +| `performance_config.go` → `HTTP3Config` | http3 块(~L693) | +| `monitoring_config.go` → `MonitoringConfig` | monitoring 块(~L703) | +| `performance_config.go` → `ResolverConfig` | resolver 块(~L723) | +| `variable_config.go` → `VariablesConfig` | variables 块(~L737) | +| `variable_config.go` → `IncludeConfig` | include 注释块(~L745) | + +### 5. 运行验证 + +```bash +# 测试模板覆盖率(检查 struct 字段是否都在模板中出现) +go test -v -run TestGenerateConfigYAML ./internal/config/... + +# 测试 app 层 generateConfig 函数 +go test -v -run TestGenerateConfig ./internal/app/... + +# 完整测试 + lint +make test +make lint +``` + +## 添加新字段的模板示例 + +### 简单字符串字段(可选,注释形式) +```go +buf.WriteString(" # new_field: \"\" # 新字段说明(有效值: a, b, c)\n") +``` + +### 带默认值的字段(使用 fmt.Fprintf) +```go +fmt.Fprintf(&buf, " # new_field: %d # 新字段说明\n", cfg.Servers[0].NewField) +``` + +### 新的嵌套结构体 +```go +buf.WriteString(" # new_section: # 新区块说明\n") +buf.WriteString(" # enabled: false # 是否启用\n") +buf.WriteString(" # option: \"\" # 选项说明\n") +buf.WriteString("\n") +``` + +## 常见遗漏检查清单 + +添加新字段后,逐项确认: + +- [ ] struct 有 `yaml` tag +- [ ] `DefaultConfig()` 有默认值 +- [ ] `GenerateConfigYAML()` 有注释行(可选字段)或输出行(有默认值的字段) +- [ ] 注释中包含 `有效值:` 说明(枚举类字段) +- [ ] `fmt.Fprintf` 使用 `cfg.Servers[0].Xxx` 而非硬编码数字 +- [ ] `TestGenerateConfigYAMLFieldsCoverage` 通过(它会检查 struct 字段是否出现在模板中) +- [ ] `make lint` 无新增 warning diff --git a/doc-report.md b/doc-report.md deleted file mode 100644 index bd3e7c4..0000000 --- a/doc-report.md +++ /dev/null @@ -1,315 +0,0 @@ -# Lolly 项目缺少文档注释的导出标识符检测报告 - -## 概述 - -使用 AST 静态分析扫描 `/root/projects/lolly`,共发现 **180** 个导出的函数/类型/常量/变量缺少以标识符名称开头的文档注释(GoDoc)。 - ---- - -## 一、公共 API(非 internal 包) - -| 文件 | 行号 | 类型 | 名称 | -|------|------|------|------| -| `gjson/gjson.go` | 35 | const | `ModuleName` | -| `gjson/gjson.go` | 38 | const | `Version` | - -**说明**:`gjson` 是项目中唯一的非 internal 子包,其导出的 `ModuleName` 和 `Version` 常量缺少文档注释。 - ---- - -## 二、internal 包中的缺失(按文件分组) - -### internal/benchmark/tools/tools.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 13 | const | `Size100B` | -| 14 | const | `Size1KB` | -| 15 | const | `Size10KB` | -| 16 | const | `Size100KB` | -| 17 | const | `Size1MB` | -| 36 | const | `ModeNormalResponse` | -| 37 | const | `ModeRandomResponse` | -| 38 | const | `ModeErrorResponse` | -| 39 | const | `ModeDelayedResponse` | - -### internal/config/config.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 33 | const | `DefaultPprofPath` | -| 44 | const | `ServerModeSingle` | -| 46 | const | `ServerModeVHost` | -| 48 | const | `ServerModeMultiServer` | -| 50 | const | `ServerModeAuto` | - -### internal/converter/nginx/converter.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 28 | method | `Warning.String` | - -### internal/converter/nginx/parser.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 31 | method | `*ParseError.Error` | - -### internal/e2e/testutil/constants.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 18 | const | `ContainerStartupTimeout` | -| 21 | const | `HealthCheckWaitTimeout` | -| 24 | const | `HealthCheckDetectionTime` | -| 27 | const | `CacheExpireBuffer` | -| 30 | const | `DefaultTestTimeout` | -| 33 | const | `DefaultClientTimeout` | -| 36 | const | `ConcurrentRequestTimeout` | -| 39 | const | `ShortTestTimeout` | -| 42 | const | `MediumTestTimeout` | -| 48 | const | `DefaultBackendCount` | -| 51 | const | `DefaultConcurrentRequests` | -| 54 | const | `HighConcurrentRequests` | -| 57 | const | `CacheTestMaxAge` | -| 60 | const | `CacheTestShortMaxAge` | -| 66 | const | `TLSVersion12` | -| 69 | const | `TLSVersion13` | - -### internal/e2e/testutil/websocket.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 41 | func | `WithWSHeaders` | - -### internal/lua/api_log.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 29 | const | `LogStderr` | -| 30 | const | `LogEmerg` | -| 31 | const | `LogAlert` | -| 32 | const | `LogCrit` | -| 33 | const | `LogErr` | -| 34 | const | `LogWarn` | -| 35 | const | `LogNotice` | -| 36 | const | `LogInfo` | -| 37 | const | `LogDebug` | -| 42 | const | `HTTPContinue` | -| 43 | const | `HTTPSwitchingProtocols` | -| 44 | const | `HTTPOK` | -| 45 | const | `HTTPCreated` | -| 46 | const | `HTTPAccepted` | -| 47 | const | `HTTPNoContent` | -| 48 | const | `HTTPPartialContent` | -| 49 | const | `HTTPMovedPermanently` | -| 50 | const | `HTTPFound` | -| 51 | const | `HTTPSeeOther` | -| 52 | const | `HTTPNotModified` | -| 53 | const | `HTTPTemporaryRedirect` | -| 54 | const | `HTTPPermanentRedirect` | -| 55 | const | `HTTPBadRequest` | -| 56 | const | `HTTPUnauthorized` | -| 57 | const | `HTTPForbidden` | -| 58 | const | `HTTPNotFound` | -| 59 | const | `HTTPMethodNotAllowed` | -| 60 | const | `HTTPRequestTimeout` | -| 61 | const | `HTTPConflict` | -| 62 | const | `HTTPGone` | -| 63 | const | `HTTPLengthRequired` | -| 64 | const | `HTTPPayloadTooLarge` | -| 65 | const | `HTTPURITooLong` | -| 66 | const | `HTTPUnsupportedMedia` | -| 67 | const | `HTTPRangeNotSatisfiable` | -| 68 | const | `HTTPTooManyRequests` | -| 69 | const | `HTTPInternalServerError` | -| 70 | const | `HTTPNotImplemented` | -| 71 | const | `HTTPBadGateway` | -| 72 | const | `HTTPServiceUnavailable` | -| 73 | const | `HTTPGatewayTimeout` | -| 74 | const | `HTTPHTTPVersionNotSupported` | - -### internal/lua/api_req.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 36 | const | `APILayerDirect` | -| 40 | const | `APILayerCompatible` | -| 44 | const | `APILayerPseudoNonBlocking` | -| 58 | method | `ngxReqAPILayer.String` | - -### internal/lua/cache.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 38 | const | `CacheKeyInline` | -| 41 | const | `CacheKeyFile` | - -### internal/lua/coroutine.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 35 | const | `PhaseInit` | -| 37 | const | `PhaseRewrite` | -| 39 | const | `PhaseAccess` | -| 41 | const | `PhaseContent` | -| 43 | const | `PhaseLog` | -| 45 | const | `PhaseHeaderFilter` | -| 47 | const | `PhaseBodyFilter` | -| 50 | method | `Phase.String` | - -### internal/lua/socket_manager.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 36 | const | `SocketStateIdle` | -| 38 | const | `SocketStateConnecting` | -| 40 | const | `SocketStateConnected` | -| 42 | const | `SocketStateSending` | -| 44 | const | `SocketStateReceiving` | -| 46 | const | `SocketStateClosing` | -| 48 | const | `SocketStateClosed` | -| 50 | const | `SocketStateError` | -| 83 | const | `OpConnect` | -| 85 | const | `OpSend` | -| 87 | const | `OpReceive` | -| 89 | const | `OpClose` | - -### internal/matcher/location.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 257 | method | `*ConflictError.Error` | - -### internal/matcher/matcher.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 27 | const | `LocationTypeExact` | -| 28 | const | `LocationTypePrefix` | -| 29 | const | `LocationTypePrefixPriority` | -| 30 | const | `LocationTypeRegex` | -| 31 | const | `LocationTypeRegexCaseless` | -| 32 | const | `LocationTypeNamed` | - -### internal/middleware/compression/compression.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 100 | const | `AlgorithmGzip` | -| 102 | const | `AlgorithmBrotli` | - -### internal/middleware/limitrate/limitrate.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 15 | const | `LargeFileStrategySkip` | -| 17 | const | `LargeFileStrategyCoarse` | - -### internal/middleware/rewrite/rewrite.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 41 | const | `FlagLast` | -| 44 | const | `FlagRedirect` | -| 47 | const | `FlagPermanent` | -| 50 | const | `FlagBreak` | - -### internal/middleware/security/access.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 47 | const | `ActionAllow` | -| 49 | const | `ActionDeny` | - -### internal/middleware/security/auth.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 52 | const | `HashBcrypt` | -| 54 | const | `HashArgon2id` | - -### internal/resolver/resolver.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 446 | method | `*noopResolver.LookupHost` | -| 450 | method | `*noopResolver.LookupHostWithCache` | -| 454 | method | `*noopResolver.Refresh` | -| 458 | method | `*noopResolver.Start` | -| 462 | method | `*noopResolver.Stop` | -| 466 | method | `*noopResolver.Stats` | - -### internal/ssl/client_verify.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 33 | const | `VerifyOff` | -| 35 | const | `VerifyOn` | -| 37 | const | `VerifyOptional` | -| 39 | const | `VerifyOptionalNoCA` | - -### internal/stream/stream.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 82 | method | `*roundRobin.Select` | -| 171 | method | `*weightedRoundRobin.Select` | -| 244 | method | `*ipHash.Select` | -| 248 | method | `*ipHash.SelectByIP` | - -### internal/utils/httperror.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 26 | var | `ErrNotFound` | -| 27 | var | `ErrForbidden` | -| 28 | var | `ErrUnauthorized` | -| 29 | var | `ErrBadGateway` | -| 30 | var | `ErrGatewayTimeout` | -| 31 | var | `ErrInternalError` | -| 32 | var | `ErrTooManyRequests` | -| 33 | var | `ErrServiceUnavailable` | - -### internal/variable/builtin.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 19 | const | `VarHost` | -| 20 | const | `VarRemoteAddr` | -| 21 | const | `VarRemotePort` | -| 22 | const | `VarRequestURI` | -| 23 | const | `VarURI` | -| 24 | const | `VarArgs` | -| 25 | const | `VarRequestMethod` | -| 26 | const | `VarScheme` | -| 27 | const | `VarServerName` | -| 28 | const | `VarServerPort` | -| 29 | const | `VarStatus` | -| 30 | const | `VarBodyBytesSent` | -| 31 | const | `VarRequestTime` | -| 32 | const | `VarTimeLocal` | -| 33 | const | `VarTimeISO8601` | -| 34 | const | `VarRequestID` | -| 36 | const | `VarUpstreamAddr` | -| 37 | const | `VarUpstreamStatus` | -| 38 | const | `VarUpstreamResponseTime` | -| 39 | const | `VarUpstreamConnectTime` | -| 40 | const | `VarUpstreamHeaderTime` | - -### internal/variable/ssl.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 24 | const | `VarSSLClientVerify` | -| 25 | const | `VarSSLClientSerial` | -| 26 | const | `VarSSLClientSubject` | -| 27 | const | `VarSSLClientIssuer` | -| 28 | const | `VarSSLClientFingerprint` | -| 29 | const | `VarSSLClientNotBefore` | -| 30 | const | `VarSSLClientNotAfter` | -| 31 | const | `VarSSLClientDNS` | -| 32 | const | `VarSSLClientEmail` | - -### internal/version/version.go -| 行号 | 类型 | 名称 | -|------|------|------| -| 9 | var | `Version` | -| 11 | var | `GitCommit` | -| 13 | var | `GitBranch` | -| 15 | var | `BuildTime` | -| 17 | var | `GoVersion` | -| 19 | var | `BuildPlatform` | - ---- - -## 统计汇总 - -| 类别 | 数量 | -|------|------| -| 公共 API(非 internal) | 2 | -| internal 常量 | 134 | -| internal 变量 | 14 | -| internal 方法 | 14 | -| internal 函数 | 1 | -| **总计** | **180** | - ---- - -*检测规则:导出的标识符(首字母大写)必须紧跟以该标识符名称开头的 `//` 文档注释,才被视为已文档化。`_test.go` 和 vendor 目录已排除。* diff --git a/docs/prompts.md b/docs/prompts.md deleted file mode 100644 index 4d2f0b5..0000000 --- a/docs/prompts.md +++ /dev/null @@ -1,48 +0,0 @@ -## 更新配置文件实例 - -ulw 深度分析配置文件,当前支持的配置和 --generate-config 是否有不一样的地方,--generate-config -需要完整且详细,包括所有字段的枚举值都要有 - -ulw 深度分析下有没有代码实现了,但是 --generate-config 缺失的地方 - -ulw 逐行分析下当前的 --generate-config,看看代码中是否都实现了 - -ulw 分析 lib/nginx 代码,然后更新 docs/nginx/ 里的文档 - -ulw 深度分析下 @docs/ 下的 nginx 文档,看看当前项目实现的怎么样了 - -## 单元测试 - -ulw 深度分析下当前测试覆盖率 - -/ralplan 深度分析一个完善测试的方案 - -ulw 分析并完善测试覆盖率,每完成一个功能点提交一次 - -## 注释 - -ulw 参考 @docs/comments.md,深度分析项目注释是否完善 - -## 优化 - -ulw 深度分析下,有没有重复的逻辑/代码,或者冗余的东西,或者没用的东西 - -ulw 运行 make lint,并修复 - -ulw 深度分析下当前项目的性能 - -@Makefile 运行性能基准测试 - -ulw 完善性能基准测试 - -ulw 深度分析下代码质量 - -ulw 深度分析下代码架构 - -ulw 分析下 lib/fasthttp/ 的源码,然后看下 lolly 的用法合不合理,有没有性能可以提升的地方 - -## 兼容性 - -ulw @docs/config/ 下有些nginx的配置示例,深度分析下当前 lolly 项目,然后看看 lolly 是否支持实现这些 nginx 的效果 - -ulw 查看 @docs/nginx/04-nginx-proxy-loadbalancing.md 分析下 lolly 是否实现了这些功能 diff --git a/internal/config/defaults.go b/internal/config/defaults.go index dc2e0e4..6909950 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -327,6 +327,9 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) { buf.WriteString(" # scripts: # Lua 脚本列表\n") buf.WriteString(" # - path: \"/scripts/auth.lua\" # 脚本路径\n") buf.WriteString(" # phase: \"access\" # 执行阶段(有效值: rewrite, access, content, log, header_filter, body_filter)\n") + buf.WriteString(" # # 或者使用路由匹配模式(与 phase 互斥)\n") + buf.WriteString(" # # route: \"/api/.*\" # 路由匹配路径/模式(设置后按路由匹配执行,而非阶段执行)\n") + buf.WriteString(" # # route_type: \"regex\" # 路由匹配类型(有效值: exact, prefix, prefix_priority, regex, regex_caseless;默认 prefix)\n") buf.WriteString(" # timeout: 10s # 执行超时\n") buf.WriteString(" # enabled: true # 是否启用此脚本\n") buf.WriteString(" # global_settings: # 全局设置\n") @@ -335,7 +338,7 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) { fmt.Fprintf(&buf, " # code_cache_size: %d # 字节码缓存条目数\n", cfg.Servers[0].Lua.GlobalSettings.CodeCacheSize) fmt.Fprintf(&buf, " # enable_file_watch: %v # 启用文件变更检测\n", cfg.Servers[0].Lua.GlobalSettings.EnableFileWatch) fmt.Fprintf(&buf, " # max_execution_time: %ds # 最大执行时间\n", int(cfg.Servers[0].Lua.GlobalSettings.MaxExecutionTime.Seconds())) - fmt.Fprintf(&buf, " # coroutine_stack_size: %d # 协程栈大小(0=使用默认值)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutineStackSize) + fmt.Fprintf(&buf, " # coroutine_stack_size: %d # 协程栈大小(0=使用引擎默认值 64,最大 256)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutineStackSize) fmt.Fprintf(&buf, " # coroutine_pool_warmup: %d # 协程池预热数量(0=不预热)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutinePoolWarmup) fmt.Fprintf(&buf, " # minimize_stack_memory: %v # 最小化栈内存使用\n", cfg.Servers[0].Lua.GlobalSettings.MinimizeStackMemory) fmt.Fprintf(&buf, " # lstate_pool_initial_size: %d # LState池初始大小\n", cfg.Servers[0].Lua.GlobalSettings.LStatePoolInitialSize) @@ -401,13 +404,21 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) { buf.WriteString(" # interval: 10s\n") buf.WriteString(" # path: /health\n") buf.WriteString(" # timeout: 5s\n") + buf.WriteString(" # slow_start: 0s # 慢启动时间(0 表示禁用)\n") + buf.WriteString(" # match: # 健康检查匹配条件(可选,未配置时仅检查状态码 2xx)\n") + buf.WriteString(" # status: [\"200-299\"] # 匹配的状态码范围列表\n") + buf.WriteString(" # body: \"ok\" # 响应体正则匹配(可选)\n") + buf.WriteString(" # headers: # 响应头匹配(可选)\n") + buf.WriteString(" # X-Health: \"ok\"\n") buf.WriteString(" # timeout: # 超时配置\n") - buf.WriteString(" # connect: 5s # 连接超时\n") + buf.WriteString(" # dial: 5s # TCP 连接建立超时(不含 DNS/TLS)\n") + buf.WriteString(" # connect: 5s # 总连接超时(含 DNS/TLS)\n") buf.WriteString(" # read: 30s # 读取超时\n") buf.WriteString(" # write: 30s # 写入超时\n") buf.WriteString(" # buffering: # 代理缓冲配置\n") buf.WriteString(" # mode: \"default\" # 缓冲模式(有效值: default, on, off;off 为流式转发)\n") buf.WriteString(" # buffer_size: 0 # 响应缓冲区大小(字节,0 表示使用默认值)\n") + buf.WriteString(" # buffers: \"8 16k\" # 多缓冲区配置(格式: \"数量 大小\",如 \"8 16k\" 或 \"4 4k 8 16k\")\n") buf.WriteString(" # proxy_bind: \"\" # 代理拨号绑定本地地址\n") buf.WriteString(" # internal: false # 仅允许内部重定向访问\n") buf.WriteString(" # headers: # 头部修改\n") diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 0000000..69e7e1e --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,11 @@ +{ + "version": 1, + "skills": { + "golang-pro": { + "source": "jeffallan/claude-skills", + "sourceType": "github", + "skillPath": "skills/golang-pro/SKILL.md", + "computedHash": "12b4cac8f65228f82cbc26f0da9232aba87ffa45ccd01afa3998fb8ec61dc288" + } + } +}