// util.go:管线结果类型与工具函数。 package gateway import ( "encoding/json" "strconv" "strings" ) // jsonUnmarshal 解码辅助。 func jsonUnmarshal(b []byte, v any) error { return json.Unmarshal(b, v) } // itoa int→string。 func itoa(n int) string { return strconv.Itoa(n) } // itoa64 int64→string。 func itoa64(n int64) string { return strconv.FormatInt(n, 10) } // errMsg 错误消息提取(nil 安全)。 func errMsg(err error) string { if err == nil { return "未知错误" } return strings.TrimSpace(err.Error()) } // isOKEnvelope 判断信封字节是否为 ok=true(缓存写入仅成功结果)。 func isOKEnvelope(raw []byte) bool { var probe struct { OK bool `json:"ok"` } if err := jsonUnmarshal(raw, &probe); err != nil { return false } return probe.OK } // isEmptySearchEnvelope 判断 search 信封是否零结果。 // SearXNG 引擎全挂仍可能 HTTP 200 + ok=true + results=[];写进 300s 缓存会把瞬时空结果冻成「消费端空值」。 func isEmptySearchEnvelope(raw []byte) bool { var probe struct { OK bool `json:"ok"` Results []json.RawMessage `json:"results"` } if err := jsonUnmarshal(raw, &probe); err != nil { return true } return probe.OK && len(probe.Results) == 0 }