From 8e821b5039bd6983814a6b1d11894a649c44f74a Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Mon, 2 Sep 2019 12:21:41 -0600 Subject: caddyconfig: Add JSON5 and JSON-C adapters (closes #2735) --- admin.go | 59 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 26 deletions(-) (limited to 'admin.go') diff --git a/admin.go b/admin.go index c87ef95..b2894be 100644 --- a/admin.go +++ b/admin.go @@ -22,6 +22,7 @@ import ( "io" "io/ioutil" "log" + "mime" "net" "net/http" "net/http/pprof" @@ -170,38 +171,44 @@ func handleLoadConfig(w http.ResponseWriter, r *http.Request) { // if the config is formatted other than Caddy's native // JSON, we need to adapt it before loading it - ct := r.Header.Get("Content-Type") - if !strings.Contains(ct, "/json") { - slashIdx := strings.Index(ct, "/") - if slashIdx < 0 { - http.Error(w, "Malformed Content-Type", http.StatusBadRequest) - return - } - adapterName := ct[slashIdx+1:] - cfgAdapter := caddyconfig.GetAdapter(adapterName) - if cfgAdapter == nil { - http.Error(w, "Unrecognized config adapter: "+adapterName, http.StatusBadRequest) - return - } - body, err := ioutil.ReadAll(http.MaxBytesReader(w, r.Body, 1024*1024)) - if err != nil { - http.Error(w, "Error reading request body: "+err.Error(), http.StatusBadRequest) - return - } - result, warnings, err := cfgAdapter.Adapt(body, nil) + if ctHeader := r.Header.Get("Content-Type"); ctHeader != "" { + ct, _, err := mime.ParseMediaType(ctHeader) if err != nil { - log.Printf("[ADMIN][ERROR] adapting config from %s: %v", adapterName, err) - http.Error(w, fmt.Sprintf("Adapting config from %s: %v", adapterName, err), http.StatusBadRequest) + http.Error(w, "Invalid Content-Type: "+err.Error(), http.StatusBadRequest) return } - if len(warnings) > 0 { - respBody, err := json.Marshal(warnings) + if !strings.HasSuffix(ct, "/json") { + slashIdx := strings.Index(ct, "/") + if slashIdx < 0 { + http.Error(w, "Malformed Content-Type", http.StatusBadRequest) + return + } + adapterName := ct[slashIdx+1:] + cfgAdapter := caddyconfig.GetAdapter(adapterName) + if cfgAdapter == nil { + http.Error(w, "Unrecognized config adapter: "+adapterName, http.StatusBadRequest) + return + } + body, err := ioutil.ReadAll(http.MaxBytesReader(w, r.Body, 1024*1024)) if err != nil { - log.Printf("[ADMIN][ERROR] marshaling warnings: %v", err) + http.Error(w, "Error reading request body: "+err.Error(), http.StatusBadRequest) + return + } + result, warnings, err := cfgAdapter.Adapt(body, nil) + if err != nil { + log.Printf("[ADMIN][ERROR] adapting config from %s: %v", adapterName, err) + http.Error(w, fmt.Sprintf("Adapting config from %s: %v", adapterName, err), http.StatusBadRequest) + return + } + if len(warnings) > 0 { + respBody, err := json.Marshal(warnings) + if err != nil { + log.Printf("[ADMIN][ERROR] marshaling warnings: %v", err) + } + w.Write(respBody) } - w.Write(respBody) + payload = bytes.NewReader(result) } - payload = bytes.NewReader(result) } err := Load(payload) -- cgit v1.2.3