From 982890f8eab8ccf53d030478d7ea5ad6e3207b40 Mon Sep 17 00:00:00 2001 From: thiagoftsm Date: Tue, 3 Sep 2019 11:23:32 +0000 Subject: HTTP response message (#6595) * health_connection: http_error_pattern This commit brings an unique pattern for the Netdata webserver errors, now Netdata uses define for all web error * http_error_pattern: API v1 This PR also brings the pattern for the web_api_v1.c --- web/api/badges/web_buffer_svg.c | 14 +++++++------- web/api/exporters/allmetrics.c | 10 +++++----- web/api/exporters/allmetrics.h | 1 + web/api/formatters/rrd2json.c | 10 +++++----- web/api/formatters/rrd2json.h | 2 ++ web/api/health/health_cmdapi.c | 10 +++++----- web/api/web_api_v1.c | 36 ++++++++++++++++++------------------ web/server/web_client.h | 3 +++ 8 files changed, 46 insertions(+), 40 deletions(-) (limited to 'web') diff --git a/web/api/badges/web_buffer_svg.c b/web/api/badges/web_buffer_svg.c index 4f9826fb20..143fc0f3c0 100644 --- a/web/api/badges/web_buffer_svg.c +++ b/web/api/badges/web_buffer_svg.c @@ -789,7 +789,7 @@ void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const ch } int web_client_api_request_v1_badge(RRDHOST *host, struct web_client *w, char *url) { - int ret = 400; + int ret = HTTP_RESP_BAD_REQUEST; buffer_flush(w->response.data); BUFFER *dimensions = NULL; @@ -867,7 +867,7 @@ int web_client_api_request_v1_badge(RRDHOST *host, struct web_client *w, char *u if(!st) { buffer_no_cacheable(w->response.data); buffer_svg(w->response.data, "chart not found", NAN, "", NULL, NULL, -1, scale, 0); - ret = 200; + ret = HTTP_RESP_OK; goto cleanup; } st->last_accessed_time = now_realtime_sec(); @@ -878,7 +878,7 @@ int web_client_api_request_v1_badge(RRDHOST *host, struct web_client *w, char *u if (!rc) { buffer_no_cacheable(w->response.data); buffer_svg(w->response.data, "alarm not found", NAN, "", NULL, NULL, -1, scale, 0); - ret = 200; + ret = HTTP_RESP_OK; goto cleanup; } } @@ -997,13 +997,13 @@ int web_client_api_request_v1_badge(RRDHOST *host, struct web_client *w, char *u scale, options ); - ret = 200; + ret = HTTP_RESP_OK; } else { time_t latest_timestamp = 0; int value_is_null = 1; calculated_number n = NAN; - ret = 500; + ret = HTTP_RESP_INTERNAL_SERVER_ERROR; // if the collected value is too old, don't calculate its value if (rrdset_last_entry_t(st) >= (now_realtime_sec() - (st->update_every * st->gap_when_lost_iterations_above))) @@ -1011,11 +1011,11 @@ int web_client_api_request_v1_badge(RRDHOST *host, struct web_client *w, char *u , points, after, before, group, 0, options, NULL, &latest_timestamp, &value_is_null); // if the value cannot be calculated, show empty badge - if (ret != 200) { + if (ret != HTTP_RESP_OK) { buffer_no_cacheable(w->response.data); value_is_null = 1; n = 0; - ret = 200; + ret = HTTP_RESP_OK; } else if (refresh > 0) { buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh); diff --git a/web/api/exporters/allmetrics.c b/web/api/exporters/allmetrics.c index 88ff78e7e4..686a6cabcc 100644 --- a/web/api/exporters/allmetrics.c +++ b/web/api/exporters/allmetrics.c @@ -75,12 +75,12 @@ inline int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client case ALLMETRICS_JSON: w->response.data->contenttype = CT_APPLICATION_JSON; rrd_stats_api_v1_charts_allmetrics_json(host, w->response.data); - return 200; + return HTTP_RESP_OK; case ALLMETRICS_SHELL: w->response.data->contenttype = CT_TEXT_PLAIN; rrd_stats_api_v1_charts_allmetrics_shell(host, w->response.data); - return 200; + return HTTP_RESP_OK; case ALLMETRICS_PROMETHEUS: w->response.data->contenttype = CT_PROMETHEUS; @@ -92,7 +92,7 @@ inline int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client , prometheus_backend_options , prometheus_output_options ); - return 200; + return HTTP_RESP_OK; case ALLMETRICS_PROMETHEUS_ALL_HOSTS: w->response.data->contenttype = CT_PROMETHEUS; @@ -104,11 +104,11 @@ inline int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client , prometheus_backend_options , prometheus_output_options ); - return 200; + return HTTP_RESP_OK; default: w->response.data->contenttype = CT_TEXT_PLAIN; buffer_strcat(w->response.data, "Which format? '" ALLMETRICS_FORMAT_SHELL "', '" ALLMETRICS_FORMAT_PROMETHEUS "', '" ALLMETRICS_FORMAT_PROMETHEUS_ALL_HOSTS "' and '" ALLMETRICS_FORMAT_JSON "' are currently supported."); - return 400; + return HTTP_RESP_BAD_REQUEST; } } diff --git a/web/api/exporters/allmetrics.h b/web/api/exporters/allmetrics.h index e8dedabf4b..f076ff0d56 100644 --- a/web/api/exporters/allmetrics.h +++ b/web/api/exporters/allmetrics.h @@ -5,6 +5,7 @@ #include "web/api/formatters/rrd2json.h" #include "shell/allmetrics_shell.h" +#include "web/server/web_client.h" extern int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client *w, char *url); diff --git a/web/api/formatters/rrd2json.c b/web/api/formatters/rrd2json.c index 5cdcc80ff1..17b1a301b7 100644 --- a/web/api/formatters/rrd2json.c +++ b/web/api/formatters/rrd2json.c @@ -72,7 +72,7 @@ int rrdset2value_api_v1( RRDR *r = rrd2rrdr(st, points, after, before, group_method, group_time, options, dimensions); if(!r) { if(value_is_null) *value_is_null = 1; - return 500; + return HTTP_RESP_INTERNAL_SERVER_ERROR; } if(rrdr_rows(r) == 0) { @@ -82,7 +82,7 @@ int rrdset2value_api_v1( if(db_before) *db_before = 0; if(value_is_null) *value_is_null = 1; - return 400; + return HTTP_RESP_BAD_REQUEST; } if(wb) { @@ -99,7 +99,7 @@ int rrdset2value_api_v1( *n = rrdr2value(r, i, options, value_is_null); rrdr_free(r); - return 200; + return HTTP_RESP_OK; } int rrdset2anything_api_v1( @@ -120,7 +120,7 @@ int rrdset2anything_api_v1( RRDR *r = rrd2rrdr(st, points, after, before, group_method, group_time, options, dimensions?buffer_tostring(dimensions):NULL); if(!r) { buffer_strcat(wb, "Cannot generate output with these parameters on this chart."); - return 500; + return HTTP_RESP_INTERNAL_SERVER_ERROR; } if(r->result_options & RRDR_RESULT_OPTION_RELATIVE) @@ -294,5 +294,5 @@ int rrdset2anything_api_v1( } rrdr_free(r); - return 200; + return HTTP_RESP_OK; } diff --git a/web/api/formatters/rrd2json.h b/web/api/formatters/rrd2json.h index bac6130de6..8fce4ef7b4 100644 --- a/web/api/formatters/rrd2json.h +++ b/web/api/formatters/rrd2json.h @@ -16,6 +16,8 @@ #include "web/api/formatters/charts2json.h" #include "web/api/formatters/json_wrapper.h" +#include "web/server/web_client.h" + #define HOSTNAME_MAX 1024 #define API_RELATIVE_TIME_MAX (3 * 365 * 86400) diff --git a/web/api/health/health_cmdapi.c b/web/api/health/health_cmdapi.c index 94293dbe68..4dd85e6b16 100644 --- a/web/api/health/health_cmdapi.c +++ b/web/api/health/health_cmdapi.c @@ -116,7 +116,7 @@ void health_silencers2file(BUFFER *wb) { * @return It returns 200 on success and another code otherwise. */ int web_client_api_request_v1_mgmt_health(RRDHOST *host, struct web_client *w, char *url) { - int ret = 400; + int ret; (void) host; BUFFER *wb = w->response.data; @@ -131,12 +131,12 @@ int web_client_api_request_v1_mgmt_health(RRDHOST *host, struct web_client *w, c if (!w->auth_bearer_token) { buffer_strcat(wb, HEALTH_CMDAPI_MSG_AUTHERROR); - ret = 403; + ret = HTTP_RESP_FORBIDDEN; } else { debug(D_HEALTH, "HEALTH command API: Comparing secret '%s' to '%s'", w->auth_bearer_token, api_secret); if (strcmp(w->auth_bearer_token, api_secret)) { buffer_strcat(wb, HEALTH_CMDAPI_MSG_AUTHERROR); - ret = 403; + ret = HTTP_RESP_FORBIDDEN; } else { while (url) { char *value = mystrsep(&url, "&"); @@ -190,12 +190,12 @@ int web_client_api_request_v1_mgmt_health(RRDHOST *host, struct web_client *w, c if (unlikely(silencers->stype != STYPE_NONE && !silencers->all_alarms && !silencers->silencers)) { buffer_strcat(wb, HEALTH_CMDAPI_MSG_NOSELECTORWARNING); } - ret = 200; + ret = HTTP_RESP_OK; } } w->response.data = wb; buffer_no_cacheable(w->response.data); - if (ret == 200 && config_changed) { + if (ret == HTTP_RESP_OK && config_changed) { BUFFER *jsonb = buffer_create(200); health_silencers2json(jsonb); health_silencers2file(jsonb); diff --git a/web/api/web_api_v1.c b/web/api/web_api_v1.c index f34f020090..3efac5669d 100644 --- a/web/api/web_api_v1.c +++ b/web/api/web_api_v1.c @@ -210,7 +210,7 @@ inline int web_client_api_request_v1_alarms(RRDHOST *host, struct web_client *w, w->response.data->contenttype = CT_APPLICATION_JSON; health_alarms2json(host, w->response.data, all); buffer_no_cacheable(w->response.data); - return 200; + return HTTP_RESP_OK; } inline int web_client_api_request_v1_alarm_count(RRDHOST *host, struct web_client *w, char *url) { @@ -274,11 +274,11 @@ inline int web_client_api_request_v1_alarm_log(RRDHOST *host, struct web_client buffer_flush(w->response.data); w->response.data->contenttype = CT_APPLICATION_JSON; health_alarm_log2json(host, w->response.data, after); - return 200; + return HTTP_RESP_OK; } inline int web_client_api_request_single_chart(RRDHOST *host, struct web_client *w, char *url, void callback(RRDSET *st, BUFFER *buf)) { - int ret = 400; + int ret = HTTP_RESP_BAD_REQUEST; char *chart = NULL; buffer_flush(w->response.data); @@ -311,14 +311,14 @@ inline int web_client_api_request_single_chart(RRDHOST *host, struct web_client if(!st) { buffer_strcat(w->response.data, "Chart is not found: "); buffer_strcat_htmlescape(w->response.data, chart); - ret = 404; + ret = HTTP_RESP_NOT_FOUND; goto cleanup; } w->response.data->contenttype = CT_APPLICATION_JSON; st->last_accessed_time = now_realtime_sec(); callback(st, w->response.data); - return 200; + return HTTP_RESP_OK; cleanup: return ret; @@ -334,7 +334,7 @@ inline int web_client_api_request_v1_charts(RRDHOST *host, struct web_client *w, buffer_flush(w->response.data); w->response.data->contenttype = CT_APPLICATION_JSON; charts2json(host, w->response.data); - return 200; + return HTTP_RESP_OK; } inline int web_client_api_request_v1_chart(RRDHOST *host, struct web_client *w, char *url) { @@ -354,7 +354,7 @@ void fix_google_param(char *s) { inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, char *url) { debug(D_WEB_CLIENT, "%llu: API v1 data with URL '%s'", w->id, url); - int ret = 400; + int ret = HTTP_RESP_BAD_REQUEST; BUFFER *dimensions = NULL; buffer_flush(w->response.data); @@ -467,7 +467,7 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c if(!st) { buffer_strcat(w->response.data, "Chart is not found: "); buffer_strcat_htmlescape(w->response.data, chart); - ret = 404; + ret = HTTP_RESP_NOT_FOUND; goto cleanup; } st->last_accessed_time = now_realtime_sec(); @@ -654,7 +654,7 @@ inline int web_client_api_request_v1_registry(RRDHOST *host, struct web_client * if(unlikely(respect_web_browser_do_not_track_policy && web_client_has_donottrack(w))) { buffer_flush(w->response.data); buffer_sprintf(w->response.data, "Your web browser is sending 'DNT: 1' (Do Not Track). The registry requires persistent cookies on your browser to work."); - return 400; + return HTTP_RESP_BAD_REQUEST; } if(unlikely(action == 'H')) { @@ -674,7 +674,7 @@ inline int web_client_api_request_v1_registry(RRDHOST *host, struct web_client * error("Invalid registry request - access requires these parameters: machine ('%s'), url ('%s'), name ('%s')", machine_guid ? machine_guid : "UNSET", machine_url ? machine_url : "UNSET", url_name ? url_name : "UNSET"); buffer_flush(w->response.data); buffer_strcat(w->response.data, "Invalid registry Access request."); - return 400; + return HTTP_RESP_BAD_REQUEST; } web_client_enable_tracking_required(w); @@ -685,7 +685,7 @@ inline int web_client_api_request_v1_registry(RRDHOST *host, struct web_client * error("Invalid registry request - delete requires these parameters: machine ('%s'), url ('%s'), delete_url ('%s')", machine_guid?machine_guid:"UNSET", machine_url?machine_url:"UNSET", delete_url?delete_url:"UNSET"); buffer_flush(w->response.data); buffer_strcat(w->response.data, "Invalid registry Delete request."); - return 400; + return HTTP_RESP_BAD_REQUEST; } web_client_enable_tracking_required(w); @@ -696,7 +696,7 @@ inline int web_client_api_request_v1_registry(RRDHOST *host, struct web_client * error("Invalid registry request - search requires these parameters: machine ('%s'), url ('%s'), for ('%s')", machine_guid?machine_guid:"UNSET", machine_url?machine_url:"UNSET", search_machine_guid?search_machine_guid:"UNSET"); buffer_flush(w->response.data); buffer_strcat(w->response.data, "Invalid registry Search request."); - return 400; + return HTTP_RESP_BAD_REQUEST; } web_client_enable_tracking_required(w); @@ -707,7 +707,7 @@ inline int web_client_api_request_v1_registry(RRDHOST *host, struct web_client * error("Invalid registry request - switching identity requires these parameters: machine ('%s'), url ('%s'), to ('%s')", machine_guid?machine_guid:"UNSET", machine_url?machine_url:"UNSET", to_person_guid?to_person_guid:"UNSET"); buffer_flush(w->response.data); buffer_strcat(w->response.data, "Invalid registry Switch request."); - return 400; + return HTTP_RESP_BAD_REQUEST; } web_client_enable_tracking_required(w); @@ -719,7 +719,7 @@ inline int web_client_api_request_v1_registry(RRDHOST *host, struct web_client * default: buffer_flush(w->response.data); buffer_strcat(w->response.data, "Invalid registry request - you need to set an action: hello, access, delete, search"); - return 400; + return HTTP_RESP_BAD_REQUEST; } } @@ -763,7 +763,7 @@ static inline void web_client_api_request_v1_info_mirrored_hosts(BUFFER *wb) { inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, char *url) { (void)url; - if (!netdata_ready) return 503; + if (!netdata_ready) return HTTP_RESP_BACKEND_FETCH_FAILED; BUFFER *wb = w->response.data; buffer_flush(wb); @@ -801,7 +801,7 @@ inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, c buffer_strcat(wb, "}"); buffer_no_cacheable(wb); - return 200; + return HTTP_RESP_OK; } static struct api_command { @@ -860,11 +860,11 @@ inline int web_client_api_request_v1(RRDHOST *host, struct web_client *w, char * buffer_flush(w->response.data); buffer_strcat(w->response.data, "Unsupported v1 API command: "); buffer_strcat_htmlescape(w->response.data, url); - return 404; + return HTTP_RESP_NOT_FOUND; } else { buffer_flush(w->response.data); buffer_sprintf(w->response.data, "Which API v1 command?"); - return 400; + return HTTP_RESP_BAD_REQUEST; } } diff --git a/web/server/web_client.h b/web/server/web_client.h index 7cab46fc24..38a433523b 100644 --- a/web/server/web_client.h +++ b/web/server/web_client.h @@ -25,6 +25,9 @@ extern int web_enable_gzip, #define HTTP_RESP_NOT_FOUND 404 #define HTTP_RESP_PRECOND_FAIL 412 +// HTTP_CODES 5XX Server Errors +#define HTTP_RESP_INTERNAL_SERVER_ERROR 500 +#define HTTP_RESP_BACKEND_FETCH_FAILED 503 extern int respect_web_browser_do_not_track_policy; extern char *web_x_frame_options; -- cgit v1.2.3