19 std::string HttpBuilder::getChunks(
const std::vector<std::string>& chunks,
bool partialChunks,
bool preCalculateSize)
25 size_t resultSize = 0;
27 for (
const std::string& chunk : chunks)
29 resultSize += std::format(
"{:x}", chunk.size()).size() + constants::crlf.size() + chunk.size() + constants::crlf.size();
32 resultSize += 1 + constants::crlf.size();
34 result.reserve(resultSize);
37 for (
const std::string& chunk : chunks)
39 result += HttpBuilder::getChunk(chunk);
44 result += HttpBuilder::getChunk({});
50 std::string HttpBuilder::getChunk(std::string_view chunk)
52 return std::format(
"{:x}{}{}{}", chunk.size(), constants::crlf, chunk, constants::crlf);
55 HttpBuilder::HttpBuilder(std::string_view fullHTTPVersion) :
56 _HTTPVersion(fullHTTPVersion),
59 if (availableHTTPVersions.find(_HTTPVersion) == availableHTTPVersions.end())
61 throw std::runtime_error(std::format(
"HTTP version: {} not supported", _HTTPVersion));
65 HttpBuilder& HttpBuilder::getRequest()
72 HttpBuilder& HttpBuilder::postRequest()
79 HttpBuilder& HttpBuilder::putRequest()
86 HttpBuilder& HttpBuilder::headRequest()
93 HttpBuilder& HttpBuilder::optionsRequest()
100 HttpBuilder& HttpBuilder::deleteRequest()
107 HttpBuilder& HttpBuilder::connectRequest()
114 HttpBuilder& HttpBuilder::traceRequest()
121 HttpBuilder& HttpBuilder::patchRequest()
128 HttpBuilder& HttpBuilder::parameters(std::string_view parameters)
130 if (method !=
"CONNECT")
132 if (
size_t queryStart = parameters.find(
'?'); queryStart != std::string::npos)
134 _parameters = std::format
137 std::string_view(parameters.begin(), parameters.begin() + queryStart + 1),
138 std::string_view(parameters.begin() + queryStart + 1, parameters.end())
143 _parameters = parameters;
146 if (!_parameters.starts_with(
'/'))
148 _parameters.insert(_parameters.begin(),
'/');
153 _parameters = parameters;
159 HttpBuilder& HttpBuilder::responseCode(ResponseCodes code)
161 _responseCode = format(
"{} {}",
static_cast<int>(code), getMessageFromCode(code));
166 HttpBuilder& HttpBuilder::responseCode(
int code, std::string_view responseMessage)
168 _responseCode = format(
"{} {}", code, responseMessage);
173 HttpBuilder& HttpBuilder::HTTPVersion(std::string_view HTTPVersion)
175 if (HTTPVersion.find(
"HTTP") == std::string::npos)
177 _HTTPVersion = HTTPVersion;
181 _HTTPVersion = std::format(
"HTTP/{}", HTTPVersion);
184 if (availableHTTPVersions.find(_HTTPVersion) == availableHTTPVersions.end())
186 throw std::runtime_error(std::format(
"HTTP version: {} not supported", _HTTPVersion));
192 HttpBuilder& HttpBuilder::chunks(
const std::vector<std::string>& chunks)
194 _chunks.reserve(chunks.size());
196 copy(chunks.begin(), chunks.end(), back_inserter(_chunks));
201 HttpBuilder& HttpBuilder::chunks(std::vector<std::string>&& chunks)
203 _chunks.reserve(chunks.size());
205 move(chunks.begin(), chunks.end(), back_inserter(_chunks));
210 HttpBuilder& HttpBuilder::chunk(std::string_view chunk)
212 _chunks.emplace_back(chunk);
217 HttpBuilder& HttpBuilder::clear()
221 _responseCode.clear();
227 HttpBuilder& HttpBuilder::partialChunks()
229 _partialChunks =
true;
234 std::ostream&
operator << (std::ostream& outputStream,
const HttpBuilder& builder)
236 return outputStream << builder.build();