Files
firecgi/request.h
2019-05-09 23:04:04 -07:00

60 lines
1.3 KiB
C++

#pragma once
#include <mutex>
#include <unordered_map>
#include "firebuf/buffer.h"
#include "parse.h"
namespace firecgi {
class Connection;
class Request {
public:
Request(Connection *conn);
void NewRequest(uint16_t request_id);
uint16_t RequestId();
void AddParam(const std::string_view& key, const std::string_view& value);
void SetBody(const std::string_view& in);
const std::string_view& GetParam(const std::string& key);
const std::string_view& GetBody();
void WriteHeader(const std::string_view& name, const std::string_view& value);
void WriteBody(const std::string_view& body);
[[nodiscard]] bool Flush();
bool End();
template<typename...Args>
void WriteMany(const std::string_view& first, Args... more);
private:
Header OutputHeader();
iovec OutputVec();
void WriteBodyLocked(const std::string_view& body);
Connection *conn_;
uint16_t request_id_ = 0;
std::unordered_map<std::string_view, std::string_view> params_;
std::string_view body_;
firebuf::Buffer out_buf_;
bool body_written_;
std::mutex output_mu_;
};
template<typename...Args>
void Request::WriteMany(const std::string_view& first, Args... more) {
std::lock_guard<std::mutex> l(output_mu_);
WriteBodyLocked(first);
WriteMany(std::forward(more)...);
}
} // namespace firecgi