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{
21struct SC_HTTP_EXPORT HttpAsyncFileServer
22{
26 struct SC_HTTP_EXPORT Stream
27 {
28 ReadableFileStream readableFileStream;
29 WritableFileStream writableFileStream;
30 AsyncTaskSequence readableFileStreamTask;
31 AsyncTaskSequence writableFileStreamTask;
32 HttpMultipartParser multipartParser;
33 AsyncFileSend asyncFileSend;
34 FileDescriptor sourceFileDescriptor;
35
37 {
38 HttpAsyncFileServer* server = nullptr;
39 Stream* stream = nullptr;
40 HttpConnection* connection = nullptr;
41
42 FileDescriptor currentFd; // TODO: Reuse the above sourceFileDescriptor
43 StringPath currentFilePath;
44 StringSpan currentFileName;
45 StringSpan currentHeaderName;
46 bool isContentDisposition = false;
47
48 void onData(AsyncBufferView::ID bufferID);
49 } multipartListener;
50
52 {
53 HttpConnection* connection = nullptr;
54 size_t remainingBytes = 0;
55
56 void onData(AsyncBufferView::ID bufferID);
57 void onDrain();
58 } putFileListener;
59 };
60
61 template <int RequestsSize>
62 struct SC_HTTP_EXPORT StreamQueue : public Stream
63 {
64 static_assert(RequestsSize >= 2, "HttpAsyncFileServer::StreamQueue requires RequestsSize >= 2");
65
67 {
68 readableFileStream.setReadQueue(readQueue);
69 writableFileStream.setWriteQueue(writeQueue);
70 }
71 AsyncReadableStream::Request readQueue[RequestsSize];
72 AsyncWritableStream::Request writeQueue[RequestsSize];
73 };
74
76 Result init(ThreadPool& threadPool, AsyncEventLoop& loop, StringSpan directoryToServe);
77
80
82 void setUseAsyncFileSend(bool value);
83
85 [[nodiscard]] bool getUseAsyncFileSend() const { return useAsyncFileSend; }
86
90
91 private:
92 bool useAsyncFileSend = true;
93 Result putFile(HttpAsyncFileServer::Stream& stream, HttpConnection& connection, StringSpan filePath);
94 Result getFile(HttpAsyncFileServer::Stream& stream, HttpConnection& connection, StringSpan filePath);
95 Result postMultipart(HttpAsyncFileServer::Stream& stream, HttpConnection& connection);
96
97 StringPath directory;
98
99 AsyncEventLoop* eventLoop = nullptr;
100 ThreadPool* threadPool = nullptr;
101 struct Internal;
102};
103
104} // namespace SC
Definition AsyncStreams.h:58
Asynchronous I/O (files, sockets, timers, processes, fs events, threads wake-up) (see Async) AsyncEve...
Definition Async.h:1394
Sends file contents to a socket using zero-copy when available (sendfile, TransmitFile).
Definition Async.h:982
Definition AsyncStreams.h:225
An AsyncSequence using a SC::ThreadPool to execute one or more SC::AsyncRequest in a background threa...
Definition Async.h:1124
Definition AsyncStreams.h:357
[UniqueHandleDeclaration2Snippet]
Definition File.h:128
Definition HttpAsyncFileServer.h:63
Definition HttpAsyncFileServer.h:37
Definition HttpAsyncFileServer.h:52
Support class for HttpAsyncFileServer holding file stream and pipeline.
Definition HttpAsyncFileServer.h:27
Http file server statically serves files from a directory.
Definition HttpAsyncFileServer.h:22
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...
bool getUseAsyncFileSend() const
Gets whether AsyncFileSend optimization is used for GET requests.
Definition HttpAsyncFileServer.h:85
Http connection abstraction holding both the incoming and outgoing messages in an HTTP transaction.
Definition HttpConnection.h:410
Incremental HTTP multipart/form-data parser.
Definition HttpMultipartParser.h:16
An ascii string used as boolean result. SC_TRY macro forwards errors to caller.
Definition Result.h:13
Pre-sized char array holding enough space to represent a file system path.
Definition StringPath.h:42
An read-only view over a string (to avoid including Strings library when parsing is not needed).
Definition StringSpan.h:37
Simple thread pool that executes tasks in a fixed number of worker threads.
Definition ThreadPool.h:38