Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
HttpAsyncFileServer.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "../Async/Async.h"
5#include "../AsyncStreams/AsyncRequestStreams.h"
6#include "HttpConnection.h"
7#include "HttpExport.h"
8#include "HttpMultipartParser.h"
9
10namespace SC
11{
13struct SC_HTTP_EXPORT HttpAsyncFileServerOptions
14{
15 using MimeTypeLookup = StringSpan (*)(StringSpan extension, void* userData);
16
18 StringSpan spaFallbackPath = {};
19
21 MimeTypeLookup mimeTypeLookup = nullptr;
22 void* mimeTypeUserData = nullptr;
23
25 bool enableValidators = true;
26
28 bool enableRangeRequests = true;
29
31 bool enableUploads = true;
32
34 size_t maxUploadBytes = 0;
35};
36
46struct SC_HTTP_EXPORT HttpAsyncFileServer
47{
51 struct SC_HTTP_EXPORT Stream
52 {
53 ReadableFileStream readableFileStream;
54 WritableFileStream writableFileStream;
55 AsyncTaskSequence readableFileStreamTask;
56 AsyncTaskSequence writableFileStreamTask;
57 HttpMultipartParser multipartParser;
58 AsyncFileSend asyncFileSend;
59 FileDescriptor sourceFileDescriptor;
60 size_t fileSendOffset = 0;
61 size_t fileSendLength = 0;
62
64 {
65 HttpAsyncFileServer* server = nullptr;
66 Stream* stream = nullptr;
67 HttpConnection* connection = nullptr;
68
69 FileDescriptor currentFd; // TODO: Reuse the above sourceFileDescriptor
70 StringPath currentFilePath;
71 StringSpan currentHeaderName;
73 bool rejectedFileName = false;
74
75 void onData(AsyncBufferView::ID bufferID);
76 } multipartListener;
77
79 {
80 HttpConnection* connection = nullptr;
81
82 void onFinish();
83 } putFileListener;
84 };
85
86 template <int RequestsSize>
87 struct SC_HTTP_EXPORT StreamQueue : public Stream
88 {
89 static_assert(RequestsSize >= 2, "HttpAsyncFileServer::StreamQueue requires RequestsSize >= 2");
90
92 {
93 readableFileStream.setReadQueue(readQueue);
94 writableFileStream.setWriteQueue(writeQueue);
95 }
96 AsyncReadableStream::Request readQueue[RequestsSize];
97 AsyncWritableStream::Request writeQueue[RequestsSize];
98 };
99
101 Result init(ThreadPool& threadPool, AsyncEventLoop& loop, StringSpan directoryToServe);
102
104 Result close();
105
107 void setUseAsyncFileSend(bool value);
108
110 [[nodiscard]] bool getUseAsyncFileSend() const { return useAsyncFileSend; }
111
114
118
119 private:
120 bool useAsyncFileSend = true;
121 HttpAsyncFileServerOptions options = {};
122
123 Result putFile(HttpAsyncFileServer::Stream& stream, HttpConnection& connection, StringSpan filePath);
124 Result getFile(HttpAsyncFileServer::Stream& stream, HttpConnection& connection, StringSpan filePath, bool sendBody,
125 bool allowSpaFallback);
126 Result postMultipart(HttpAsyncFileServer::Stream& stream, HttpConnection& connection);
127
128 StringPath directory;
129
130 AsyncEventLoop* eventLoop = nullptr;
131 ThreadPool* threadPool = nullptr;
132 struct Internal;
133};
134
135} // namespace SC
Definition AsyncStreams.h:66
Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEve...
Definition Async.h:1447
Sends file contents to a socket using zero-copy when available (sendfile, TransmitFile).
Definition Async.h:1030
Definition AsyncStreams.h:233
An AsyncSequence using a SC::ThreadPool to execute one or more SC::AsyncRequest in a background threa...
Definition Async.h:1174
Definition AsyncStreams.h:371
[UniqueHandleDeclaration2Snippet]
Definition File.h:130
Options controlling optional HttpAsyncFileServer semantics.
Definition HttpAsyncFileServer.h:14
Definition HttpAsyncFileServer.h:88
Definition HttpAsyncFileServer.h:64
Definition HttpAsyncFileServer.h:79
Support class for HttpAsyncFileServer holding file stream and pipeline.
Definition HttpAsyncFileServer.h:52
Http file server statically serves files from a directory.
Definition HttpAsyncFileServer.h:47
void setUseAsyncFileSend(bool value)
Controls whether to use AsyncFileSend optimization for GET requests (default: true)
Result init(ThreadPool &threadPool, AsyncEventLoop &loop, StringSpan directoryToServe)
Initialize the web server on the given file system directory to serve.
Result close()
Removes any reference to the arguments passed during init.
Result handleRequest(HttpAsyncFileServer::Stream &stream, HttpConnection &connection)
Handles the request, serving the requested file (GET) or creating a new one (PUT/POST) Call this meth...
Result setOptions(const HttpAsyncFileServerOptions &options)
Sets optional file server behavior.
bool getUseAsyncFileSend() const
Gets whether AsyncFileSend optimization is used for GET requests.
Definition HttpAsyncFileServer.h:110
Http connection abstraction holding both the incoming and outgoing messages in an HTTP transaction.
Definition HttpConnection.h:490
Incremental HTTP multipart/form-data parser.
Definition HttpMultipartParser.h:55
Zero-copy view over common multipart part headers.
Definition HttpMultipartParser.h:33
Simple thread pool that executes tasks in a fixed number of worker threads.
Definition ThreadPool.h:38