Skip to content

Commit 3c7c335

Browse files
committed
Http: Move HttpServer::parse to HttpRequest
1 parent 776b38f commit 3c7c335

File tree

2 files changed

+67
-61
lines changed

2 files changed

+67
-61
lines changed

Libraries/Http/HttpServer.cpp

Lines changed: 65 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
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

Libraries/Http/HttpServer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ struct SC_COMPILER_EXPORT HttpRequest
4343

4444
void reset();
4545

46+
Result parse(const uint32_t maxHeaderSize, Span<const char> readData);
47+
4648
private:
4749
friend struct HttpServer;
4850
using HttpHeaderOffset = detail::HttpHeaderOffset; // TODO: hide class implementation
@@ -172,8 +174,6 @@ struct SC_COMPILER_EXPORT HttpServer
172174
void onAfterSend(AsyncSocketSend::Result& result);
173175
void closeAsync(HttpServerClient& requestClient);
174176

175-
Result parse(HttpRequest& request, const uint32_t maxHeaderSize, Span<const char> readData);
176-
177177
IGrowableBuffer* headersMemory = nullptr;
178178

179179
Span<HttpServerClient> clients;

0 commit comments

Comments
 (0)