Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
HttpServer.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "HttpParser.h"
5
6#include "../Async/Async.h"
7#include "../AsyncStreams/AsyncRequestStreams.h"
8#include "../Foundation/Function.h"
9#include "../Foundation/StringSpan.h"
10
11namespace SC
12{
13#if SC_COMPILER_MSVC
14#pragma warning(push)
15#pragma warning(disable : 4251)
16#endif
17struct SC_COMPILER_EXPORT HttpServer;
18struct SC_COMPILER_EXPORT HttpServerClient;
19namespace detail
20{
21struct SC_COMPILER_EXPORT HttpHeaderOffset
22{
23 HttpParser::Token token = HttpParser::Token::Method;
24
25 uint32_t start = 0;
26 uint32_t length = 0;
27};
28} // namespace detail
29
32
34struct SC_COMPILER_EXPORT HttpRequest
35{
40 [[nodiscard]] bool find(HttpParser::Token token, StringSpan& res) const;
41
43 const HttpParser& getParser() const { return parser; }
44
46 StringSpan getURL() const { return url; }
47
49 void reset();
50
52 Result parse(const uint32_t maxHeaderSize, Span<const char> readData);
53
54 private:
55 friend struct HttpServer;
56 friend struct HttpAsyncServer;
57 using HttpHeaderOffset = detail::HttpHeaderOffset;
58
59 Span<char> readHeaders;
60 Span<char> availableHeader;
61
62 bool headersEndReceived = false;
63 bool parsedSuccessfully = true;
64
65 HttpParser parser;
66 StringSpan url;
67
68 static constexpr size_t MaxNumHeaders = 64;
69
70 HttpHeaderOffset headerOffsets[MaxNumHeaders];
71 size_t numHeaders = 0;
72};
73
75struct SC_COMPILER_EXPORT HttpResponse
76{
78 Result startResponse(int httpCode);
79
81 Result addHeader(StringSpan headerName, StringSpan headerValue);
82
85
87 void reset();
88
91
93 AsyncWritableStream& getWritableStream() { return *writableStream; }
94
95 private:
96 friend struct HttpServer;
97 friend struct HttpAsyncServer;
98
99 Span<char> responseHeaders;
100 size_t responseHeadersCapacity = 0;
101
102 bool headersSent = false;
103
104 AsyncWritableStream* writableStream = nullptr;
105};
106
107struct SC_COMPILER_EXPORT HttpServerClient
108{
110
111 void reset()
112 {
113 request.reset();
114 response.reset();
115 state = State::Free;
116 }
117
118 HttpRequest request;
119 HttpResponse response;
120
121 private:
122 enum class State
123 {
124 Free,
125 Used
126 };
127 friend struct HttpServer;
128 friend struct HttpAsyncServer;
129 char debugName[16] = {0};
130
131 State state = State::Free;
132 size_t index = 0;
133
134 ReadableSocketStream readableSocketStream;
135 WritableSocketStream writableSocketStream;
136
137 SocketDescriptor socket;
138};
139#if !DOXYGEN
140SC_COMPILER_EXTERN template struct SC_COMPILER_EXPORT Function<void(HttpRequest&, HttpResponse&)>;
141SC_COMPILER_EXTERN template struct SC_COMPILER_EXPORT Span<HttpServerClient>;
142#endif
152struct SC_COMPILER_EXPORT HttpServer
153{
154 struct Memory
155 {
156 IGrowableBuffer& headersMemory;
157
159 };
163
169
171
172 [[nodiscard]] size_t getNumClients() const { return numClients; }
173
174 [[nodiscard]] bool canAcceptMoreClients() const { return numClients < clients.sizeInElements(); }
175 [[nodiscard]] bool allocateClient(size_t& idx);
176 [[nodiscard]] bool deallocateClient(HttpServerClient& client);
177
178 uint32_t maxHeaderSize = 8 * 1024;
179
180 private:
181 void closeAsync(HttpServerClient& requestClient);
182
183 IGrowableBuffer* headersMemory = nullptr;
184 size_t numClients = 0;
185};
187#if SC_COMPILER_MSVC
188#pragma warning(pop)
189#endif
190
191} // namespace SC
#define SC_COMPILER_EXTERN
Define compiler-specific export macros for DLL visibility.
Definition Compiler.h:74
unsigned int uint32_t
Platform independent (4) bytes unsigned int.
Definition PrimitiveTypes.h:38
Async destination abstraction where bytes can be written to.
Definition AsyncStreams.h:266
Wraps function pointers, member functions and lambdas without ever allocating.
Definition Function.h:19
Definition HttpAsyncServer.h:12
Incremental HTTP request or response parser.
Definition HttpParser.h:17
Token
One possible Token reported by the parser.
Definition HttpParser.h:42
Http request received from a client.
Definition HttpServer.h:35
const HttpParser & getParser() const
Gets the associated HttpParser.
Definition HttpServer.h:43
StringSpan getURL() const
Gets the request URL.
Definition HttpServer.h:46
void reset()
Resets this object for it to be re-usable.
Result parse(const uint32_t maxHeaderSize, Span< const char > readData)
Parses an incoming slice of data (must be slice of availableHeader)
bool find(HttpParser::Token token, StringSpan &res) const
Finds a specific HttpParser::Result in the list of parsed header.
Http response that will be sent to a client.
Definition HttpServer.h:76
Result startResponse(int httpCode)
Starts the response with a http standard code (200 OK, 404 NOT FOUND etc.)
Result sendHeaders()
Start sending response headers, before sending any data.
Result addHeader(StringSpan headerName, StringSpan headerValue)
Writes an http header to this response.
Result end()
Finalizes the writable stream after sending all in progress writes.
void reset()
Resets this object for it to be re-usable.
AsyncWritableStream & getWritableStream()
Obtain writable stream to write content.
Definition HttpServer.h:93
Definition HttpServer.h:108
Definition HttpServer.h:155
Async Http server.
Definition HttpServer.h:153
Result start(Memory &memory)
Starts the http server.
Function< void(HttpRequest &, HttpResponse &)> onRequest
Called after enough data from a newly connected client has arrived, causing all headers to be parsed.
Definition HttpServer.h:168
Uses an SC::AsyncFileWrite to stream data from a socket.
Definition AsyncRequestStreams.h:77
An ascii string used as boolean result. SC_TRY macro forwards errors to caller.
Definition Result.h:12
Low-level OS socket handle.
Definition Socket.h:153
View over a contiguous sequence of items (pointer + size in elements).
Definition Span.h:29
An read-only view over a string (to avoid including Strings library when parsing is not needed).
Definition StringSpan.h:37
Uses an SC::AsyncFileWrite to stream data to a socket.
Definition AsyncRequestStreams.h:84