Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
SC::HttpServer Struct Reference

Async Http server. More...

#include <HttpServer.h>

Classes

struct  Memory
 

Public Member Functions

Result start (Memory &memory)
 Starts the http server.
 
size_t getNumClients () const
 
bool canAcceptMoreClients () const
 
bool allocateClient (size_t &idx)
 
bool deallocateClient (HttpServerClient &client)
 

Public Attributes

Function< void(HttpRequest &, HttpResponse &)> onRequest
 Called after enough data from a newly connected client has arrived, causing all headers to be parsed.
 
Span< HttpServerClientclients
 
uint32_t maxHeaderSize = 8 * 1024
 

Detailed Description

Async Http server.

Usage:

See also
SC::HttpWebServer
// constexpr int NUM_CLIENTS = 3;
// constexpr int CLIENT_HEADERS = 8 * 1024;
Buffer headersMemory;
SC_TEST_EXPECT(headersMemory.resize(NUM_CLIENTS * CLIENT_HEADERS));
GrowableBuffer<Buffer> headers = {headersMemory};
HttpServer::Memory memory = {headers, clients};
HttpAsyncServer server;
SC_TEST_EXPECT(server.start(eventLoop, "127.0.0.1", 6152, memory));
struct ServerContext
{
int numRequests;
} serverContext = {0};
server.httpServer.onRequest = [this, &serverContext](HttpRequest& request, HttpResponse& response)
{
if (request.getParser().method != HttpParser::Method::HttpGET)
{
SC_TEST_EXPECT(response.startResponse(405));
SC_TEST_EXPECT(response.sendHeaders());
SC_TEST_EXPECT(response.end());
return;
}
if (request.getURL() != "/index.html" and request.getURL() != "/")
{
SC_TEST_EXPECT(response.startResponse(404));
SC_TEST_EXPECT(response.sendHeaders());
SC_TEST_EXPECT(response.end());
return;
}
serverContext.numRequests++;
SC_TEST_EXPECT(response.startResponse(200));
SC_TEST_EXPECT(response.addHeader("Connection", "Closed"));
SC_TEST_EXPECT(response.addHeader("Content-Type", "text/html"));
SC_TEST_EXPECT(response.addHeader("Server", "SC"));
SC_TEST_EXPECT(response.addHeader("Date", "Mon, 27 Aug 2023 16:37:00 GMT"));
SC_TEST_EXPECT(response.addHeader("Last-Modified", "Wed, 27 Aug 2023 16:37:00 GMT"));
const char sampleHtml[] = "<html>\r\n"
"<body bgcolor=\"#000000\" text=\"#ffffff\">\r\n"
"<h1>This is a title {}!</h1>\r\n"
"We must start from somewhere\r\n"
"</body>\r\n"
"</html>\r\n";
String content;
SC_TEST_EXPECT(StringBuilder::format(content, sampleHtml, serverContext.numRequests));
SmallString<16> contentLength;
SC_TEST_EXPECT(StringBuilder::format(contentLength, "{}", content.view().sizeInBytes()));
SC_TEST_EXPECT(response.addHeader("Content-Length", contentLength.view()));
SC_TEST_EXPECT(response.sendHeaders());
SC_TEST_EXPECT(response.getWritableStream().write(move(content)));
SC_TEST_EXPECT(response.end());
};

Member Function Documentation

◆ start()

Result SC::HttpServer::start ( Memory & memory)

Starts the http server.

Parameters
memoryMemory buffers to be used by the http server

Member Data Documentation

◆ onRequest

Function<void(HttpRequest&, HttpResponse&)> SC::HttpServer::onRequest

Called after enough data from a newly connected client has arrived, causing all headers to be parsed.

Warning
Both references can be invalidated in later stages of the http request lifetime. If necessary, store the client key returned by SC::HttpResponse::getClientKey and use it with SC::HttpServer::getRequest, SC::HttpServer::getResponse or SC::HttpServer::getSocket

The documentation for this struct was generated from the following file: