44#include " Internal/HttpStringAppend.h"
55#include < stdio.h>
66
7+ namespace SC
8+ {
9+ // -------------------------------------------------------------------------------------------------------
710// HttpRequest
8- bool SC::HttpRequest::find (HttpParser::Token token, StringSpan& res) const
11+ // -------------------------------------------------------------------------------------------------------
12+ bool HttpRequest::find (HttpParser::Token token, StringSpan& res) const
913{
1014 for (size_t idx = 0 ; idx < numHeaders; ++idx)
1115 {
@@ -19,16 +23,60 @@ bool SC::HttpRequest::find(HttpParser::Token token, StringSpan& res) const
1923 return false ;
2024}
2125
22- void SC:: HttpRequest::reset ()
26+ void HttpRequest::reset ()
2327{
2428 headersEndReceived = false ;
2529 parsedSuccessfully = true ;
2630 numHeaders = 0 ;
2731 parser = {};
2832}
2933
34+ Result HttpRequest::parse (const uint32_t maxSize, Span<const char > readData)
35+ {
36+ if (readHeaders.sizeInBytes () > maxSize)
37+ {
38+ parsedSuccessfully = false ;
39+ return Result::Error (" Header size exceeded limit" );
40+ }
41+
42+ size_t readBytes;
43+ while (parsedSuccessfully and not readData.empty ())
44+ {
45+ Span<const char > parsedData;
46+ parsedSuccessfully &= parser.parse (readData, readBytes, parsedData);
47+ parsedSuccessfully &= readData.sliceStart (readBytes, readData);
48+ if (parser.state == HttpParser::State::Finished)
49+ break ;
50+ if (parser.state == HttpParser::State::Result)
51+ {
52+ detail::HttpHeaderOffset header;
53+ header.token = parser.token ;
54+ header.start = static_cast <uint32_t >(parser.tokenStart );
55+ header.length = static_cast <uint32_t >(parser.tokenLength );
56+ if (numHeaders < HttpRequest::MaxNumHeaders)
57+ {
58+ headerOffsets[numHeaders] = header;
59+ numHeaders++;
60+ }
61+ else
62+ {
63+ parsedSuccessfully = false ;
64+ }
65+ if (parser.token == HttpParser::Token::HeadersEnd)
66+ {
67+ headersEndReceived = true ;
68+ SC_TRY (find (HttpParser::Token::Url, url));
69+ break ;
70+ }
71+ }
72+ }
73+ return Result (parsedSuccessfully);
74+ }
75+
76+ // -------------------------------------------------------------------------------------------------------
3077// HttpResponse
31- SC::Result SC::HttpResponse::startResponse (int code)
78+ // -------------------------------------------------------------------------------------------------------
79+ Result HttpResponse::startResponse (int code)
3280{
3381 GrowableBuffer<decltype (outputBuffer)> gb = {outputBuffer};
3482
@@ -46,7 +94,7 @@ SC::Result SC::HttpResponse::startResponse(int code)
4694 return Result (true );
4795}
4896
49- SC:: Result SC:: HttpResponse::addHeader (StringSpan headerName, StringSpan headerValue)
97+ Result HttpResponse::addHeader (StringSpan headerName, StringSpan headerValue)
5098{
5199 GrowableBuffer<decltype (outputBuffer)> gb = {outputBuffer};
52100
@@ -59,7 +107,7 @@ SC::Result SC::HttpResponse::addHeader(StringSpan headerName, StringSpan headerV
59107 return Result (true );
60108}
61109
62- SC:: Result SC:: HttpResponse::end (Span<const char > span)
110+ Result HttpResponse::end (Span<const char > span)
63111{
64112 {
65113 GrowableBuffer<decltype (outputBuffer)> gb = {outputBuffer};
@@ -77,15 +125,16 @@ SC::Result SC::HttpResponse::end(Span<const char> span)
77125 return end ();
78126}
79127
80- SC:: Result SC:: HttpResponse::end ()
128+ Result HttpResponse::end ()
81129{
82130 responseEnded = true ;
83131 return Result (true );
84132}
85133
134+ // -------------------------------------------------------------------------------------------------------
86135// HttpServer
87-
88- SC:: Result SC:: HttpServer::start (AsyncEventLoop& loop, StringSpan address, uint16_t port, Memory& memory)
136+ // -------------------------------------------------------------------------------------------------------
137+ Result HttpServer::start (AsyncEventLoop& loop, StringSpan address, uint16_t port, Memory& memory)
89138{
90139 SocketIPAddress nativeAddress;
91140 SC_TRY (nativeAddress.fromAddressPort (address, port));
@@ -105,7 +154,7 @@ SC::Result SC::HttpServer::start(AsyncEventLoop& loop, StringSpan address, uint1
105154 return Result (true );
106155}
107156
108- SC:: Result SC:: HttpServer::stopAsync ()
157+ Result HttpServer::stopAsync ()
109158{
110159 if (not asyncServerAccept.isFree ())
111160 {
@@ -122,7 +171,7 @@ SC::Result SC::HttpServer::stopAsync()
122171 return Result (true );
123172}
124173
125- SC:: Result SC:: HttpServer::stopSync ()
174+ Result HttpServer::stopSync ()
126175{
127176 stopping = true ;
128177 SC_TRY (stopAsync ());
@@ -139,51 +188,7 @@ SC::Result SC::HttpServer::stopSync()
139188 return Result (true );
140189}
141190
142- SC::Result SC::HttpServer::parse (HttpRequest& request, const uint32_t maxSize, Span<const char > readData)
143- {
144- bool & parsedSuccessfully = request.parsedSuccessfully ;
145- if (request.readHeaders .sizeInBytes () > maxSize)
146- {
147- parsedSuccessfully = false ;
148- return Result::Error (" Header size exceeded limit" );
149- }
150-
151- size_t readBytes;
152- while (request.parsedSuccessfully and not readData.empty ())
153- {
154- HttpParser& parser = request.parser ;
155- Span<const char > parsedData;
156- parsedSuccessfully &= parser.parse (readData, readBytes, parsedData);
157- parsedSuccessfully &= readData.sliceStart (readBytes, readData);
158- if (parser.state == HttpParser::State::Finished)
159- break ;
160- if (parser.state == HttpParser::State::Result)
161- {
162- detail::HttpHeaderOffset header;
163- header.token = parser.token ;
164- header.start = static_cast <uint32_t >(parser.tokenStart );
165- header.length = static_cast <uint32_t >(parser.tokenLength );
166- if (request.numHeaders < HttpRequest::MaxNumHeaders)
167- {
168- request.headerOffsets [request.numHeaders ] = header;
169- request.numHeaders ++;
170- }
171- else
172- {
173- parsedSuccessfully = false ;
174- }
175- if (parser.token == HttpParser::Token::HeadersEnd)
176- {
177- request.headersEndReceived = true ;
178- SC_TRY (request.find (HttpParser::Token::Url, request.url ));
179- break ;
180- }
181- }
182- }
183- return Result (parsedSuccessfully);
184- }
185-
186- void SC::HttpServer::onNewClient (AsyncSocketAccept::Result& result)
191+ void HttpServer::onNewClient (AsyncSocketAccept::Result& result)
187192{
188193 SocketDescriptor acceptedClient;
189194 if (not result.moveTo (acceptedClient))
@@ -224,7 +229,7 @@ void SC::HttpServer::onNewClient(AsyncSocketAccept::Result& result)
224229 result.reactivateRequest (numClients < clients.sizeInElements ());
225230}
226231
227- void SC:: HttpServer::onReceive (AsyncSocketReceive::Result& result)
232+ void HttpServer::onReceive (AsyncSocketReceive::Result& result)
228233{
229234 SC_COMPILER_WARNING_PUSH_OFFSETOF
230235 HttpServerClient& client = SC_COMPILER_FIELD_OFFSET (HttpServerClient, asyncReceive, result.getAsync ());
@@ -241,7 +246,7 @@ void SC::HttpServer::onReceive(AsyncSocketReceive::Result& result)
241246 const bool hasHeaderSpace =
242247 client.request .availableHeader .sliceStart (readData.sizeInBytes (), client.request .availableHeader );
243248
244- if (not parse ( client.request , maxHeaderSize, readData))
249+ if (not client.request . parse ( maxHeaderSize, readData))
245250 {
246251 // TODO: Invoke on error
247252 return ;
@@ -274,7 +279,7 @@ void SC::HttpServer::onReceive(AsyncSocketReceive::Result& result)
274279 }
275280}
276281
277- void SC:: HttpServer::onAfterSend (AsyncSocketSend::Result& result)
282+ void HttpServer::onAfterSend (AsyncSocketSend::Result& result)
278283{
279284 if (result.isValid ())
280285 {
@@ -285,7 +290,7 @@ void SC::HttpServer::onAfterSend(AsyncSocketSend::Result& result)
285290 }
286291}
287292
288- void SC:: HttpServer::closeAsync (HttpServerClient& requestClient)
293+ void HttpServer::closeAsync (HttpServerClient& requestClient)
289294{
290295 if (not requestClient.asyncSend .isFree ())
291296 {
@@ -307,3 +312,4 @@ void SC::HttpServer::closeAsync(HttpServerClient& requestClient)
307312 SC_TRUST_RESULT (asyncServerAccept.start (*eventLoop, serverSocket));
308313 }
309314}
315+ } // namespace SC
0 commit comments