From 9df701906f7c635fd7c747cc6f324877122831f9 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 4 Nov 2015 20:30:47 +0000 Subject: [PATCH] Run JSON decoding through the usual setting of defaults and fixing up I see no reason not to do this, and it gives a unified place (the prepare() call) to initialize cached attributes and so on. --- cmd/syncthing/gui.go | 3 +-- lib/config/config.go | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index a2058dca..953c3e05 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -562,8 +562,7 @@ func (s *apiSvc) postSystemConfig(w http.ResponseWriter, r *http.Request) { s.systemConfigMut.Lock() defer s.systemConfigMut.Unlock() - var to config.Configuration - err := json.NewDecoder(r.Body).Decode(&to) + to, err := config.ReadJSON(r.Body, myID) if err != nil { l.Warnln("decoding posted config:", err) http.Error(w, err.Error(), 500) diff --git a/lib/config/config.go b/lib/config/config.go index 4f1d7fbd..4c4ed83c 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -8,6 +8,7 @@ package config import ( + "encoding/json" "encoding/xml" "io" "math/rand" @@ -83,6 +84,20 @@ func ReadXML(r io.Reader, myID protocol.DeviceID) (Configuration, error) { return cfg, err } +func ReadJSON(r io.Reader, myID protocol.DeviceID) (Configuration, error) { + var cfg Configuration + + setDefaults(&cfg) + setDefaults(&cfg.Options) + setDefaults(&cfg.GUI) + + err := json.NewDecoder(r).Decode(&cfg) + cfg.OriginalVersion = cfg.Version + + cfg.prepare(myID) + return cfg, err +} + type Configuration struct { Version int `xml:"version,attr" json:"version"` Folders []FolderConfiguration `xml:"folder" json:"folders"` @@ -133,7 +148,7 @@ func (cfg *Configuration) WriteXML(w io.Writer) error { func (cfg *Configuration) prepare(myID protocol.DeviceID) { fillNilSlices(&cfg.Options) - // Initialize an empty slices + // Initialize any empty slices if cfg.Folders == nil { cfg.Folders = []FolderConfiguration{} }