mirror of
https://github.com/RuoJi6/ARTEX.git
synced 2026-10-27 17:03:49 +08:00
84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package server
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/Autumn-27/artex/selfupdate"
|
|
)
|
|
|
|
const updateSettingsKey = "update.network"
|
|
|
|
type updateSettings struct {
|
|
Proxy string `json:"proxy"`
|
|
}
|
|
|
|
func (cfg *updateSettings) validate() error {
|
|
cfg.Proxy = strings.TrimSpace(cfg.Proxy)
|
|
if _, err := selfupdate.ParseProxy(cfg.Proxy); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *Server) loadUpdateSettings() (updateSettings, error) {
|
|
cfg := updateSettings{}
|
|
raw, ok, err := s.m.pg.GetSetting(updateSettingsKey)
|
|
if err != nil {
|
|
return cfg, fmt.Errorf("读取更新网络设置失败: %w", err)
|
|
}
|
|
if ok {
|
|
if err := json.Unmarshal([]byte(raw), &cfg); err != nil {
|
|
return cfg, fmt.Errorf("更新网络设置格式无效")
|
|
}
|
|
}
|
|
if err := cfg.validate(); err != nil {
|
|
return cfg, err
|
|
}
|
|
return cfg, nil
|
|
}
|
|
|
|
func (s *Server) getUpdateSettings(w http.ResponseWriter, r *http.Request) {
|
|
cfg, err := s.loadUpdateSettings()
|
|
if err != nil {
|
|
writeErr(w, 500, err.Error())
|
|
return
|
|
}
|
|
writeJSON(w, 200, cfg)
|
|
}
|
|
|
|
func (s *Server) putUpdateSettings(w http.ResponseWriter, r *http.Request) {
|
|
var cfg updateSettings
|
|
if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 8192)).Decode(&cfg); err != nil {
|
|
writeErr(w, 400, "更新网络设置格式无效")
|
|
return
|
|
}
|
|
if err := cfg.validate(); err != nil {
|
|
writeErr(w, 400, err.Error())
|
|
return
|
|
}
|
|
raw, err := json.Marshal(cfg)
|
|
if err != nil {
|
|
writeErr(w, 500, err.Error())
|
|
return
|
|
}
|
|
if err := s.m.pg.SetSettingContext(r.Context(), updateSettingsKey, string(raw)); err != nil {
|
|
writeErr(w, 500, "保存更新网络设置失败")
|
|
return
|
|
}
|
|
writeJSON(w, 200, cfg)
|
|
}
|
|
|
|
// Capture one effective proxy for both release discovery and all asset downloads.
|
|
// A different proxy bypasses cached success/error results from the previous route.
|
|
func (s *Server) updateClient() (*http.Client, string, error) {
|
|
cfg, err := s.loadUpdateSettings()
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
client, err := selfupdate.NewClient(cfg.Proxy)
|
|
return client, cfg.Proxy, err
|
|
}
|