From efb4d41da5bd592f06c77a378e836a70ab319663 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Fri, 29 May 2020 11:09:43 +0300 Subject: [PATCH] Handle backend api errors --- pkg/resource_handler.go | 46 ++++++++++++++++++++++++++++++++++------- pkg/zabbix_api.go | 2 +- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pkg/resource_handler.go b/pkg/resource_handler.go index f525387..4d3d31c 100644 --- a/pkg/resource_handler.go +++ b/pkg/resource_handler.go @@ -25,11 +25,16 @@ func (ds *ZabbixDatasource) zabbixAPIHandler(rw http.ResponseWriter, req *http.R body, err := ioutil.ReadAll(req.Body) defer req.Body.Close() if err != nil || len(body) == 0 { - rw.WriteHeader(http.StatusBadRequest) + WriteError(rw, http.StatusBadRequest, err) + return } var reqData ZabbixAPIResourceRequest err = json.Unmarshal(body, &reqData) + if err != nil { + WriteError(rw, http.StatusInternalServerError, err) + return + } pluginCxt := httpadapter.PluginConfigFromContext(req.Context()) ds.logger.Debug("Received Zabbix API call", "ds", pluginCxt.DataSourceInstanceSettings.Name) @@ -39,11 +44,38 @@ func (ds *ZabbixDatasource) zabbixAPIHandler(rw http.ResponseWriter, req *http.R apiReq := &ZabbixAPIRequest{Method: reqData.Method, Params: reqData.Params} result, err := dsInstance.ZabbixAPIQuery(req.Context(), apiReq) - resultJson, err := json.Marshal(*result) - ds.logger.Debug("Got response", "result", result) + if err != nil { + WriteError(rw, http.StatusInternalServerError, err) + return + } - ds.logger.Debug("Received Zabbix API call", "ds", reqData.DatasourceId, "method", reqData.Method, "params", reqData.Params) - - rw.Write(resultJson) - rw.WriteHeader(http.StatusOK) + WriteResponse(rw, result) +} + +func WriteResponse(rw http.ResponseWriter, result *interface{}) { + resultJson, err := json.Marshal(*result) + if err != nil { + WriteError(rw, http.StatusInternalServerError, err) + } + + rw.Header().Add("Content-Type", "application/json") + rw.WriteHeader(http.StatusOK) + rw.Write(resultJson) +} + +func WriteError(rw http.ResponseWriter, statusCode int, err error) { + data := make(map[string]interface{}) + + data["error"] = "Internal Server Error" + data["message"] = err.Error() + + var b []byte + if b, err = json.Marshal(data); err != nil { + rw.WriteHeader(statusCode) + return + } + + rw.Header().Add("Content-Type", "application/json") + rw.WriteHeader(http.StatusInternalServerError) + rw.Write(b) } diff --git a/pkg/zabbix_api.go b/pkg/zabbix_api.go index 572edbc..78d959f 100644 --- a/pkg/zabbix_api.go +++ b/pkg/zabbix_api.go @@ -37,7 +37,7 @@ func (dsInstance *ZabbixDatasourceInstance) ZabbixAPIQuery(ctx context.Context, dsInstance.queryCache.Set(HashString(apiReq.String()), result) if err != nil { dsInstance.logger.Debug("ZabbixAPIQuery", "error", err) - return nil, errors.New("ZabbixAPIQuery is not implemented yet") + return nil, err } }