30 size_t resultSize = 0;
39 result.reserve(resultSize);
61 _HTTPVersion(fullHTTPVersion),
64 if (availableHTTPVersions.find(fullHTTPVersion) == availableHTTPVersions.end())
66 throw runtime_error(
"Wrong HTTP version");
135 if (method !=
"CONNECT")
137 if (
size_t queryStart =
parameters.find(
'?'); queryStart != string::npos)
151 if (!_parameters.starts_with(
'/'))
153 _parameters.insert(_parameters.begin(),
'/');
173 _responseCode = format(
"{} {}", code, responseMessage);
189 if (availableHTTPVersions.find(_HTTPVersion) == availableHTTPVersions.end())
191 throw runtime_error(
"Wrong HTTP version");
199 _chunks.reserve(
chunks.size());
201 copy(
chunks.begin(),
chunks.end(), back_inserter(_chunks));
208 _chunks.reserve(
chunks.size());
210 move(
chunks.begin(),
chunks.end(), back_inserter(_chunks));
217 _chunks.emplace_back(
chunk);
222 string HTTPBuilder::build(string_view data,
const unordered_map<string, string>& additionalHeaders)
const
225 unordered_map<string, string> buildHeaders(additionalHeaders);
229 buildHeaders[
"Content-Length"] = to_string(data.size());
231 else if (_chunks.size())
233 buildHeaders[
"Transfer-Encoding"] =
"chunked";
238 result = format(
"{} {}{}{}", _HTTPVersion, _responseCode,
HTTPParser::crlf, _headers);
242 result = method +
' ';
244 if (_parameters.empty() && method !=
"CONNECT")
249 result += format(
"{} {}{}{}", _parameters, _HTTPVersion,
HTTPParser::crlf, _headers);
252 for (
const auto& [header, value] : buildHeaders)
263 else if (_chunks.size())
271 string HTTPBuilder::build(
const json::JSONBuilder& builder, unordered_map<string, string> additionalHeaders)
const
273 additionalHeaders[
"Content-Type"] =
"application/json";
275 return this->
build(builder.build(), additionalHeaders);
278 string HTTPBuilder::build(
const unordered_map<string, string>& urlEncoded, unordered_map<string, string> additionalHeaders)
const
282 for (
const auto& [key, value] : urlEncoded)
289 additionalHeaders[
"Content-Type"] =
"application/x-www-form-urlencoded";
291 return this->
build(body, additionalHeaders);
298 _responseCode.clear();
306 _partialChunks =
true;
313 return outputStream << builder.
build();