@cryptotaxi247 / netdata-1 / commits / eabd0bea9

api failed responses are not cacheable; failed svg images are not cacheable

Costa Tsaousis committed Sep 26, 2016 at 14:47 UTC eabd0bea915a79ef3263e5b67d9215987421e645
2 files changed +44 -8
src/web_buffer.h
+1 -1
@@ -41,7 +41,7 @@ typedef struct web_buffer {
41 #define CT_IMAGE_BMP 21
42
43 #define buffer_cacheable(wb) do { (wb)->options |= WB_CONTENT_CACHEABLE; if((wb)->options & WB_CONTENT_NO_CACHEABLE) (wb)->options &= ~WB_CONTENT_NO_CACHEABLE; } while(0)
44 -#define buffer_no_cacheable(wb) do { (wb)->options |= WB_CONTENT_NO_CACHEABLE; if((wb)->options & WB_CONTENT_CACHEABLE) (wb)->options &= ~WB_CONTENT_CACHEABLE; } while(0)
44 +#define buffer_no_cacheable(wb) do { (wb)->options |= WB_CONTENT_NO_CACHEABLE; if((wb)->options & WB_CONTENT_CACHEABLE) (wb)->options &= ~WB_CONTENT_CACHEABLE; (wb)->expires = 0; } while(0)
45
46 #define buffer_strlen(wb) ((wb)->len)
47 extern const char *buffer_tostring(BUFFER *wb);
src/web_client.c
+43 -7
@@ -821,6 +821,7 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
821 }
822
823 if(!chart || !*chart) {
824 + buffer_no_cacheable(w->response.data);
825 buffer_sprintf(w->response.data, "No chart id is given at the request.");
826 goto cleanup;
827 }
@@ -828,6 +829,7 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
829 RRDSET *st = rrdset_find(chart);
830 if(!st) st = rrdset_find_byname(chart);
831 if(!st) {
832 + buffer_no_cacheable(w->response.data);
833 buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1, -1);
834 ret = 200;
835 goto cleanup;
@@ -837,6 +839,7 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
839 if(alarm) {
840 rc = rrdcalc_find(st, alarm);
841 if (!rc) {
842 + buffer_no_cacheable(w->response.data);
843 buffer_svg(w->response.data, "alarm not found", 0, "", NULL, NULL, 1, -1);
844 ret = 200;
845 goto cleanup;
@@ -860,7 +863,7 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
863 else if(options & RRDR_OPTION_NOT_ALIGNED)
864 refresh = st->update_every;
865 else {
863 - refresh = (before - after);
866 + refresh = (int)(before - after);
867 if(refresh < 0) refresh = -refresh;
868 }
869 }
@@ -916,8 +919,11 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
919 calculated_number n = rc->value;
920 if(isnan(n) || isinf(n)) n = 0;
921
919 - if (refresh > 0)
922 + if (refresh > 0) {
923 buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh);
924 + w->response.data->expires = time(NULL) + refresh;
925 + }
926 + else buffer_no_cacheable(w->response.data);
927
928 if(!value_color) {
929 switch(rc->status) {
@@ -947,7 +953,14 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
953 }
954 }
955
950 - buffer_svg(w->response.data, label, rc->value * multiply / divide, units, label_color, value_color, 0, precision);
956 + buffer_svg(w->response.data,
957 + label,
958 + rc->value * multiply / divide,
959 + units,
960 + label_color,
961 + value_color,
962 + 0,
963 + precision);
964 ret = 200;
965 }
966 else {
@@ -958,20 +971,40 @@ int web_client_api_request_v1_badge(struct web_client *w, char *url) {
971
972 // if the collected value is too old, don't calculate its value
973 if (rrdset_last_entry_t(st) >= (time(NULL) - (st->update_every * st->gap_when_lost_iterations_above)))
961 - ret = rrd2value(st, w->response.data, &n, (dimensions) ? buffer_tostring(dimensions) : NULL, points, after,
962 - before, group, options, NULL, &latest_timestamp, &value_is_null);
974 + ret = rrd2value(st,
975 + w->response.data,
976 + &n,
977 + (dimensions) ? buffer_tostring(dimensions) : NULL,
978 + points,
979 + after,
980 + before,
981 + group,
982 + options,
983 + NULL,
984 + &latest_timestamp,
985 + &value_is_null);
986
987 // if the value cannot be calculated, show empty badge
988 if (ret != 200) {
989 + buffer_no_cacheable(w->response.data);
990 value_is_null = 1;
991 n = 0;
992 ret = 200;
993 }
970 - else if (refresh > 0)
994 + else if (refresh > 0) {
995 buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh);
996 + w->response.data->expires = time(NULL) + refresh;
997 + }
998 + else buffer_no_cacheable(w->response.data);
999
1000 // render the badge
974 - buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null,
1001 + buffer_svg(w->response.data,
1002 + label,
1003 + n * multiply / divide,
1004 + units,
1005 + label_color,
1006 + value_color,
1007 + value_is_null,
1008 precision);
1009 }
1010
@@ -2090,6 +2123,9 @@ void web_client_process(struct web_client *w) {
2123 if(unlikely(!w->response.data->date))
2124 w->response.data->date = w->tv_ready.tv_sec;
2125
2126 + if(unlikely(code != 200))
2127 + buffer_no_cacheable(w->response.data);
2128 +
2129 // set a proper expiration date, if not already set
2130 if(unlikely(!w->response.data->expires)) {
2131 if(w->response.data->options & WB_CONTENT_NO_CACHEABLE)