@@ -46,17 +46,19 @@ struct SC_COMPILER_EXPORT HttpRequest
4646 // / @brief Gets the request URL
4747 StringSpan getURL () const { return url; }
4848
49+ // / @brief Resets this object for it to be re-usable
4950 void reset ();
5051
51- Result parse (const uint32_t maxHeaderSize, Span<const char > readData);
52- Span<char > readHeaders;
53- Span<char > availableHeader; // /< Space to save headers to
54-
55- bool allHeadersReceived () const { return headersEndReceived; }
52+ // / @brief Parses an incoming slice of data (must be slice of availableHeader)
53+ Result parse (const uint32_t maxHeaderSize, Span<const char > readData);
5654
5755 private:
5856 friend struct HttpServer ;
59- using HttpHeaderOffset = detail::HttpHeaderOffset; // TODO: hide class implementation
57+ friend struct HttpAsyncServer ;
58+ using HttpHeaderOffset = detail::HttpHeaderOffset;
59+
60+ Span<char > readHeaders; // /< Headers read so far
61+ Span<char > availableHeader; // /< Space to save headers to
6062
6163 bool headersEndReceived = false ; // /< All headers have been received
6264 bool parsedSuccessfully = true ; // /< Request headers have been parsed successfully
@@ -65,8 +67,9 @@ struct SC_COMPILER_EXPORT HttpRequest
6567 StringSpan url; // /< The url extracted from parsed headers
6668
6769 static constexpr size_t MaxNumHeaders = 64 ;
68- HttpHeaderOffset headerOffsets[MaxNumHeaders]; // /< Headers, defined as offsets in headerBuffer
69- size_t numHeaders = 0 ;
70+
71+ HttpHeaderOffset headerOffsets[MaxNumHeaders]; // /< Headers, defined as offsets in headerBuffer
72+ size_t numHeaders = 0 ;
7073};
7174
7275// / @brief Http response that will be sent to a client
@@ -78,55 +81,60 @@ struct SC_COMPILER_EXPORT HttpResponse
7881 // / @brief Writes an http header to this response
7982 Result addHeader (StringSpan headerName, StringSpan headerValue);
8083
81- // / @brief Appends some data to the response
82- Result write (Span<const char > data);
83-
8484 // / @brief Finalizes response appending some data
8585 // / @warning The SC::HttpResponse / SC::HttpRequest pair will be invalidated on next SC::AsyncEventLoop run
8686 Result end (Span<const char > data);
8787 Result end ();
8888
89+ // / @brief Resets this object for it to be re-usable
8990 void reset ()
9091 {
9192 responseEnded = false ;
9293 outputBuffer.clear ();
9394 }
9495
95- Span<const char > getSpan () const { return outputBuffer.toSpanConst (); }
96- [[nodiscard]] bool mustBeFlushed () const { return responseEnded or outputBuffer.size () > highwaterMark; }
97-
9896 private:
9997 friend struct HttpServer ;
98+ friend struct HttpAsyncServer ;
99+
100+ Span<const char > getContentSpan () const { return outputBuffer.toSpanConst (); }
101+ Span<const char > getHeadersSpan () const { return responseHeaders; }
102+
103+ Span<char > responseHeaders;
104+ size_t responseHeadersCapacity = 0 ;
100105
101106 Buffer outputBuffer;
102107
103- bool responseEnded = false ;
104- size_t highwaterMark = 1024 ;
108+ bool responseEnded = false ;
105109};
106110
107111struct SC_COMPILER_EXPORT HttpServerClient
108112{
109- enum class State
110- {
111- Free,
112- Used
113- };
114113 HttpServerClient ();
115- State state = State::Free;
116-
117- HttpRequest request;
118- HttpResponse response;
119- size_t index = 0 ;
120114
121- void setFree ()
115+ void reset ()
122116 {
123117 request.reset ();
124118 response.reset ();
125119 state = State::Free;
126120 }
127121
122+ HttpRequest request;
123+ HttpResponse response;
124+
125+ private:
126+ enum class State
127+ {
128+ Free,
129+ Used
130+ };
131+ friend struct HttpServer ;
132+ friend struct HttpAsyncServer ;
128133 char debugName[16 ] = {0 };
129134
135+ State state = State::Free;
136+ size_t index = 0 ;
137+
130138 ReadableSocketStream readableSocketStream;
131139 WritableSocketStream writableSocketStream;
132140
@@ -136,6 +144,8 @@ struct SC_COMPILER_EXPORT HttpServerClient
136144 SocketDescriptor socket;
137145 AsyncSocketReceive asyncReceive;
138146 AsyncSocketSend asyncSend;
147+
148+ Span<const char > buffers[2 ];
139149};
140150#if !DOXYGEN
141151SC_COMPILER_EXTERN template struct SC_COMPILER_EXPORT Function<void (HttpRequest&, HttpResponse&)>;
0 commit comments