added http server

This commit is contained in:
Astazium 2026-09-22 02:13:01 +03:00
parent 5ecbeeda7e
commit 5720bd7094
9 changed files with 1008 additions and 32 deletions

View file

@ -16,6 +16,7 @@ enum NetworkEventType {
DATAGRAM,
RESPONSE,
CONNECTION_ERROR,
HTTP_REQUEST,
};
struct ConnectionEventDto {
@ -45,11 +46,17 @@ struct NetworkDatagramEventDto {
std::vector<char> buffer;
};
struct HttpRequestEventDto {
u64id_t server;
network::HttpServerRequest request;
};
struct NetworkEvent {
using Payload = std::variant<
ConnectionEventDto,
ResponseEventDto,
NetworkDatagramEventDto
NetworkDatagramEventDto,
HttpRequestEventDto
>;
NetworkEventType type;
@ -346,6 +353,43 @@ static int l_open_udp(lua::State* L, network::Network& network) {
return lua::pushinteger(L, id);
}
static int l_http_open(lua::State* L, network::Network& network) {
int port = lua::tointeger(L, 1);
long responseTimeoutMs = lua::tointeger(L, 2);
u64id_t id = network.openHttpServer(port, [](u64id_t sid, network::HttpServerRequest request) {
push_event(NetworkEvent(
HTTP_REQUEST,
HttpRequestEventDto {sid, std::move(request)}
));
}, responseTimeoutMs);
return lua::pushinteger(L, id);
}
static int l_http_respond(lua::State* L, network::Network& network) {
u64id_t serverId = lua::tointeger(L, 1);
u64id_t requestId = lua::tointeger(L, 2);
network::HttpServerResponse response;
response.status = lua::tointeger(L, 3);
response.headers = read_headers(L, 4);
if (lua::type(L, 5) == LUA_TCDATA) {
response.body = lua::bytearray_as_string(L, 5);
} else if (lua::isstring(L, 5)) {
response.body = lua::require_lstring(L, 5);
}
if (auto server = network.getServer(serverId, false)) {
if (server->getTransportType() != network::TransportType::HTTP)
throw std::runtime_error("the server must work on HTTP transport");
dynamic_cast<network::HttpServer*>(server)->respond(
requestId, std::move(response)
);
}
return 0;
}
static int l_is_alive(lua::State* L, network::Network& network) {
u64id_t id = lua::tointeger(L, 1);
if (auto connection = network.getConnection(id, false)) {
@ -529,6 +573,45 @@ static int l_pull_events(lua::State* L) {
lua::rawseti(L, 4);
break;
}
case HTTP_REQUEST: {
const auto& dto = std::get<HttpRequestEventDto>(event.payload);
const auto& req = dto.request;
lua::pushinteger(L, event.type);
lua::rawseti(L, 1);
lua::pushinteger(L, dto.server);
lua::rawseti(L, 2);
lua::pushinteger(L, req.requestId);
lua::rawseti(L, 3);
lua::pushlstring(L, req.method);
lua::rawseti(L, 4);
lua::pushlstring(L, req.path);
lua::rawseti(L, 5);
lua::pushlstring(L, req.query);
lua::rawseti(L, 6);
lua::createtable(L, req.headers.size(), 0);
for (size_t j = 0; j < req.headers.size(); j++) {
lua::pushlstring(L, req.headers[j]);
lua::rawseti(L, j + 1);
}
lua::rawseti(L, 7);
lua::pushlstring(L, req.body);
lua::rawseti(L, 8);
lua::pushlstring(L, req.remoteAddr);
lua::rawseti(L, 9);
lua::pushinteger(L, req.remotePort);
lua::rawseti(L, 10);
break;
}
}
lua::rawseti(L, i + 1);
}
@ -572,6 +655,8 @@ const luaL_Reg networklib[] = {
{"__pull_events", lua::wrap<l_pull_events>},
{"__open_tcp", wrap<l_open_tcp>},
{"__open_udp", wrap<l_open_udp>},
{"__http_open", wrap<l_http_open>},
{"__http_respond", wrap<l_http_respond>},
{"__closeserver", wrap<l_closeserver>},
{"__udp_server_send_to", wrap<l_udp_server_send_to>},
{"__connect_tcp", wrap<l_connect_tcp>},