| /** @file |
| |
| Traffic Dump data specific to transactions. |
| |
| @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. |
| */ |
| |
| #pragma once |
| |
| #include <string> |
| #include <string_view> |
| |
| #include "ts/ts.h" |
| |
| #include "sensitive_fields.h" |
| |
| namespace traffic_dump |
| { |
| /** The information associated with an single transaction. |
| * |
| * This class is responsible for containing the members associated with a |
| * particular transaction and defines the transaction handler callback. |
| */ |
| class TransactionData |
| { |
| private: |
| /// The TSHttpTxn of the associated HTTP transaction. |
| TSHttpTxn _txnp = nullptr; |
| |
| /// The HTTP version in the client-side protocol stack or empty string |
| /// if it was not specified there. |
| std::string _http_version_from_client_stack; |
| |
| /** The string for the JSON content of this transaction. */ |
| std::string _txn_json; |
| |
| /** The client-response body bytes, if dump_body is true. */ |
| std::string _response_body; |
| |
| /** The '"protocol" node for this transaction's server-side connection. */ |
| std::string _server_protocol_description; |
| |
| // The index to be used for the TS API for storing this TransactionData on a |
| // per-transaction basis. |
| static int transaction_arg_index; |
| |
| /// The set of fields, default and user-specified, that are sensitive and |
| /// whose values will be replaced with auto-generated generic content. |
| static sensitive_fields_t sensitive_fields; |
| |
| /// Whether the user configured the dumping of body content. |
| static bool _dump_body; |
| |
| public: |
| /** Initialize TransactionData, using the provided sensitive fields. |
| * |
| * @param[in] dump_body Whether to dump body content. |
| * |
| * @param[in] sensitive_fields_t The HTTP fields considered to have sensitive |
| * data. |
| * |
| * @return True if initialization is successful, false otherwise. |
| */ |
| static bool init(bool dump_body, sensitive_fields_t &&sensitive_fields); |
| |
| /** Initialize TransactionData, using default sensitive fields. |
| * |
| * @param[in] dump_body Whether to dump body content. |
| * |
| * @return True if initialization is successful, false otherwise. |
| */ |
| static bool init(bool dump_body); |
| |
| /** Read the txn information from TSMBuffer and write the header information. |
| * This function does not write the content node. |
| * |
| * @param[in] http_version An optional specification for the HTTP "version" |
| * node. |
| */ |
| std::string write_message_node_no_content(TSMBuffer &buffer, TSMLoc &hdr_loc, std::string_view http_version = ""); |
| |
| /** Read the txn information from TSMBuffer and write the header information including |
| * the content node describing the body characteristics. |
| * |
| * @param[in] num_body_bytes The number of body bytes to specify in the content node. |
| * @param[in] http_version An optional specification for the HTTP "version" |
| * node. |
| */ |
| std::string write_message_node(TSMBuffer &buffer, TSMLoc &hdr_loc, int64_t num_body_bytes, std::string_view http_version = ""); |
| |
| /** Read the txn information from TSMBuffer and write the header information including |
| * the content node containing the provided body. |
| * |
| * @param[in] body The body bytes to place in the content node. |
| * @param[in] http_version An optional specification for the HTTP "version" |
| * node. |
| */ |
| std::string write_message_node(TSMBuffer &buffer, TSMLoc &hdr_loc, std::string_view body, std::string_view http_version = ""); |
| |
| /// The handler callback for transaction events. |
| static int global_transaction_handler(TSCont contp, TSEvent event, void *edata); |
| |
| private: |
| /** Common logic for the init overloads. |
| * |
| * @param[in] dump_body Whether the user configured the dumping of body |
| * content. |
| * |
| * @return True if initialization is successful, false otherwise. |
| */ |
| static bool init_helper(bool dump_body); |
| |
| /** Initialize the generic sensitive field to be dumped. This is used instead |
| * of the sensitive field values seen on the wire. |
| */ |
| static void initialize_default_sensitive_field(); |
| |
| /** Return a separated string representing the HTTP fields considered sensitive. |
| * |
| * @return A comma-separated string representing the sensitive HTTP fields. |
| */ |
| static std::string get_sensitive_field_description(); |
| |
| /** Construct a TransactionData object. |
| * |
| * Note that this constructor is private since only the global handler |
| * creates these at the moment. |
| * |
| * @param[in] txnp The TSHttpTxn for the associated HTTP transaction. |
| * |
| * @param[in] http_version_from_client_stack The HTTP version as specified in |
| * the protocol stack, or empty string if no so specified. |
| */ |
| TransactionData(TSHttpTxn txnp, std::string_view http_version_from_client_stack); |
| |
| /** Retrieve the response body from the transaction. |
| * |
| * @param[in] txnp The transaction from which to retrieve the response body. |
| * |
| * @return The response body string. |
| */ |
| static std::string response_body_get(TSHttpTxn txnp); |
| |
| /** The callback for gathering response body data. |
| * |
| * @note This is only called if the user enabled dump_body. |
| */ |
| static int response_buffer_handler(TSCont contp, TSEvent event, void *edata); |
| |
| /** Inspect the field to see whether it is sensitive and return a generic value |
| * of equal size to the original if it is. |
| * |
| * @param[in] name The field name to inspect. |
| * @param[in] original_value The field value to inspect. |
| * |
| * @return The value traffic_dump should dump for the given field. |
| */ |
| std::string_view replace_sensitive_fields(std::string_view name, std::string_view original_value); |
| |
| /// Write the content JSON node for an HTTP message. |
| // |
| /// "content" |
| /// "encoding" |
| /// "size" |
| std::string write_content_node(int64_t num_body_bytes); |
| |
| /// Write the content JSON node for an HTTP message. |
| // |
| /// "content" |
| /// "encoding" |
| /// "size" |
| /// "data" |
| std::string write_content_node(std::string_view body); |
| |
| /** Remove the scheme prefix from the url. |
| * |
| * @return The view without the scheme prefix. |
| */ |
| std::string_view remove_scheme_prefix(std::string_view url); |
| |
| /** Write the "client-request" node to _txn_json. |
| * |
| * Note that the "content" node is not written with this function, so it will |
| * have to be written later. |
| */ |
| void write_client_request_node_no_content(TSMBuffer &buffer, TSMLoc &hdr_loc); |
| |
| /// Write the "proxy-request" node to _txn_json. |
| void write_proxy_request_node(TSMBuffer &buffer, TSMLoc &hdr_loc); |
| |
| /// Write the "server-response" node to _txn_json. |
| void write_server_response_node(TSMBuffer &buffer, TSMLoc &hdr_loc); |
| |
| /// Write the "proxy-response" node to _txn_json. |
| void write_proxy_response_node(TSMBuffer &buffer, TSMLoc &hdr_loc); |
| }; |
| |
| } // namespace traffic_dump |