xref: /haiku/src/kits/network/libnetservices2/HttpBuffer.h (revision 52c4471a3024d2eb81fe88e2c3982b9f8daa5e56)
1 /*
2  * Copyright 2022 Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #ifndef _B_HTTP_BUFFER_H_
7 #define _B_HTTP_BUFFER_H_
8 
9 #include <functional>
10 #include <optional>
11 #include <string_view>
12 #include <vector>
13 
14 class BDataIO;
15 class BString;
16 
17 
18 namespace BPrivate {
19 
20 namespace Network {
21 
22 using HttpTransferFunction = std::function<size_t(const std::byte*, size_t)>;
23 
24 
25 class HttpBuffer
26 {
27 public:
28 								HttpBuffer(size_t capacity = 8 * 1024);
29 
30 			ssize_t				ReadFrom(BDataIO* source,
31 									std::optional<size_t> maxSize = std::nullopt);
32 			size_t				WriteTo(HttpTransferFunction func,
33 									std::optional<size_t> maxSize = std::nullopt);
34 			void				WriteExactlyTo(HttpTransferFunction func,
35 									std::optional<size_t> maxSize = std::nullopt);
36 			std::optional<BString> GetNextLine();
37 
38 			size_t				RemainingBytes() const noexcept;
39 
40 			void				Flush() noexcept;
41 			void				Clear() noexcept;
42 
43 			std::string_view	Data() const noexcept;
44 
45 	// load data into the buffer
46 			HttpBuffer&			operator<<(const std::string_view& data);
47 
48 private:
49 			std::vector<std::byte> fBuffer;
50 			size_t				fCurrentOffset = 0;
51 };
52 
53 
54 } // namespace Network
55 
56 } // namespace BPrivate
57 
58 #endif // _B_HTTP_BUFFER_H_
59