summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorthiagoftsm <thiagoftsm@gmail.com>2019-09-03 11:23:32 +0000
committerGitHub <noreply@github.com>2019-09-03 11:23:32 +0000
commit982890f8eab8ccf53d030478d7ea5ad6e3207b40 (patch)
treeb3b761ffeb37ad95a709dbd655a15d7b59013e41 /web
parentc274f5d1b3544f269e3c5529bf30b4c531963a4a (diff)
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
Diffstat (limited to 'web')
-rw-r--r--web/api/badges/web_buffer_svg.c14
-rw-r--r--web/api/exporters/allmetrics.c10
-rw-r--r--web/api/exporters/allmetrics.h1
-rw-r--r--web/api/formatters/rrd2json.c10
-rw-r--r--web/api/formatters/rrd2json.h2
-rw-r--r--web/api/health/health_cmdapi.c10
-rw-r--r--web/api/web_api_v1.c36
-rw-r--r--web/server/web_client.h3
8 files changed, 46 insertions, 40 deletions
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;