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)