/* Initialize a session-record. */ void init_session(t_session *session) { #ifdef ENABLE_TOMAHAWK increment_counter(COUNTER_CLIENT); #endif if ((session->client_id = new_client_id++) == MAX_CHILD_ID) { new_client_id = 0; } session->request_limit = true; session->force_quit = false; session->keep_alive = false; session->kept_alive = 0; session->last_host = NULL; session->request = NULL; session->buffer_size = 0; session->bytes_in_buffer = 0; clear_session(session); session->socket_open = false; session->via_trusted_proxy = false; session->flooding_timer = session->time; #ifdef ENABLE_RPROXY session->rproxy_kept_alive = false; #endif #ifdef ENABLE_HTTP2 session->use_http2 = false; #endif }
/* Reset a session-record for reuse. */ void reset_session(t_session *session) { long size; check_clear_free(session->file_on_disk, CHECK_USE_STRLEN); #ifdef CIFS check_free(session->extension); #endif check_clear_free(session->local_user, CHECK_USE_STRLEN); check_clear_free(session->remote_user, CHECK_USE_STRLEN); check_free(session->path_info); check_free(session->request_uri); check_free(session->location); if (session->uploaded_file != NULL) { unlink(session->uploaded_file); free(session->uploaded_file); } session->http_headers = remove_http_headers(session->http_headers); if (session->directory != NULL) { pthread_mutex_lock(&(session->directory->client_mutex)); if (session->part_of_dirspeed) { if (--session->directory->nr_of_clients == 0) { session->directory->session_speed = session->directory->upload_speed; } else { session->directory->session_speed = session->directory->upload_speed / session->directory->nr_of_clients; } } pthread_mutex_unlock(&(session->directory->client_mutex)); } #ifdef ENABLE_TOOLKIT if (session->host->toolkit_rules_user != NULL) { free(session->host->toolkit_rules_user); } remove_charlist(&(session->host->toolkit_rules_user_str)); #endif /* HTTP pipelining */ size = session->header_length + session->content_length; if ((session->bytes_in_buffer > size) && session->keep_alive) { session->bytes_in_buffer -= size; memmove(session->request, session->request + size, session->bytes_in_buffer); *(session->request + session->bytes_in_buffer) = '\0'; } else { check_clear_free(session->request, session->buffer_size); session->request = NULL; session->buffer_size = 0; session->bytes_in_buffer = 0; } remove_tempdata(session->tempdata); if (session->host_copied) { free(session->host); } clear_session(session); }
/* Reset a session-record for reuse. */ void reset_session(t_session *session) { int size; session->error_cause = ec_NONE; sfree(session->file_on_disk); #ifdef CIFS sfree(session->extension); #endif sfree(session->local_user); sfree(session->remote_user); sfree(session->path_info); sfree(session->request_uri); sfree(session->location); #ifdef ENABLE_XSLT sfree(session->xslt_file); #endif if (session->uploaded_file != NULL) { unlink(session->uploaded_file); free(session->uploaded_file); } session->headerfields = remove_headerfields(session->headerfields); if (session->directory != NULL) { pthread_mutex_lock(&(session->directory->client_mutex)); if (session->part_of_dirspeed) { if (--session->directory->nr_of_clients == 0) { session->directory->session_speed = session->directory->upload_speed; } else { session->directory->session_speed = session->directory->upload_speed / session->directory->nr_of_clients; } } pthread_mutex_unlock(&(session->directory->client_mutex)); } /* HTTP pipelining */ size = session->header_length + session->content_length; if ((session->bytes_in_buffer > size) && session->keep_alive) { session->bytes_in_buffer -= size; memmove(session->request, session->request + size, session->bytes_in_buffer); *(session->request + session->bytes_in_buffer) = '\0'; } else { sfree(session->request); session->request = NULL; session->buffer_size = 0; session->bytes_in_buffer = 0; } remove_tempdata(session->tempdata); if (session->host_copied) { free(session->host); } clear_session(session); }