27#include <unordered_map>
41 std::unordered_map<std::string, std::string>
headers;
42 std::unordered_map<std::string, std::string>
params;
51 [[nodiscard]] std::string
param(
const std::string &name,
const std::string &default_value =
"")
const {
52 auto it =
params.find(name);
53 return (it !=
params.end()) ? it->second : default_value;
61 [[nodiscard]]
bool hasParam(
const std::string &name)
const {
71 [[nodiscard]]
int paramInt(
const std::string &name,
int default_value = 0)
const {
72 auto it =
params.find(name);
76 return std::stoi(it->second);
88 [[nodiscard]] std::string
header(
const std::string &name,
const std::string &default_value =
"")
const;
97 std::unordered_map<std::string, std::string>
headers;
101 HttpResponse(
int code, std::string
text, std::string content_type, std::string response_body)
103 headers[
"Content-Type"] = std::move(content_type);
112 return ok(
"application/json",
body);
116 return ok(
"text/html; charset=utf-8",
body);
120 return ok(
"text/plain",
body);
132 return HttpResponse(500,
"Internal Server Error",
"application/json",
137 return HttpResponse(204,
"No Content",
"text/plain",
"");
151 [[nodiscard]] std::string
serialize()
const;
233 std::vector<Route> routes_;
236 std::atomic<bool> running_{
false};
237 std::thread server_thread_;
239 int server_socket_ = -1;
240 std::string last_error_;
243 void handleClient(
int client_socket);
244 bool parseRequest(
const std::string &raw, HttpRequest &request);
245 void parseQueryString(
const std::string &query, std::unordered_map<std::string, std::string> ¶ms);
246 std::string urlDecode(
const std::string &str);
247 RouteHandler findHandler(
const std::string &method,
const std::string &path);
Simple single-threaded HTTP server.
uint16_t port() const
Get the port the server is listening on.
void addRoute(const std::string &method, const std::string &path, RouteHandler handler)
Add a route handler.
void setDefaultHandler(RouteHandler handler)
Set a default handler for unmatched routes.
HttpServer(const HttpServer &)=delete
bool processOneRequest()
Process one request (blocking)
HttpServer & operator=(const HttpServer &)=delete
bool start(uint16_t port)
Start the server.
const std::string & lastError() const
Get the last error message.
void stop()
Stop the server.
bool isRunning() const
Check if server is running.
Minimal JSON serialization helpers (header-only)
std::string escape(const std::string &str)
Escape a string for JSON output.
std::function< HttpResponse(const HttpRequest &)> RouteHandler
Route handler function type.
std::unordered_map< std::string, std::string > params
Parsed query parameters.
std::string query_string
Query string (after ?)
int paramInt(const std::string &name, int default_value=0) const
Get a query parameter as integer.
std::string path
Request path (without query string)
std::unordered_map< std::string, std::string > headers
Request headers.
std::string body
Request body.
std::string param(const std::string &name, const std::string &default_value="") const
Get a query parameter value.
std::string header(const std::string &name, const std::string &default_value="") const
Get a header value.
std::string method
GET, POST, etc.
bool hasParam(const std::string &name) const
Check if a query parameter exists (flag-style, like &break)
std::unordered_map< std::string, std::string > headers
static HttpResponse text(const std::string &body)
HttpResponse & setHeader(const std::string &name, const std::string &value)
Set a header.
std::string serialize() const
Serialize response to HTTP/1.1 format.
static HttpResponse json(const std::string &body)
static HttpResponse noContent()
HttpResponse(int code, std::string text, std::string content_type, std::string response_body)
static HttpResponse ok(const std::string &content_type, const std::string &body)
static HttpResponse html(const std::string &body)
static HttpResponse notFound(const std::string &message="Not Found")
static HttpResponse serverError(const std::string &message="Internal Server Error")
static HttpResponse badRequest(const std::string &message="Bad Request")