diff options
Diffstat (limited to '')
-rw-r--r-- | web/server/static/static-threaded.c | 4 | ||||
-rw-r--r-- | web/server/static/static-threaded.h | 2 | ||||
-rw-r--r-- | web/server/web_client.c | 69 | ||||
-rw-r--r-- | web/server/web_client.h | 21 | ||||
-rw-r--r-- | web/server/web_client_cache.c | 8 | ||||
-rw-r--r-- | web/server/web_client_cache.h | 8 | ||||
-rw-r--r-- | web/server/web_server.h | 14 |
7 files changed, 56 insertions, 70 deletions
diff --git a/web/server/static/static-threaded.c b/web/server/static/static-threaded.c index 8b9122f87..26e9a47bd 100644 --- a/web/server/static/static-threaded.c +++ b/web/server/static/static-threaded.c @@ -196,7 +196,7 @@ static void *web_server_add_callback(POLLINFO *pi, short int *events, void *data } #ifdef ENABLE_HTTPS - if ((!web_client_check_unix(w)) && ( netdata_srv_ctx )) { + if ((!web_client_check_unix(w)) && (netdata_ssl_srv_ctx)) { if( sock_delnonblock(w->ifd) < 0 ){ error("Web server cannot remove the non-blocking flag from socket %d",w->ifd); } @@ -218,7 +218,7 @@ static void *web_server_add_callback(POLLINFO *pi, short int *events, void *data //The next two ifs are not together because I am reusing SSL structure if (!w->ssl.conn) { - w->ssl.conn = SSL_new(netdata_srv_ctx); + w->ssl.conn = SSL_new(netdata_ssl_srv_ctx); if ( w->ssl.conn ) { SSL_set_accept_state(w->ssl.conn); } else { diff --git a/web/server/static/static-threaded.h b/web/server/static/static-threaded.h index 5f4862e5b..a8c5335ef 100644 --- a/web/server/static/static-threaded.h +++ b/web/server/static/static-threaded.h @@ -5,6 +5,6 @@ #include "web/server/web_server.h" -extern void *socket_listen_main_static_threaded(void *ptr); +void *socket_listen_main_static_threaded(void *ptr); #endif //NETDATA_WEB_SERVER_STATIC_THREADED_H diff --git a/web/server/web_client.c b/web/server/web_client.c index d287cec03..b3c5ada7a 100644 --- a/web/server/web_client.c +++ b/web/server/web_client.c @@ -85,11 +85,11 @@ void web_client_request_done(struct web_client *w) { // -------------------------------------------------------------------- // global statistics - finished_web_request_statistics(dt_usec(&tv, &w->tv_in), - w->stats_received_bytes, - w->stats_sent_bytes, - size, - sent); + global_statistics_web_request_completed(dt_usec(&tv, &w->tv_in), + w->stats_received_bytes, + w->stats_sent_bytes, + size, + sent); w->stats_received_bytes = 0; w->stats_sent_bytes = 0; @@ -1018,7 +1018,7 @@ static inline HTTP_VALIDATION http_request_validate(struct web_client *w) { // TODO -- ideally we we should avoid copying buffers around snprintfz(w->last_url, NETDATA_WEB_REQUEST_URL_SIZE, "%s%s", w->decoded_url, w->decoded_query_string); #ifdef ENABLE_HTTPS - if ( (!web_client_check_unix(w)) && (netdata_srv_ctx) ) { + if ( (!web_client_check_unix(w)) && (netdata_ssl_srv_ctx) ) { if ((w->ssl.conn) && ((w->ssl.flags & NETDATA_SSL_NO_HANDSHAKE) && (web_client_is_using_ssl_force(w) || web_client_is_using_ssl_default(w)) && (w->mode != WEB_CLIENT_MODE_STREAM)) ) { w->header_parse_tries = 0; w->header_parse_last_size = 0; @@ -1054,9 +1054,9 @@ static inline ssize_t web_client_send_data(struct web_client *w,const void *buf, { ssize_t bytes; #ifdef ENABLE_HTTPS - if ( (!web_client_check_unix(w)) && (netdata_srv_ctx) ) { + if ( (!web_client_check_unix(w)) && (netdata_ssl_srv_ctx) ) { if ( ( w->ssl.conn ) && ( !w->ssl.flags ) ){ - bytes = SSL_write(w->ssl.conn,buf, len) ; + bytes = netdata_ssl_write(w->ssl.conn, buf, len) ; } else { bytes = send(w->ofd,buf, len , flags); } @@ -1211,26 +1211,10 @@ static inline void web_client_send_http_header(struct web_client *w) { size_t count = 0; ssize_t bytes; #ifdef ENABLE_HTTPS - if ( (!web_client_check_unix(w)) && (netdata_srv_ctx) ) { - if ( ( w->ssl.conn ) && ( !w->ssl.flags ) ){ - while((bytes = SSL_write(w->ssl.conn, buffer_tostring(w->response.header_output), buffer_strlen(w->response.header_output))) < 0) { - count++; - if(count > 100 || (errno != EAGAIN && errno != EWOULDBLOCK)) { - error("Cannot send HTTPS headers to web client."); - break; - } - } - } else { - while((bytes = send(w->ofd, buffer_tostring(w->response.header_output), buffer_strlen(w->response.header_output), 0)) == -1) { - count++; - - if(count > 100 || (errno != EAGAIN && errno != EWOULDBLOCK)) { - error("Cannot send HTTP headers to web client."); - break; - } - } - } - } else { + if ( (!web_client_check_unix(w)) && (netdata_ssl_srv_ctx) ) { + if ( ( w->ssl.conn ) && ( w->ssl.flags == NETDATA_SSL_HANDSHAKE_COMPLETE ) ) + bytes = netdata_ssl_write(w->ssl.conn, buffer_tostring(w->response.header_output), buffer_strlen(w->response.header_output)); + else { while((bytes = send(w->ofd, buffer_tostring(w->response.header_output), buffer_strlen(w->response.header_output), 0)) == -1) { count++; @@ -1239,6 +1223,17 @@ static inline void web_client_send_http_header(struct web_client *w) { break; } } + } + } + else { + while((bytes = send(w->ofd, buffer_tostring(w->response.header_output), buffer_strlen(w->response.header_output), 0)) == -1) { + count++; + + if(count > 100 || (errno != EAGAIN && errno != EWOULDBLOCK)) { + error("Cannot send HTTP headers to web client."); + break; + } + } } #else while((bytes = send(w->ofd, buffer_tostring(w->response.header_output), buffer_strlen(w->response.header_output), 0)) == -1) { @@ -1305,19 +1300,9 @@ static inline int web_client_switch_host(RRDHOST *host, struct web_client *w, ch if(url && *url) strncpyz(&w->last_url[1], url, NETDATA_WEB_REQUEST_URL_SIZE - 1); else w->last_url[1] = '\0'; - uint32_t hash = simple_hash(tok); - - host = rrdhost_find_by_hostname(tok, hash); + host = rrdhost_find_by_hostname(tok); if (!host) - host = rrdhost_find_by_guid(tok, hash); - if (!host) { - host = sql_create_host_by_uuid(tok); - if (likely(host)) { - int rc = web_client_process_url(host, w, url); - free_temporary_host(host); - return rc; - } - } + host = rrdhost_find_by_guid(tok); if (host) return web_client_process_url(host, w, url); } @@ -1917,9 +1902,9 @@ ssize_t web_client_receive(struct web_client *w) buffer_need_bytes(w->response.data, NETDATA_WEB_REQUEST_RECEIVE_SIZE); #ifdef ENABLE_HTTPS - if ( (!web_client_check_unix(w)) && (netdata_srv_ctx) ) { + if ( (!web_client_check_unix(w)) && (netdata_ssl_srv_ctx) ) { if ( ( w->ssl.conn ) && (!w->ssl.flags)) { - bytes = SSL_read(w->ssl.conn, &w->response.data->buffer[w->response.data->len], (size_t) (left - 1)); + bytes = netdata_ssl_read(w->ssl.conn, &w->response.data->buffer[w->response.data->len], (size_t) (left - 1)); }else { bytes = recv(w->ifd, &w->response.data->buffer[w->response.data->len], (size_t) (left - 1), MSG_DONTWAIT); } diff --git a/web/server/web_client.h b/web/server/web_client.h index 50e08fb33..630d71a8a 100644 --- a/web/server/web_client.h +++ b/web/server/web_client.h @@ -27,6 +27,7 @@ extern int web_enable_gzip, web_gzip_level, web_gzip_strategy; #define HTTP_RESP_INTERNAL_SERVER_ERROR 500 #define HTTP_RESP_BACKEND_FETCH_FAILED 503 #define HTTP_RESP_GATEWAY_TIMEOUT 504 +#define HTTP_RESP_BACKEND_RESPONSE_INVALID 591 extern int respect_web_browser_do_not_track_policy; extern char *web_x_frame_options; @@ -189,21 +190,21 @@ struct web_client { #endif }; -extern int web_client_permission_denied(struct web_client *w); +int web_client_permission_denied(struct web_client *w); -extern ssize_t web_client_send(struct web_client *w); -extern ssize_t web_client_receive(struct web_client *w); -extern ssize_t web_client_read_file(struct web_client *w); +ssize_t web_client_send(struct web_client *w); +ssize_t web_client_receive(struct web_client *w); +ssize_t web_client_read_file(struct web_client *w); -extern void web_client_process_request(struct web_client *w); -extern void web_client_request_done(struct web_client *w); +void web_client_process_request(struct web_client *w); +void web_client_request_done(struct web_client *w); -extern void buffer_data_options2string(BUFFER *wb, uint32_t options); +void buffer_data_options2string(BUFFER *wb, uint32_t options); -extern int mysendfile(struct web_client *w, char *filename); +int mysendfile(struct web_client *w, char *filename); -extern void web_client_build_http_header(struct web_client *w); -extern char *strip_control_characters(char *url); +void web_client_build_http_header(struct web_client *w); +char *strip_control_characters(char *url); #include "daemon/common.h" diff --git a/web/server/web_client_cache.c b/web/server/web_client_cache.c index 5d7865762..1fa593580 100644 --- a/web/server/web_client_cache.c +++ b/web/server/web_client_cache.c @@ -9,7 +9,7 @@ #ifdef ENABLE_HTTPS static void web_client_reuse_ssl(struct web_client *w) { - if (netdata_srv_ctx) { + if (netdata_ssl_srv_ctx) { if (w->ssl.conn) { SSL_clear(w->ssl.conn); } @@ -48,7 +48,7 @@ static void web_client_free(struct web_client *w) { buffer_free(w->response.data); freez(w->user_agent); #ifdef ENABLE_HTTPS - if ((!web_client_check_unix(w)) && ( netdata_srv_ctx )) { + if ((!web_client_check_unix(w)) && (netdata_ssl_srv_ctx)) { if (w->ssl.conn) { SSL_free(w->ssl.conn); w->ssl.conn = NULL; @@ -209,7 +209,7 @@ struct web_client *web_client_get_from_cache_or_allocate() { web_clients_cache.used_count++; // initialize it - w->id = web_client_connected(); + w->id = global_statistics_web_client_connected(); w->mode = WEB_CLIENT_MODE_NORMAL; netdata_thread_enable_cancelability(); @@ -230,7 +230,7 @@ void web_client_release(struct web_client *w) { web_server_log_connection(w, "DISCONNECTED"); web_client_request_done(w); - web_client_disconnected(); + global_statistics_web_client_disconnected(); netdata_thread_disable_cancelability(); diff --git a/web/server/web_client_cache.h b/web/server/web_client_cache.h index f63888000..324f23ed9 100644 --- a/web/server/web_client_cache.h +++ b/web/server/web_client_cache.h @@ -21,10 +21,10 @@ struct clients_cache { extern __thread struct clients_cache web_clients_cache; -extern void web_client_release(struct web_client *w); -extern struct web_client *web_client_get_from_cache_or_allocate(); -extern void web_client_cache_destroy(void); -extern void web_client_cache_verify(int force); +void web_client_release(struct web_client *w); +struct web_client *web_client_get_from_cache_or_allocate(); +void web_client_cache_destroy(void); +void web_client_cache_verify(int force); #include "web_server.h" diff --git a/web/server/web_server.h b/web/server/web_server.h index 7bfc81c9d..51230ed2b 100644 --- a/web/server/web_server.h +++ b/web/server/web_server.h @@ -36,10 +36,10 @@ extern int web_allow_mgmt_dns; extern WEB_SERVER_MODE web_server_mode; -extern WEB_SERVER_MODE web_server_mode_id(const char *mode); -extern const char *web_server_mode_name(WEB_SERVER_MODE id); +WEB_SERVER_MODE web_server_mode_id(const char *mode); +const char *web_server_mode_name(WEB_SERVER_MODE id); -extern void api_listen_sockets_setup(void); +void api_listen_sockets_setup(void); #define DEFAULT_TIMEOUT_TO_RECEIVE_FIRST_WEB_REQUEST 60 #define DEFAULT_DISCONNECT_IDLE_WEB_CLIENTS_AFTER_SECONDS 60 @@ -49,10 +49,10 @@ extern long web_client_streaming_rate_t; #ifdef WEB_SERVER_INTERNALS extern LISTEN_SOCKETS api_sockets; -extern void web_client_update_acl_matches(struct web_client *w); -extern void web_server_log_connection(struct web_client *w, const char *msg); -extern void web_client_initialize_connection(struct web_client *w); -extern struct web_client *web_client_create_on_listenfd(int listener); +void web_client_update_acl_matches(struct web_client *w); +void web_server_log_connection(struct web_client *w, const char *msg); +void web_client_initialize_connection(struct web_client *w); +struct web_client *web_client_create_on_listenfd(int listener); #include "web_client_cache.h" #endif // WEB_SERVER_INTERNALS |