| /** @file | |
| TransactionLogData implementation. | |
| @section license License | |
| Licensed to the Apache Software Foundation (ASF) under one | |
| or more contributor license agreements. See the NOTICE file | |
| distributed with this work for additional information | |
| regarding copyright ownership. The ASF licenses this file | |
| to you under the Apache License, Version 2.0 (the | |
| "License"); you may not use this file except in compliance | |
| with the License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| #include "proxy/logging/TransactionLogData.h" | |
| #include "proxy/NonHttpSmLogData.h" | |
| #include "proxy/http/HttpSM.h" | |
| #include "proxy/logging/LogAccess.h" | |
| #include "proxy/hdrs/MIME.h" | |
| #include "tscore/ink_defs.h" | |
| #include "../private/SSLProxySession.h" | |
| namespace | |
| { | |
| /** Map HttpTransact::CacheWriteStatus_t to LogCacheWriteCodeType. */ | |
| int | |
| convert_cache_write_code(HttpTransact::CacheWriteStatus_t t) | |
| { | |
| switch (t) { | |
| case HttpTransact::CacheWriteStatus_t::NO_WRITE: | |
| return LOG_CACHE_WRITE_NONE; | |
| case HttpTransact::CacheWriteStatus_t::LOCK_MISS: | |
| return LOG_CACHE_WRITE_LOCK_MISSED; | |
| case HttpTransact::CacheWriteStatus_t::IN_PROGRESS: | |
| return LOG_CACHE_WRITE_LOCK_ABORTED; | |
| case HttpTransact::CacheWriteStatus_t::ERROR: | |
| return LOG_CACHE_WRITE_ERROR; | |
| case HttpTransact::CacheWriteStatus_t::COMPLETE: | |
| return LOG_CACHE_WRITE_COMPLETE; | |
| default: | |
| ink_assert(!"bad cache write code"); | |
| return LOG_CACHE_WRITE_NONE; | |
| } | |
| } | |
| int | |
| compute_client_finish_status(HttpSM *sm) | |
| { | |
| HttpTransact::AbortState_t cl_abort_state = sm->t_state.client_info.abort; | |
| if (cl_abort_state == HttpTransact::ABORTED) { | |
| if (sm->t_state.client_info.state == HttpTransact::ACTIVE_TIMEOUT || | |
| sm->t_state.client_info.state == HttpTransact::INACTIVE_TIMEOUT) { | |
| return LOG_FINISH_TIMEOUT; | |
| } | |
| return LOG_FINISH_INTR; | |
| } | |
| return LOG_FINISH_FIN; | |
| } | |
| int | |
| compute_proxy_finish_status(HttpSM *sm) | |
| { | |
| if (sm->t_state.current.server) { | |
| switch (sm->t_state.current.server->state) { | |
| case HttpTransact::ACTIVE_TIMEOUT: | |
| case HttpTransact::INACTIVE_TIMEOUT: | |
| return LOG_FINISH_TIMEOUT; | |
| case HttpTransact::CONNECTION_ERROR: | |
| return LOG_FINISH_INTR; | |
| default: | |
| if (sm->t_state.current.server->abort == HttpTransact::ABORTED) { | |
| return LOG_FINISH_INTR; | |
| } | |
| break; | |
| } | |
| } | |
| return LOG_FINISH_FIN; | |
| } | |
| } // end anonymous namespace | |
| TransactionLogData::TransactionLogData(HttpSM *sm) : m_http_sm(sm) | |
| { | |
| ink_assert(sm != nullptr); | |
| } | |
| TransactionLogData::TransactionLogData(NonHttpSmLogData const &non_http_sm_data) : m_non_http_sm_data(&non_http_sm_data) {} | |
| void * | |
| TransactionLogData::http_sm_for_plugins() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm; | |
| } | |
| return nullptr; | |
| } | |
| // ===== Milestones ===== | |
| TransactionMilestones const * | |
| TransactionLogData::get_milestones() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return &m_http_sm->milestones; | |
| } | |
| return &m_non_http_sm_data->owned_milestones; | |
| } | |
| // ===== Headers ===== | |
| HTTPHdr * | |
| TransactionLogData::get_client_request() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| HttpTransact::HeaderInfo *hdr = &m_http_sm->t_state.hdr_info; | |
| if (hdr->client_request.valid()) { | |
| return &hdr->client_request; | |
| } | |
| return nullptr; | |
| } | |
| if (m_non_http_sm_data->owned_client_request.valid()) { | |
| return const_cast<HTTPHdr *>(&m_non_http_sm_data->owned_client_request); | |
| } | |
| return nullptr; | |
| } | |
| HTTPHdr * | |
| TransactionLogData::get_proxy_response() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| HttpTransact::HeaderInfo *hdr = &m_http_sm->t_state.hdr_info; | |
| if (hdr->client_response.valid()) { | |
| return &hdr->client_response; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| HTTPHdr * | |
| TransactionLogData::get_proxy_request() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| HttpTransact::HeaderInfo *hdr = &m_http_sm->t_state.hdr_info; | |
| if (hdr->server_request.valid()) { | |
| return &hdr->server_request; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| HTTPHdr * | |
| TransactionLogData::get_server_response() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| HttpTransact::HeaderInfo *hdr = &m_http_sm->t_state.hdr_info; | |
| if (hdr->server_response.valid()) { | |
| return &hdr->server_response; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| HTTPHdr * | |
| TransactionLogData::get_cache_response() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| HttpTransact::HeaderInfo *hdr = &m_http_sm->t_state.hdr_info; | |
| if (hdr->cache_response.valid()) { | |
| return &hdr->cache_response; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| // ===== Client request URL / path ===== | |
| void | |
| TransactionLogData::cache_url_strings() const | |
| { | |
| if (m_url_cached) { | |
| return; | |
| } | |
| m_url_cached = true; | |
| HTTPHdr *client_request = get_client_request(); | |
| if (client_request) { | |
| m_client_req_url_str = client_request->url_string_get_ref(&m_client_req_url_len); | |
| auto path_sv = client_request->path_get(); | |
| m_client_req_url_path_str = path_sv.data(); | |
| m_client_req_url_path_len = static_cast<int>(path_sv.length()); | |
| } | |
| } | |
| const char * | |
| TransactionLogData::get_client_req_url_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_url_strings(); | |
| return m_client_req_url_str; | |
| } | |
| return m_non_http_sm_data->owned_url.empty() ? nullptr : m_non_http_sm_data->owned_url.c_str(); | |
| } | |
| int | |
| TransactionLogData::get_client_req_url_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_url_strings(); | |
| return m_client_req_url_len; | |
| } | |
| return static_cast<int>(m_non_http_sm_data->owned_url.size()); | |
| } | |
| const char * | |
| TransactionLogData::get_client_req_url_path_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_url_strings(); | |
| return m_client_req_url_path_str; | |
| } | |
| return m_non_http_sm_data->owned_path.empty() ? nullptr : m_non_http_sm_data->owned_path.c_str(); | |
| } | |
| int | |
| TransactionLogData::get_client_req_url_path_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_url_strings(); | |
| return m_client_req_url_path_len; | |
| } | |
| return static_cast<int>(m_non_http_sm_data->owned_path.size()); | |
| } | |
| // ===== Proxy response content-type / reason ===== | |
| void | |
| TransactionLogData::cache_content_type() const | |
| { | |
| if (m_content_type_cached) { | |
| return; | |
| } | |
| m_content_type_cached = true; | |
| HTTPHdr *proxy_response = get_proxy_response(); | |
| if (proxy_response) { | |
| MIMEField *field = proxy_response->field_find(static_cast<std::string_view>(MIME_FIELD_CONTENT_TYPE)); | |
| if (field) { | |
| auto ct = field->value_get(); | |
| m_proxy_resp_content_type_str = const_cast<char *>(ct.data()); | |
| m_proxy_resp_content_type_len = ct.length(); | |
| } else { | |
| constexpr std::string_view hidden_ct{"@Content-Type"}; | |
| field = proxy_response->field_find(hidden_ct); | |
| if (field) { | |
| auto ct = field->value_get(); | |
| m_proxy_resp_content_type_str = const_cast<char *>(ct.data()); | |
| m_proxy_resp_content_type_len = ct.length(); | |
| } | |
| } | |
| auto reason = proxy_response->reason_get(); | |
| m_proxy_resp_reason_phrase_str = const_cast<char *>(reason.data()); | |
| m_proxy_resp_reason_phrase_len = static_cast<int>(reason.length()); | |
| } | |
| } | |
| char * | |
| TransactionLogData::get_proxy_resp_content_type_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_content_type(); | |
| return m_proxy_resp_content_type_str; | |
| } | |
| return nullptr; | |
| } | |
| int | |
| TransactionLogData::get_proxy_resp_content_type_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_content_type(); | |
| return m_proxy_resp_content_type_len; | |
| } | |
| return 0; | |
| } | |
| char * | |
| TransactionLogData::get_proxy_resp_reason_phrase_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_content_type(); | |
| return m_proxy_resp_reason_phrase_str; | |
| } | |
| return nullptr; | |
| } | |
| int | |
| TransactionLogData::get_proxy_resp_reason_phrase_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| cache_content_type(); | |
| return m_proxy_resp_reason_phrase_len; | |
| } | |
| return 0; | |
| } | |
| // ===== Unmapped URL ===== | |
| char * | |
| TransactionLogData::get_unmapped_url_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.unmapped_url.valid()) { | |
| int len = 0; | |
| return m_http_sm->t_state.unmapped_url.string_get_ref(&len); | |
| } | |
| } | |
| return nullptr; | |
| } | |
| int | |
| TransactionLogData::get_unmapped_url_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.unmapped_url.valid()) { | |
| int len = 0; | |
| m_http_sm->t_state.unmapped_url.string_get_ref(&len); | |
| return len; | |
| } | |
| } | |
| return 0; | |
| } | |
| // ===== Cache lookup URL ===== | |
| char * | |
| TransactionLogData::get_cache_lookup_url_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.cache_info.lookup_url_storage.valid()) { | |
| int len = 0; | |
| return m_http_sm->t_state.cache_info.lookup_url_storage.string_get_ref(&len); | |
| } | |
| } | |
| return nullptr; | |
| } | |
| int | |
| TransactionLogData::get_cache_lookup_url_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.cache_info.lookup_url_storage.valid()) { | |
| int len = 0; | |
| m_http_sm->t_state.cache_info.lookup_url_storage.string_get_ref(&len); | |
| return len; | |
| } | |
| } | |
| return 0; | |
| } | |
| const ts::CryptoHash * | |
| TransactionLogData::get_cache_lookup_hash() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return &(m_http_sm->get_cache_sm().get_cache_key().hash); | |
| } | |
| return nullptr; | |
| } | |
| // ===== Client addressing ===== | |
| sockaddr const * | |
| TransactionLogData::get_client_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return &m_http_sm->t_state.effective_client_addr.sa; | |
| } | |
| return &m_non_http_sm_data->owned_client_addr.sa; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_client_src_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return &m_http_sm->t_state.client_info.src_addr.sa; | |
| } | |
| return &m_non_http_sm_data->owned_client_src_addr.sa; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_client_dst_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return &m_http_sm->t_state.client_info.dst_addr.sa; | |
| } | |
| return &m_non_http_sm_data->owned_client_dst_addr.sa; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_verified_client_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (auto txn = m_http_sm->get_ua_txn(); txn) { | |
| sockaddr const *vaddr = txn->get_verified_client_addr(); | |
| if (vaddr && ats_is_ip(vaddr)) { | |
| return vaddr; | |
| } | |
| } | |
| } | |
| return nullptr; | |
| } | |
| uint16_t | |
| TransactionLogData::get_client_port() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.effective_client_addr.host_order_port(); | |
| } | |
| return m_non_http_sm_data->m_client_port; | |
| } | |
| // ===== Server addressing ===== | |
| sockaddr const * | |
| TransactionLogData::get_server_src_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.current.server) { | |
| return &m_http_sm->t_state.current.server->src_addr.sa; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_server_dst_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.current.server) { | |
| return &m_http_sm->t_state.current.server->dst_addr.sa; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_server_info_dst_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return &m_http_sm->t_state.server_info.dst_addr.sa; | |
| } | |
| return nullptr; | |
| } | |
| const char * | |
| TransactionLogData::get_server_name() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.current.server) { | |
| return m_http_sm->t_state.current.server->name; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| // ===== Squid codes ===== | |
| SquidLogCode | |
| TransactionLogData::get_log_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.squid_codes.log_code; | |
| } | |
| return m_non_http_sm_data->m_log_code; | |
| } | |
| SquidSubcode | |
| TransactionLogData::get_subcode() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.squid_codes.subcode; | |
| } | |
| return SquidSubcode::EMPTY; | |
| } | |
| SquidHitMissCode | |
| TransactionLogData::get_hit_miss_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.squid_codes.hit_miss_code; | |
| } | |
| return m_non_http_sm_data->m_hit_miss_code; | |
| } | |
| SquidHierarchyCode | |
| TransactionLogData::get_hier_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.squid_codes.hier_code; | |
| } | |
| return m_non_http_sm_data->m_hier_code; | |
| } | |
| // ===== Byte counters ===== | |
| int64_t | |
| TransactionLogData::get_client_request_body_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_request_body_bytes; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_client_response_hdr_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_response_hdr_bytes; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_client_response_body_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_response_body_bytes; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_server_request_body_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_request_body_bytes; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_server_response_body_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_response_body_bytes; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_cache_response_body_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->cache_response_body_bytes; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_cache_response_hdr_bytes() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->cache_response_hdr_bytes; | |
| } | |
| return 0; | |
| } | |
| // ===== Transaction identifiers ===== | |
| int64_t | |
| TransactionLogData::get_sm_id() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->sm_id; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_connection_id() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_connection_id(); | |
| } | |
| return m_non_http_sm_data->m_connection_id; | |
| } | |
| int | |
| TransactionLogData::get_transaction_id() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_transaction_id(); | |
| } | |
| return m_non_http_sm_data->m_transaction_id; | |
| } | |
| int | |
| TransactionLogData::get_transaction_priority_weight() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_transaction_priority_weight(); | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_transaction_priority_dependence() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->client_transaction_priority_dependence(); | |
| } | |
| return 0; | |
| } | |
| // ===== Plugin info ===== | |
| int64_t | |
| TransactionLogData::get_plugin_id() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->plugin_id; | |
| } | |
| return 0; | |
| } | |
| const char * | |
| TransactionLogData::get_plugin_tag() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->plugin_tag; | |
| } | |
| return nullptr; | |
| } | |
| // ===== Protocol info ===== | |
| const char * | |
| TransactionLogData::get_client_protocol() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_protocol(); | |
| } | |
| return m_non_http_sm_data->owned_client_protocol_str.empty() ? nullptr : m_non_http_sm_data->owned_client_protocol_str.c_str(); | |
| } | |
| const char * | |
| TransactionLogData::get_server_protocol() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_protocol; | |
| } | |
| return nullptr; | |
| } | |
| const char * | |
| TransactionLogData::get_client_sec_protocol() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_sec_protocol(); | |
| } | |
| return nullptr; | |
| } | |
| const char * | |
| TransactionLogData::get_client_cipher_suite() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_cipher_suite(); | |
| } | |
| return nullptr; | |
| } | |
| const char * | |
| TransactionLogData::get_client_curve() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_curve(); | |
| } | |
| return nullptr; | |
| } | |
| const char * | |
| TransactionLogData::get_client_security_group() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_security_group(); | |
| } | |
| return nullptr; | |
| } | |
| int | |
| TransactionLogData::get_client_alpn_id() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_alpn_id(); | |
| } | |
| return -1; | |
| } | |
| // ===== SNI ===== | |
| const char * | |
| TransactionLogData::get_sni_server_name() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (auto txn = m_http_sm->get_ua_txn(); txn) { | |
| if (auto ssn = txn->get_proxy_ssn(); ssn) { | |
| if (auto ssl = ssn->ssl(); ssl) { | |
| return ssl->client_sni_server_name(); | |
| } | |
| } | |
| } | |
| } | |
| return nullptr; | |
| } | |
| // ===== Connection flags ===== | |
| bool | |
| TransactionLogData::get_client_tcp_reused() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_tcp_reused(); | |
| } | |
| return false; | |
| } | |
| uint64_t | |
| TransactionLogData::get_client_tls_handshake_bytes_rx() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_tls_handshake_bytes_rx(); | |
| } | |
| return 0; | |
| } | |
| uint64_t | |
| TransactionLogData::get_client_tls_handshake_bytes_tx() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_tls_handshake_bytes_tx(); | |
| } | |
| return 0; | |
| } | |
| size_t | |
| TransactionLogData::get_client_tls_early_data_len() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_tls_early_data_len(); | |
| } | |
| return 0; | |
| } | |
| bool | |
| TransactionLogData::get_client_connection_is_ssl() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_connection_is_ssl(); | |
| } | |
| return m_non_http_sm_data->m_client_connection_is_ssl; | |
| } | |
| bool | |
| TransactionLogData::get_client_ssl_reused() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_ssl_reused(); | |
| } | |
| return false; | |
| } | |
| int | |
| TransactionLogData::get_client_ssl_resumption_type() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_user_agent().get_client_ssl_resumption_type(); | |
| } | |
| return 0; | |
| } | |
| bool | |
| TransactionLogData::get_is_internal() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->is_internal; | |
| } | |
| return false; | |
| } | |
| bool | |
| TransactionLogData::get_server_connection_is_ssl() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_connection_is_ssl; | |
| } | |
| return false; | |
| } | |
| bool | |
| TransactionLogData::get_server_ssl_reused() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_ssl_reused; | |
| } | |
| return false; | |
| } | |
| int | |
| TransactionLogData::get_server_connection_provided_cert() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_connection_provided_cert; | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_client_provided_cert() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (auto txn = m_http_sm->get_ua_txn(); txn) { | |
| if (auto ssn = txn->get_proxy_ssn(); ssn) { | |
| if (auto ssl = ssn->ssl(); ssl) { | |
| return ssl->client_provided_certificate(); | |
| } | |
| } | |
| } | |
| } | |
| return 0; | |
| } | |
| // ===== Server transaction count ===== | |
| int64_t | |
| TransactionLogData::get_server_transact_count() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->server_transact_count; | |
| } | |
| return m_non_http_sm_data->m_server_transact_count; | |
| } | |
| // ===== Finish status ===== | |
| int | |
| TransactionLogData::get_client_finish_status_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return compute_client_finish_status(m_http_sm); | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_proxy_finish_status_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return compute_proxy_finish_status(m_http_sm); | |
| } | |
| return 0; | |
| } | |
| // ===== Error codes ===== | |
| void | |
| TransactionLogData::format_error_codes() const | |
| { | |
| if (m_error_codes_formatted) { | |
| return; | |
| } | |
| m_error_codes_formatted = true; | |
| ink_assert(m_http_sm != nullptr); | |
| m_http_sm->t_state.client_info.rx_error_code.str(m_client_rx_error_code, sizeof(m_client_rx_error_code)); | |
| m_http_sm->t_state.client_info.tx_error_code.str(m_client_tx_error_code, sizeof(m_client_tx_error_code)); | |
| } | |
| const char * | |
| TransactionLogData::get_client_rx_error_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| format_error_codes(); | |
| return m_client_rx_error_code; | |
| } | |
| return "-"; | |
| } | |
| const char * | |
| TransactionLogData::get_client_tx_error_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| format_error_codes(); | |
| return m_client_tx_error_code; | |
| } | |
| return "-"; | |
| } | |
| // ===== MPTCP ===== | |
| std::optional<bool> | |
| TransactionLogData::get_mptcp_state() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->mptcp_state; | |
| } | |
| return std::nullopt; | |
| } | |
| // ===== Misc transaction state ===== | |
| in_port_t | |
| TransactionLogData::get_incoming_port() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.request_data.incoming_port; | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_orig_scheme() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.orig_scheme; | |
| } | |
| return -1; | |
| } | |
| int64_t | |
| TransactionLogData::get_congestion_control_crat() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.congestion_control_crat; | |
| } | |
| return 0; | |
| } | |
| // ===== Cache state ===== | |
| int | |
| TransactionLogData::get_cache_write_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return convert_cache_write_code(m_http_sm->t_state.cache_info.write_status); | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_cache_transform_write_code() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return convert_cache_write_code(m_http_sm->t_state.cache_info.transform_write_status); | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_cache_open_read_tries() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_cache_sm().get_open_read_tries(); | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_cache_open_write_tries() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->get_cache_sm().get_open_write_tries(); | |
| } | |
| return 0; | |
| } | |
| int | |
| TransactionLogData::get_max_cache_open_write_retries() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.txn_conf->max_cache_open_write_retries; | |
| } | |
| return -1; | |
| } | |
| // ===== Retry attempts ===== | |
| int64_t | |
| TransactionLogData::get_simple_retry_attempts() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.current.simple_retry_attempts; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_unavailable_retry_attempts() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.current.unavailable_server_retry_attempts; | |
| } | |
| return 0; | |
| } | |
| int64_t | |
| TransactionLogData::get_retry_attempts_saved() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.current.retry_attempts.saved(); | |
| } | |
| return 0; | |
| } | |
| // ===== Status plugin entry name ===== | |
| std::string_view | |
| TransactionLogData::get_http_return_code_setter_name() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.http_return_code_setter_name; | |
| } | |
| return {}; | |
| } | |
| // ===== Proxy Protocol ===== | |
| int | |
| TransactionLogData::get_pp_version() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| return static_cast<int>(m_http_sm->t_state.pp_info.version); | |
| } | |
| } | |
| return 0; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_pp_src_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| return &m_http_sm->t_state.pp_info.src_addr.sa; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| sockaddr const * | |
| TransactionLogData::get_pp_dst_addr() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| return &m_http_sm->t_state.pp_info.dst_addr.sa; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| std::string_view | |
| TransactionLogData::get_pp_authority() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| if (auto authority_opt = m_http_sm->t_state.pp_info.get_tlv(PP2_TYPE_AUTHORITY); authority_opt) { | |
| return *authority_opt; | |
| } | |
| } | |
| } | |
| return {}; | |
| } | |
| std::string_view | |
| TransactionLogData::get_pp_tls_cipher() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| if (auto cipher = m_http_sm->t_state.pp_info.get_tlv_ssl_cipher(); cipher) { | |
| return *cipher; | |
| } | |
| } | |
| } | |
| return {}; | |
| } | |
| std::string_view | |
| TransactionLogData::get_pp_tls_version() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| if (auto version = m_http_sm->t_state.pp_info.get_tlv_ssl_version(); version) { | |
| return *version; | |
| } | |
| } | |
| } | |
| return {}; | |
| } | |
| std::string_view | |
| TransactionLogData::get_pp_tls_group() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| if (m_http_sm->t_state.pp_info.version != ProxyProtocolVersion::UNDEFINED) { | |
| if (auto group = m_http_sm->t_state.pp_info.get_tlv_ssl_group(); group) { | |
| return *group; | |
| } | |
| } | |
| } | |
| return {}; | |
| } | |
| // ===== Server response Transfer-Encoding ===== | |
| std::string_view | |
| TransactionLogData::get_server_response_transfer_encoding() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return m_http_sm->t_state.hdr_info.server_response_transfer_encoding; | |
| } | |
| return {}; | |
| } | |
| // ===== Fallback fields for non-HttpSM logging ===== | |
| std::string_view | |
| TransactionLogData::get_method() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return {}; | |
| } | |
| return m_non_http_sm_data->owned_method; | |
| } | |
| std::string_view | |
| TransactionLogData::get_scheme() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return {}; | |
| } | |
| return m_non_http_sm_data->owned_scheme; | |
| } | |
| std::string_view | |
| TransactionLogData::get_client_protocol_str() const | |
| { | |
| if (likely(m_http_sm != nullptr)) { | |
| return {}; | |
| } | |
| return m_non_http_sm_data->owned_client_protocol_str; | |
| } |