mirror of
https://github.com/netdata/netdata.git
synced 2025-04-23 04:50:22 +00:00
fix expiration dates for API responses (#15546)
This commit is contained in:
parent
33cdac2f68
commit
6daedef25b
10 changed files with 26 additions and 9 deletions
database/contexts
libnetdata/buffer
web
api
rtc
server
|
@ -1052,7 +1052,7 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
|
|||
if(query_target_has_percentage_of_group(qt))
|
||||
qt->window.options &= ~RRDR_OPTION_PERCENTAGE;
|
||||
|
||||
rrdr_relative_window_to_absolute(&qt->window.after, &qt->window.before, &qt->window.now);
|
||||
qt->internal.relative = rrdr_relative_window_to_absolute(&qt->window.after, &qt->window.before, &qt->window.now);
|
||||
|
||||
// prepare our local variables - we need these across all these functions
|
||||
QUERY_TARGET_LOCALS qtl = {
|
||||
|
|
|
@ -409,6 +409,7 @@ typedef struct query_target {
|
|||
struct {
|
||||
SPINLOCK spinlock;
|
||||
bool used; // when true, this query is currently being used
|
||||
bool relative; // when true, this query uses relative timestamps
|
||||
size_t queries; // how many query we have done so far with this QUERY_TARGET - not related to database queries
|
||||
struct query_target *prev;
|
||||
struct query_target *next;
|
||||
|
|
|
@ -15,6 +15,7 @@ void buffer_reset(BUFFER *wb) {
|
|||
wb->options = 0;
|
||||
wb->date = 0;
|
||||
wb->expires = 0;
|
||||
buffer_no_cacheable(wb);
|
||||
|
||||
buffer_overflow_check(wb);
|
||||
}
|
||||
|
@ -254,6 +255,7 @@ BUFFER *buffer_create(size_t size, size_t *statistics)
|
|||
b->size = size;
|
||||
b->content_type = CT_TEXT_PLAIN;
|
||||
b->statistics = statistics;
|
||||
buffer_no_cacheable(b);
|
||||
buffer_overflow_init(b);
|
||||
buffer_overflow_check(b);
|
||||
|
||||
|
@ -317,6 +319,7 @@ void buffer_json_initialize(BUFFER *wb, const char *key_quote, const char *value
|
|||
buffer_fast_strcat(wb, "{", 1);
|
||||
|
||||
wb->content_type = CT_APPLICATION_JSON;
|
||||
buffer_no_cacheable(wb);
|
||||
}
|
||||
|
||||
void buffer_json_finalize(BUFFER *wb) {
|
||||
|
|
|
@ -1057,8 +1057,10 @@ int web_client_api_request_v1_badge(RRDHOST *host, struct web_client *w, char *u
|
|||
buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh);
|
||||
w->response.data->date = now_realtime_sec();
|
||||
w->response.data->expires = w->response.data->date + refresh;
|
||||
buffer_cacheable(w->response.data);
|
||||
}
|
||||
else buffer_no_cacheable(w->response.data);
|
||||
else
|
||||
buffer_no_cacheable(w->response.data);
|
||||
|
||||
if(!value_color) {
|
||||
switch(rc->status) {
|
||||
|
|
|
@ -1808,6 +1808,8 @@ int web_api_v12_weights(BUFFER *wb, QUERY_WEIGHTS_REQUEST *qwr) {
|
|||
|
||||
if(!rrdr_relative_window_to_absolute(&qwr->after, &qwr->before, NULL))
|
||||
buffer_no_cacheable(wb);
|
||||
else
|
||||
buffer_cacheable(wb);
|
||||
|
||||
if (qwr->before <= qwr->after) {
|
||||
resp = HTTP_RESP_BAD_REQUEST;
|
||||
|
|
|
@ -32,6 +32,8 @@ static bool web_client_check_acl_and_bearer(struct web_client *w, WEB_CLIENT_ACL
|
|||
}
|
||||
|
||||
int web_client_api_request_vX(RRDHOST *host, struct web_client *w, char *url_path_endpoint, struct web_api_command *api_commands) {
|
||||
buffer_no_cacheable(w->response.data);
|
||||
|
||||
if(unlikely(!url_path_endpoint || !*url_path_endpoint)) {
|
||||
buffer_flush(w->response.data);
|
||||
buffer_sprintf(w->response.data, "Which API command?");
|
||||
|
|
|
@ -883,6 +883,11 @@ static inline int web_client_api_request_v1_data(RRDHOST *host, struct web_clien
|
|||
else if(format == DATASOURCE_JSONP)
|
||||
buffer_strcat(w->response.data, ");");
|
||||
|
||||
if(qt->internal.relative)
|
||||
buffer_no_cacheable(w->response.data);
|
||||
else
|
||||
buffer_cacheable(w->response.data);
|
||||
|
||||
cleanup:
|
||||
query_target_release(qt);
|
||||
onewayalloc_destroy(owa);
|
||||
|
|
|
@ -629,6 +629,11 @@ static int web_client_api_request_v2_data(RRDHOST *host __maybe_unused, struct w
|
|||
else if(format == DATASOURCE_JSONP)
|
||||
buffer_strcat(w->response.data, ");");
|
||||
|
||||
if(qt->internal.relative)
|
||||
buffer_no_cacheable(w->response.data);
|
||||
else
|
||||
buffer_cacheable(w->response.data);
|
||||
|
||||
cleanup:
|
||||
query_target_release(qt);
|
||||
onewayalloc_destroy(owa);
|
||||
|
|
|
@ -304,7 +304,7 @@ static void webrtc_execute_api_request(WEBRTC_DC *chan, const char *request, siz
|
|||
web_client_timeout_checkpoint_set(w, 0);
|
||||
web_client_decode_path_and_query_string(w, path);
|
||||
path = (char *)buffer_tostring(w->url_path_decoded);
|
||||
w->response.code = (short)web_client_api_request_with_node_selection(localhost, w, path);
|
||||
w->response.code = (short)web_client_api_request_with_node_selection(rrdb.localhost, w, path);
|
||||
web_client_timeout_checkpoint_response_ready(w, NULL);
|
||||
|
||||
size_t sent_bytes = 0;
|
||||
|
|
|
@ -1274,12 +1274,9 @@ void web_client_build_http_header(struct web_client *w) {
|
|||
w->response.data->date = now_realtime_sec();
|
||||
|
||||
// set a proper expiration date, if not already set
|
||||
if(unlikely(!w->response.data->expires)) {
|
||||
if(w->response.data->options & WB_CONTENT_NO_CACHEABLE)
|
||||
w->response.data->expires = w->response.data->date + rrdb.localhost->update_every;
|
||||
else
|
||||
w->response.data->expires = w->response.data->date + 86400;
|
||||
}
|
||||
if(unlikely(!w->response.data->expires))
|
||||
w->response.data->expires = w->response.data->date +
|
||||
((w->response.data->options & WB_CONTENT_NO_CACHEABLE) ? 0 : 86400);
|
||||
|
||||
// prepare the HTTP response header
|
||||
netdata_log_debug(D_WEB_CLIENT, "%llu: Generating HTTP header with response %d.", w->id, w->response.code);
|
||||
|
|
Loading…
Add table
Reference in a new issue