diff --git a/README.md b/README.md index b4a47ac..70827e2 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,11 @@ Before compiling, ensure the latest development versions of the following librar * zlib * OpenSSL * Geoip +* Python3 ```bash $ apk update - $ apk add pcre-dev libxml2-dev zlib-dev openssl-dev geoip-dev + $ apk add pcre-dev libxml2-dev zlib-dev openssl-dev geoip-dev linux-headers python3 ``` ### Compiling the attachment code for an existing nginx server diff --git a/attachments/nginx/ngx_module/nginx_version_configuration.sh b/attachments/nginx/ngx_module/nginx_version_configuration.sh index cd5bd8c..a074e2b 100755 --- a/attachments/nginx/ngx_module/nginx_version_configuration.sh +++ b/attachments/nginx/ngx_module/nginx_version_configuration.sh @@ -54,7 +54,7 @@ if test ! -f configured.ok; then exit 1 fi -make && echo "${EXTRA_CC_OPT}" > cc_flags.mk +make -j 60 && echo "${EXTRA_CC_OPT}" > cc_flags.mk if [[ $? != 0 ]]; then echo "Failed to build NGINX source code" exit 1 diff --git a/attachments/nginx/ngx_module/ngx_cp_io.c b/attachments/nginx/ngx_module/ngx_cp_io.c index d37780f..6376ffc 100644 --- a/attachments/nginx/ngx_module/ngx_cp_io.c +++ b/attachments/nginx/ngx_module/ngx_cp_io.c @@ -665,7 +665,11 @@ ngx_http_cp_meta_data_sender(ngx_http_request_t *request, uint32_t cur_request_i uint16_t chunck_type; uint16_t listening_port; ngx_int_t res; + ngx_str_t ngx_parsed_host_str = ngx_string("host"); ngx_str_t maybe_host = { 0, (u_char *)"" }; + ngx_str_t ngx_parsed_host = { 0, (u_char *)"" }; + ngx_str_t parsed_uri = { 0, (u_char *)"" }; + ngx_http_variable_value_t *ngx_var; char *fragments[META_DATA_COUNT + 2]; uint16_t fragments_sizes[META_DATA_COUNT + 2]; static int failure_count = 0; @@ -712,6 +716,23 @@ ngx_http_cp_meta_data_sender(ngx_http_request_t *request, uint32_t cur_request_i maybe_host.data = request->headers_in.host->value.data; } + ngx_var = ngx_http_get_variable(request, &ngx_parsed_host_str, ngx_hash_key(ngx_parsed_host_str.data, ngx_parsed_host_str.len)); + if (ngx_var != NULL && !ngx_var->not_found && ngx_var->len != 0) { + ngx_parsed_host.len = ngx_var->len; + ngx_parsed_host.data = ngx_var->data; + } else { + ngx_parsed_host.len = maybe_host.len; + ngx_parsed_host.data = maybe_host.data; + } + + if (request->uri.len != 0) { + parsed_uri.data = request->uri.data; + parsed_uri.len = request->uri.len; + } else { + parsed_uri.data = request->unparsed_uri.data; + parsed_uri.len = request->unparsed_uri.len; + } + // Add host data length to the fragments. set_fragment_elem( fragments, @@ -739,7 +760,7 @@ ngx_http_cp_meta_data_sender(ngx_http_request_t *request, uint32_t cur_request_i listening_port = htons(((struct sockaddr_in *)request->connection->local_sockaddr)->sin_port); set_fragment_elem(fragments, fragments_sizes, &listening_port, sizeof(listening_port), LISTENING_PORT + 2); - // Add listening port data. + // Add URI data. set_fragment_elem(fragments, fragments_sizes, &request->unparsed_uri.len, sizeof(uint16_t), URI_SIZE + 2); set_fragment_elem(fragments, fragments_sizes, request->unparsed_uri.data, request->unparsed_uri.len, URI_DATA + 2); @@ -752,6 +773,14 @@ ngx_http_cp_meta_data_sender(ngx_http_request_t *request, uint32_t cur_request_i client_port = htons(((struct sockaddr_in *)request->connection->sockaddr)->sin_port); set_fragment_elem(fragments, fragments_sizes, &client_port, sizeof(client_port), CLIENT_PORT + 2); + // Add NGX parsed host data. + set_fragment_elem(fragments, fragments_sizes, &ngx_parsed_host.len, sizeof(uint16_t), PARSED_HOST_SIZE + 2); + set_fragment_elem(fragments, fragments_sizes, ngx_parsed_host.data, ngx_parsed_host.len, PARSED_HOST_DATA + 2); + + // Add parsed URI data. + set_fragment_elem(fragments, fragments_sizes, &parsed_uri.len, sizeof(uint16_t), PARSED_URI_SIZE + 2); + set_fragment_elem(fragments, fragments_sizes, parsed_uri.data, parsed_uri.len, PARSED_URI_DATA + 2); + // Sends all the data to the nano service. res = ngx_http_cp_send_data_to_service(fragments, fragments_sizes, META_DATA_COUNT + 2, cur_request_id, NULL, fail_open_timeout); if (res != NGX_OK) { diff --git a/attachments/nginx/ngx_module/ngx_cp_static_content.c b/attachments/nginx/ngx_module/ngx_cp_static_content.c index bda03ca..279f615 100644 --- a/attachments/nginx/ngx_module/ngx_cp_static_content.c +++ b/attachments/nginx/ngx_module/ngx_cp_static_content.c @@ -227,7 +227,7 @@ is_static_resource_request(ngx_str_t *static_resource_name) if (!is_static_resources_table_initialized()) { write_dbg( - DBG_LEVEL_WARNING, + DBG_LEVEL_DEBUG, "Cannot determine whether request is for a static resource: static resources' table is not initialized" ); return 0; diff --git a/core/include/attachments/nginx_attachment_common.h b/core/include/attachments/nginx_attachment_common.h index 01fa278..89697b4 100644 --- a/core/include/attachments/nginx_attachment_common.h +++ b/core/include/attachments/nginx_attachment_common.h @@ -18,6 +18,7 @@ #include #include #include +#include #define MAX_NGINX_UID_LEN 32 #define NUM_OF_NGINX_IPC_ELEMENTS 200 @@ -183,6 +184,10 @@ typedef enum ngx_http_meta_data CLIENT_ADDR_SIZE, CLIENT_ADDR_DATA, CLIENT_PORT, + PARSED_HOST_SIZE, + PARSED_HOST_DATA, + PARSED_URI_SIZE, + PARSED_URI_DATA, META_DATA_COUNT } ngx_http_meta_data_e; @@ -242,6 +247,7 @@ typedef struct __attribute__((__packed__)) ngx_http_cp_web_response_data { } custom_response_data; struct __attribute__((__packed__)) ngx_http_cp_redirect_data { + uint8_t unused_dummy; uint8_t add_event_id; uint16_t redirect_location_size; char redirect_location[0]; @@ -249,6 +255,12 @@ typedef struct __attribute__((__packed__)) ngx_http_cp_web_response_data { } response_data; } ngx_http_cp_web_response_data_t; +static_assert( + sizeof(((ngx_http_cp_web_response_data_t*)0)->response_data.custom_response_data) == + sizeof(((ngx_http_cp_web_response_data_t*)0)->response_data.redirect_data), + "custom_response_data must be equal to redirect_data in size" +); + typedef union __attribute__((__packed__)) ngx_http_cp_modify_data { ngx_http_cp_inject_data_t inject_data[0]; ngx_http_cp_web_response_data_t web_response_data[0];