Audacity 3.2.0
HeadersList.cpp
Go to the documentation of this file.
1/*!********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 @file HeadersList.cpp
6 @brief Define HTTP headers list class.
7
8 Dmitry Vedenko
9 **********************************************************************/
10
11/*!********************************************************************
12
13 @class Header
14 @brief A string pair, representing HTTP header.
15
16 **********************************************************************/
17
18/*!********************************************************************
19
20 @class HeadersList
21 @brief A class, representing a list of HTTP headers.
22
23 **********************************************************************/
24
25#include "HeadersList.h"
26
27#include <algorithm>
28#include <cctype>
29
30namespace audacity
31{
32namespace network_manager
33{
34
35namespace common_headers
36{
37const std::string Accept = "Accept";
38const std::string AcceptEncoding = "Accept-Encoding";
39const std::string AcceptLanguage = "Accept-Language";
40const std::string Authorization = "Authorization";
41const std::string CacheControl = "Cache-Control";
42const std::string Connection = "Connection";
43const std::string ContentLength = "Content-Length";
44const std::string ContentType = "Content-Type";
45const std::string ContentDisposition = "Content-Disposition";
46const std::string Cookie = "Cookie";
47const std::string Host = "Host";
48const std::string Origin = "Origin";
49const std::string Referer = "Referer";
50const std::string UserAgent = "User-Agent";
51const std::string IfNoneMatch = "If-None-Match";
52const std::string IfModifiedSince = "If-Modified-Since";
53} // namespace common_headers
54
55namespace common_content_types
56{
57const std::string ApplicationJson = "application/json";
58const std::string ApplicationXml = "application/xml";
59const std::string ApplicationXWwwFormUrlencoded = "application/x-www-form-urlencoded";
60const std::string ApplicationXOctetStream = "application/x-octet-stream";
61const std::string ApplicationXGzip = "application/x-gzip";
62} // namespace common_content_types
63
64bool Header::hasSameName (const Header& header) const
65{
66 return hasSameName (header.Name);
67}
68
69bool Header::hasSameName (const std::string& name) const
70{
71 return std::equal (
72 name.begin (), name.end (),
73 Name.begin (), Name.end (),
74 [](const char leftChar, const char rightChar) {
75 return std::tolower (leftChar) == std::tolower (rightChar);
76 });
77}
78
79Header Header::Parse (const std::string& header)
80{
81 const size_t colonPosition = header.find (": ");
82
83 if (colonPosition == std::string::npos) // This can happen when we receive the first line of the response
84 return { header, std::string () };
85
86 return {
87 header.substr (0, colonPosition),
88 header.substr (colonPosition + 2)
89 };
90}
91
92void HeadersList::setHeader (const Header& header)
93{
94 setHeader (header.Name, header.Value);
95}
96
97void HeadersList::setHeader (const std::string& headerName, std::string headerValue)
98{
99 Header* item = getHeader (headerName);
100
101 if (item != nullptr)
102 item->Value = std::move (headerValue);
103 else
104 mHeaders.push_back ({ headerName, std::move (headerValue) });
105}
106
108{
109 addHeader (std::move (header.Name), std::move (header.Value));
110}
111
112void HeadersList::addHeader (std::string headerName, std::string headerValue)
113{
114 mHeaders.push_back ({ std::move (headerName), std::move (headerValue) });
115}
116
117bool HeadersList::hasHeader (const std::string& headerName) const noexcept
118{
119 return getHeader (headerName) != nullptr;
120}
121
122std::string HeadersList::getHeaderValue (const std::string& headerName) const
123{
124 const Header* header = getHeader (headerName);
125
126 if (header != nullptr)
127 return header->Value;
128
129 return {};
130}
131
132const Header* HeadersList::getHeader (size_t idx) const noexcept
133{
134 return const_cast<HeadersList*>(this)->getHeader (idx);
135}
136
137const Header* HeadersList::getHeader (const std::string& name) const noexcept
138{
139 return const_cast<HeadersList*>(this)->getHeader (name);
140}
141
142size_t HeadersList::getHeadersCount () const noexcept
143{
144 return mHeaders.size ();
145}
146
148{
149 return mHeaders.begin ();
150}
151
153{
154 return mHeaders.end ();
155}
156
158{
159 return mHeaders.begin ();
160}
161
163{
164 return mHeaders.end ();
165}
166
167Header* HeadersList::getHeader (size_t idx) noexcept
168{
169 if (idx < mHeaders.size ())
170 return &mHeaders[idx];
171
172 return nullptr;
173}
174
175Header* HeadersList::getHeader (const std::string& headerName) noexcept
176{
177 for (Header& header : mHeaders)
178 {
179 if (header.hasSameName (headerName))
180 return &header;
181 }
182
183 return nullptr;
184}
185
186}
187}
std::unique_ptr< DBConnection > Connection
Definition: DBConnection.h:132
const TranslatableString name
Definition: Distortion.cpp:76
Declare HTTP headers list class.
const Header * getHeader(size_t idx) const noexcept
void setHeader(const Header &header)
Definition: HeadersList.cpp:92
HeadersIterator begin() noexcept
size_t getHeadersCount() const noexcept
HeadersStorageType::iterator HeadersIterator
Definition: HeadersList.h:66
std::string getHeaderValue(const std::string &headerName) const
HeadersIterator end() noexcept
HeadersStorageType::const_iterator HeadersConstIterator
Definition: HeadersList.h:67
bool hasHeader(const std::string &headerName) const noexcept
constexpr size_t npos(-1)
static Header Parse(const std::string &header)
Definition: HeadersList.cpp:79
bool hasSameName(const Header &header) const
Definition: HeadersList.cpp:64