HTTP v1.13.1
Loading...
Searching...
No Matches
HTTPParser.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <unordered_map>
5#include <functional>
6
7#include "HTTPUtility.h"
8#include "JSONParser.h"
9
10namespace web
11{
14 {
15 private:
16 struct ReadOnlyBuffer : public std::streambuf
17 {
18 ReadOnlyBuffer(std::string_view view);
19 };
20
21 private:
22 static const std::unordered_map<std::string_view, std::function<void(HTTPParser&, std::string_view)>> contentTypeParsers;
23
24 public:
25 static inline const std::string contentLengthHeader = "Content-Length";
26 static inline const std::string contentTypeHeader = "Content-Type";
27 static inline const std::string transferEncodingHeader = "Transfer-Encoding";
28 static inline const std::string utf8Encoded = "charset=utf-8";
29 static inline const std::string chunkEncoded = "chunked";
30 static inline constexpr std::string_view crlfcrlf = "\r\n\r\n";
31 static inline constexpr std::string_view crlf = "\r\n";
32
33 public:
34 static inline constexpr std::string_view urlEncoded = "application/x-www-form-urlencoded";
35 static inline constexpr std::string_view jsonEncoded = "application/json";
36 static inline constexpr std::string_view multipartEncoded = "multipart/form-data";
37
38 private:
39 std::unordered_map<std::string, std::string, InsensitiveStringHash, InsensitiveStringEqual> headers;
40 std::vector<Multipart> multiparts;
41 std::unordered_map<std::string, std::string> queryParameters;
42 json::JSONParser jsonParser;
43 std::pair<int, std::string> response; // code - response message
44 std::string method;
45 std::string httpVersion;
46 std::string parameters;
47 std::string body;
48 std::vector<std::string> chunks;
49 std::string rawData;
50 size_t chunksSize;
51 bool parsed;
52
53 private:
54 std::string mergeChunks() const;
55
56 private:
57 void parseQueryParameter(std::string_view rawParameters);
58
59 void parseMultipart(std::string_view data);
60
61 void parseContentType();
62
63 private:
64 void parseChunkEncoded(std::string_view HTTPMessage, bool isUTF8);
65
66 public:
67 HTTPParser();
68
69 HTTPParser(const std::string& HTTPMessage);
70
71 HTTPParser(const std::vector<char>& HTTPMessage);
72
73 HTTPParser(const HTTPParser& other) = default;
74
75 HTTPParser(HTTPParser&& other) noexcept = default;
76
77 HTTPParser& operator = (const HTTPParser& other) = default;
78
79 HTTPParser& operator = (HTTPParser&& other) noexcept = default;
80
81 void parse(std::string_view HTTPMessage);
82
83 const std::string& getMethod() const;
84
85 double getHTTPVersion() const;
86
87 const std::string& getParameters() const;
88
89 const std::unordered_map<std::string, std::string>& getQueryParameters() const;
90
91 const std::pair<int, std::string>& getFullResponse() const;
92
93 int getResponseCode() const;
94
95 const std::string& getResponseMessage() const;
96
97 const HeadersMap& getHeaders() const;
98
99 const std::string& getBody() const;
100
101 const std::vector<std::string>& getChunks() const;
102
103 const json::JSONParser& getJSON() const;
104
105 const std::string& getRawData() const;
106
107 const std::vector<Multipart>& getMultiparts() const;
108
109 operator bool() const;
110
111 friend HTTP_API std::ostream& operator << (std::ostream& outputStream, const HTTPParser& parser);
112
113 friend HTTP_API std::istream& operator >> (std::istream& inputStream, HTTPParser& parser);
114
115 ~HTTPParser() = default;
116 };
117}
#define HTTP_API
Definition HTTPUtility.h:17
HTTP parser.
Definition HTTPParser.h:14
HTTPParser(const std::string &HTTPMessage)
~HTTPParser()=default
HTTPParser(HTTPParser &&other) noexcept=default
HTTPParser(const std::vector< char > &HTTPMessage)
HTTPParser(const HTTPParser &other)=default
std::unordered_map< std::string, std::string, InsensitiveStringHash, InsensitiveStringEqual > HeadersMap
Case insensitive unordered_map.