| /** | |
| 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. | |
| */ | |
| /** | |
| * @file Headers.h | |
| */ | |
| // The C++ Plugin API is deprecated in ATS 10, and will be removed in ATS 11. | |
| #pragma once | |
| #include "tscpp/api/noncopyable.h" | |
| #include <memory> | |
| #include <string> | |
| namespace atscppapi | |
| { | |
| struct HeadersState; | |
| struct HeaderFieldIteratorState; | |
| struct HeaderFieldValueIteratorState; | |
| class Request; | |
| class ClientRequest; | |
| class Response; | |
| /** | |
| * @brief A HeaderFieldName is a lightweight wrapper around a string that allows for case insensitive comparisons. | |
| * Because header field names must be case insensitive this allows easy case insensitive comparisons of names. | |
| * | |
| */ | |
| class HeaderFieldName | |
| { | |
| private: | |
| std::string name_; | |
| public: | |
| using size_type = std::string::size_type; | |
| /** | |
| * Constructor: build a new HeaderField name with the given string | |
| */ | |
| HeaderFieldName(const std::string &name); | |
| /** | |
| * std::string conversion | |
| * @return a string which is this HeaderFieldName | |
| */ | |
| operator std::string(); | |
| /** | |
| * const char * conversion | |
| * @return a const char * which is this HeaderFieldName | |
| */ | |
| operator const char *(); | |
| /** | |
| * @return the length of this HeaderFieldName | |
| */ | |
| size_type length(); | |
| /** | |
| * @return a string which is this HeaderFieldName | |
| */ | |
| std::string str(); | |
| /** | |
| * @return a const char * which points to the name of this HeaderFieldName | |
| */ | |
| const char *c_str(); | |
| /** | |
| * Case insensitive comparison of this HeaderFieldName | |
| * @return true if the two strings are equal. | |
| */ | |
| bool operator==(const char *field_name); | |
| /** | |
| * Case insensitive comparison of this HeaderFieldName | |
| * @return true if the two strings are equal. | |
| */ | |
| bool operator==(const std::string &field_name); | |
| /** | |
| * Case insensitive comparison of this HeaderFieldName | |
| * @return true if the two strings are not equal. | |
| */ | |
| bool operator!=(const char *field_name); | |
| /** | |
| * Case insensitive comparison of this HeaderFieldName | |
| * @return true if the two strings are not equal. | |
| */ | |
| bool operator!=(const std::string &field_name); | |
| }; | |
| class HeaderField; | |
| /** | |
| * @brief A header field value iterator iterates through all header fields. | |
| */ | |
| class header_field_value_iterator | |
| { | |
| private: | |
| std::unique_ptr<HeaderFieldValueIteratorState> state_; | |
| public: | |
| using iterator_category = std::forward_iterator_tag; | |
| using value_type = int; | |
| /** | |
| * Constructor for header_field_value_iterator, this shouldn't need to be used directly. | |
| * @param bufp the TSMBuffer associated with the headers | |
| * @param mloc the TSMLoc associated with the headers. | |
| * @param field_loc the TSMLoc associated with the field. | |
| * @param index the index of the value in the HeaderField | |
| * @warning This shouldn't need to be used directly! | |
| */ | |
| header_field_value_iterator(void *bufp, void *hdr_loc, void *field_loc, int index); | |
| /** | |
| * Copy Constructor for header_field_value_iterator, this shouldn't need to be used directly. | |
| * @param header_field_value_iterator an existing iterator to copy | |
| * @warning This shouldn't need to be used directly! | |
| */ | |
| header_field_value_iterator(const header_field_value_iterator &it); | |
| ~header_field_value_iterator(); | |
| /** | |
| * Dereference this iterator into a string (get the value pointed to by this iterator) | |
| * @return a string which is the value pointed to by this iterator | |
| */ | |
| std::string operator*(); | |
| /** | |
| * Advance the iterator to the next header field value | |
| * @return a reference to a the next iterator | |
| */ | |
| header_field_value_iterator &operator++(); | |
| /** | |
| * Advance the current iterator to the next header field | |
| * @return a new iterator which points to the next element | |
| */ | |
| header_field_value_iterator operator++(int); | |
| /** | |
| * Compare two iterators returning true if they are equal | |
| * @return true if two iterators are equal | |
| */ | |
| bool operator==(const header_field_value_iterator &rhs) const; | |
| /** | |
| * Compare two iterators returning true if they are NOT equal | |
| * @return true if two iterators are not equal. | |
| */ | |
| bool operator!=(const header_field_value_iterator &rhs) const; | |
| friend class HeaderField; | |
| }; | |
| /** | |
| * @brief A header field iterator is an iterator that dereferences to a HeaderField. | |
| */ | |
| class header_field_iterator | |
| { | |
| private: | |
| std::unique_ptr<HeaderFieldIteratorState> state_; | |
| header_field_iterator(void *hdr_buf, void *hdr_loc, void *field_loc); | |
| public: | |
| using iterator_category = std::forward_iterator_tag; | |
| using value_type = int; | |
| ~header_field_iterator(); | |
| /** | |
| * Copy Constructor for header_field_iterator, this shouldn't need to be used directly. | |
| * @param header_field_iterator: for constructing the iterator. | |
| * @warning This shouldn't need to be used directly! | |
| */ | |
| header_field_iterator(const header_field_iterator &it); | |
| header_field_iterator &operator=(const header_field_iterator &rhs); | |
| /** | |
| * Advance the iterator to the next header field | |
| * @return a reference to a the next iterator | |
| */ | |
| header_field_iterator &operator++(); | |
| /** | |
| * Advance the current iterator to the next header field | |
| * @return a new iterator which points to the next element | |
| */ | |
| header_field_iterator operator++(int); | |
| /** | |
| * Advance the iterator to the next header field with the same name | |
| * @return a reference to a the next iterator | |
| */ | |
| header_field_iterator &nextDup(); | |
| /** | |
| * Comparison operator, compare two iterators | |
| * @return true if the two iterators point to the same HeaderField | |
| */ | |
| bool operator==(const header_field_iterator &rhs) const; | |
| /** | |
| * Inequality Operator, compare two iterators | |
| * @return false if the two iterators are the same. | |
| */ | |
| bool operator!=(const header_field_iterator &rhs) const; | |
| /** | |
| * Dereference an iterator | |
| * @return a HeaderField pointed to by this iterator | |
| */ | |
| HeaderField operator*(); | |
| friend class HeaderField; | |
| friend class Headers; | |
| }; | |
| /** | |
| * @brief A HeaderField is a class that contains the header field name and all of the values. | |
| * @note You may have several HeaderFields with the same name for a given set of Headers. | |
| */ | |
| class HeaderField | |
| { | |
| private: | |
| header_field_iterator iter_; | |
| HeaderField(const header_field_iterator &iter) : iter_(iter) {} | |
| public: | |
| using size_type = unsigned int; | |
| using iterator = header_field_value_iterator; | |
| ~HeaderField(); | |
| /** | |
| * Get the size of the HeaderField, this is the number of values associated with the header field. | |
| * @return the number of values in this HeaderField. | |
| */ | |
| size_type size() const; | |
| /** | |
| * Returns an iterator to the start of the values | |
| * @return an iterator point to the start of this header field's values | |
| */ | |
| iterator begin(); | |
| /** | |
| * Returns an iterator to the end of this header field's values. | |
| * @return an iterator that points beyond the last element of the header field's values. | |
| */ | |
| iterator end(); | |
| /** | |
| * Get the name of this HeaderField | |
| * @return a HeaderFieldName object. | |
| * @see HeaderFieldName which is a thin wrapper around a string to allow for case insensitive comparisons. | |
| */ | |
| HeaderFieldName name() const; | |
| /** | |
| * Join all the values of this HeaderField into a single string separated by the join string. | |
| * @param an optional join string (defaults to ",") | |
| * @return a string which is all of the joined values of this HeaderField | |
| */ | |
| std::string values(const char *join = ","); | |
| /** | |
| * Join all the values of this HeaderField into a single string separated by the join string. | |
| * @param a join string | |
| * @return a string which is all of the joined values of this HeaderField | |
| */ | |
| std::string values(const std::string &join); | |
| /** | |
| * Join all the values of this HeaderField into a single string separated by the join string. | |
| * @param a optional join character | |
| * @return a string which is all of the joined values of this HeaderField | |
| */ | |
| std::string values(const char join); | |
| /** | |
| * Check if this HeaderField is empty (no values). | |
| * @return a boolean value representing whether or not the header field has values. | |
| */ | |
| bool empty(); | |
| /** | |
| * Remove all values from this HeaderField | |
| * @return true if the clear succeeds. | |
| */ | |
| bool clear(); | |
| /** | |
| * Remove a single value from this HeaderField which is pointed to by the given iterator | |
| * @param an iterator which points to a single HeaderField value. | |
| * @return true if the header value was successfully erased. | |
| */ | |
| bool erase(const iterator &it); | |
| /** | |
| * Append a value or a separated list of values to this HeaderField | |
| * @param a string containing the value(s). | |
| * @return true if the values was appended. | |
| */ | |
| bool append(const std::string &value); | |
| /** | |
| * Append a value or a separated list of values to this HeaderField | |
| * @param a string containing the value. | |
| * @param the length of the value that is being appended. | |
| * @return true if the values was appended. | |
| */ | |
| bool append(const char *value, int length = -1); | |
| /** | |
| * Change the name of this HeaderField to the given key. | |
| * @param string - the new name of the header field | |
| * @return true if the header field name was successfully changed. | |
| */ | |
| bool setName(const std::string &str); | |
| /** | |
| * Compares the name of the header field only (not the values). | |
| * @note This is a case insensitive comparison. | |
| * @return true if the name is equal (case insensitive comparison). | |
| */ | |
| bool operator==(const char *field_name) const; | |
| /** Compares the name of the header field only (not the values). | |
| * @note This is a case insensitive comparison. | |
| * @return true if the name is equal (case insensitive comparison). | |
| */ | |
| bool operator==(const std::string &field_name) const; | |
| /** Compares the name of the header field only (not the values). | |
| * @note This is a case insensitive comparison. | |
| * @return true if the name is NOT equal (case insensitive comparison). | |
| */ | |
| bool operator!=(const char *field_name) const; | |
| /** Compares the name of the header field only (not the values). | |
| * @note This is a case insensitive comparison. | |
| * @return true if the name is NOT equal (case insensitive comparison). | |
| */ | |
| bool operator!=(const std::string &field_name) const; | |
| /** | |
| * Set the VALUES of the header field to the given value string | |
| * @param string - the values to set on the current header field | |
| * @return true if the value is successfully changed. | |
| */ | |
| bool operator=(const std::string &field_value); | |
| /** | |
| * Set the VALUES of the header field to the given value string | |
| * @param the values to set on the current header field | |
| * @return true if the value is successfully changed. | |
| */ | |
| bool operator=(const char *field_value); | |
| /** | |
| * Get the index value from this HeaderField | |
| * @param the index to retrieve a copy of | |
| * @return a copy of the string which is the index^th value in this HeaderField | |
| * @note as currently written this returns an immutable string, it will NOT allow you to | |
| * change the value. | |
| */ | |
| std::string operator[](const int index); | |
| /** | |
| * Get a string representing all the header field's values | |
| * @return a string representation of all the header fields | |
| */ | |
| friend std::ostream &operator<<(std::ostream &os, HeaderField &obj); | |
| /** | |
| * Get a string representing all the header field's values. | |
| * @return a string representation of all the header fields | |
| */ | |
| std::string str(); | |
| friend class Headers; | |
| friend class header_field_iterator; | |
| }; | |
| /** | |
| * @brief Encapsulates the headers portion of a request or response. | |
| */ | |
| class Headers : noncopyable | |
| { | |
| public: | |
| /** | |
| * Constructor for Headers. This creates a "detached" headers, i.e., not tied to any transaction. | |
| */ | |
| Headers(); | |
| /** | |
| * Constructor for Headers, this shouldn't be used directly unless you're trying to mix the C++ and C apis. | |
| * @param bufp the TSMBuffer associated with the headers | |
| * @param mloc the TSMLoc associated with the headers. | |
| * @warning This should only be used if you're mixing the C++ and C apis, it will be constructed automatically if using only the | |
| * C++ api. | |
| */ | |
| Headers(void *bufp, void *mloc); | |
| /** | |
| * Context Values are a way to share data between plugins, the key is always a string | |
| * and the value can be a std::shared_ptr to any type that extends ContextValue. | |
| * @param bufp the TSMBuffer associated with the headers | |
| * @param mloc the TSMLoc associated with the headers. | |
| * @warning This should only be used if you're mixing the C++ and C apis. | |
| */ | |
| void reset(void *bufp, void *mloc); | |
| /** | |
| * Check if the header class has been initialized. If you're only using the C++ api then this | |
| * should always return true. | |
| * @return a boolean value representing whether or not the Headers have been initialized.. | |
| */ | |
| bool isInitialized() const; | |
| using size_type = unsigned int; | |
| using iterator = header_field_iterator; | |
| /** | |
| * Check if the headers are empty | |
| * @return a boolean value representing whether or not the Headers are empty | |
| */ | |
| bool empty(); | |
| /** | |
| * Get the size of the headers (the number of HeaderFields). | |
| * @return the number of HeaderFields | |
| */ | |
| size_type size() const; | |
| /** | |
| * Get the size of the headers (the number of HeaderFields). | |
| * @return the number of HeaderFields | |
| */ | |
| size_type lengthBytes() const; | |
| /** | |
| * Returns an iterator to the start of the HeaderFields. | |
| * @return an iterator point to the start of the header fields. | |
| */ | |
| iterator begin(); | |
| /** | |
| * Returns an iterator to the end of the HeaderFields (beyond the last element). | |
| * @return an iterator that points beyond the last element in the header fields. | |
| */ | |
| iterator end(); | |
| /** | |
| * Clears all headers. | |
| * @return true if the headers were successfully cleared. | |
| */ | |
| bool clear(); | |
| /** | |
| * Erase a single header field pointed to by an iterator | |
| * @param an iterator pointing to a header field. | |
| * @return true if the header field pointed to by the iterator was erased. | |
| */ | |
| bool erase(const iterator &it); | |
| /** | |
| * Erase all headers whose name matches key (this is a case insensitive match). | |
| * @param the name of the header fields to erase | |
| * @return the number of elements erased that matched the key | |
| */ | |
| size_type erase(const std::string &key); | |
| /** | |
| * Erase all headers whose name matches key (this is a case insensitive match). | |
| * @param the name of the header fields to erase | |
| * @param the length of the key (optional). | |
| * @return the number of elements erased that matched the key | |
| */ | |
| size_type erase(const char *key, int length = -1); | |
| /** | |
| * Count all headers whose name matches key (this is a case insensitive match). | |
| * @param the name of the header fields to erase | |
| * @param the length of the key (optional). | |
| * @return the number of elements erased that matched the key | |
| */ | |
| size_type count(const char *key, int length = -1); | |
| /** | |
| * Count all headers whose name matches key (this is a case insensitive match). | |
| * @param the name of the header fields to count | |
| * @return the number of elements whose name is key. | |
| */ | |
| size_type count(const std::string &key); | |
| /** | |
| * Join all headers whos name is key with the optionally specified join string | |
| * @param the name of the headers to join into a single string | |
| * @param an optional join string (defaults to ",") | |
| * @return a string which is all of the joined values of headers matching key. | |
| */ | |
| std::string values(const std::string &key, const char *join = ","); | |
| /** | |
| * Join all headers whos name is key with the optionally specified join string | |
| * @param the name of the headers to join into a single string | |
| * @param the string to join the fields with | |
| * @return a string which is all of the joined values of headers matching key. | |
| */ | |
| std::string values(const std::string &key, const std::string &join); | |
| /** | |
| * Join all headers whos name is key with the optionally specified join character | |
| * @param the name of the headers to join into a single string | |
| * @param the join character. | |
| * @return a string which is all of the joined values of headers matching key. | |
| */ | |
| std::string values(const std::string &key, const char join); | |
| /** | |
| * Returns the value at given position of header with given name | |
| * @param name of header | |
| * @param position of value | |
| * @return value | |
| */ | |
| std::string value(const std::string &key, size_type index = 0); | |
| /** | |
| * Returns an iterator to the first HeaderField with the name key. | |
| * @param key the name of first header field ot find. | |
| * @return an iterator that points to the first matching header field with name key. | |
| */ | |
| iterator find(const std::string &key); | |
| /** | |
| * Returns an iterator to the first HeaderField with the name key. | |
| * @param key the name of first header field ot find. | |
| * @param the length of the key specified (optional). | |
| * @return an iterator that points to the first matching header field with name key. | |
| */ | |
| iterator find(const char *key, int length = -1); | |
| /** | |
| * Append a HeaderField. | |
| * @param key the name of the header field to append | |
| * @param value the value of the header field to append | |
| * @return an iterator to the appended header field or the end() iterator if append fails. | |
| */ | |
| iterator append(const std::string &key, const std::string &value); | |
| /** | |
| * Erase all headers with name specified by key and then re-create the header with the specified values. | |
| * @param key the name of the header field to erased and re-created. | |
| * @param value the value of the header field to set. | |
| * @return an iterator to the new header field or the end() iterator if append fails. | |
| */ | |
| iterator set(const std::string &key, const std::string &value); | |
| /** | |
| * Set the header field values to the value given, the header field will be created | |
| * if it does not already exist. | |
| * @param key the name of the header field whose value to set. | |
| * @return an iterator to the new header field or the end() iterator if append fails. | |
| * @warning This will create a header field with the given name, thus it should not be | |
| * used to check for the existence of a header, use count() or find() instead. | |
| */ | |
| HeaderField operator[](const std::string &key); | |
| /** | |
| * Get a human-readable/log-friendly string representing all the header fields. | |
| * @return a string representation of all the header fields | |
| */ | |
| std::string str(); | |
| /** | |
| * Get a string that can be put on the wire | |
| * @return a string representation of all the header fields | |
| */ | |
| std::string wireStr(); | |
| friend std::ostream &operator<<(std::ostream &os, Headers &obj); | |
| ~Headers(); | |
| private: | |
| std::unique_ptr<HeadersState> state_; | |
| friend class Request; | |
| friend class ClientRequest; | |
| friend class Response; | |
| }; | |
| } // namespace atscppapi |