1414
1515#include " http.hpp"
1616
17- #include < pluginManifest.hpp>
18- #include < pluginRegistrar.hpp>
19- #include < pluginFactory.hpp>
17+ #include < ranges>
18+
2019#include < fieldGroup.hpp>
2120#include < fieldManager.hpp>
21+ #include < ipfixprobe/options.hpp>
22+ #include < pluginFactory.hpp>
23+ #include < pluginManifest.hpp>
24+ #include < pluginRegistrar.hpp>
2225#include < utils.hpp>
23- #include < ranges>
24- #include < utils/stringViewUtils.hpp>
2526#include < utils/spanUtils.hpp>
26- #include < ipfixprobe/options.hpp>
27-
27+ #include < utils/stringViewUtils.hpp>
2828
2929namespace ipxp {
3030
@@ -44,108 +44,119 @@ static FieldGroup createHTTPSchema(FieldManager& fieldManager, FieldHandlers<HTT
4444{
4545 FieldGroup schema = fieldManager.createFieldGroup (" http" );
4646
47- handlers.insert (HTTPFields::HTTP_REQUEST_METHOD, schema.addScalarField (
48- " HTTP_REQUEST_METHOD" ,
49- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->method ); }
50- ));
51- handlers.insert (HTTPFields::HTTP_REQUEST_HOST, schema.addScalarField (
52- " HTTP_REQUEST_HOST" ,
53- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->host ); }
54- ));
55- handlers.insert (HTTPFields::HTTP_REQUEST_URL, schema.addScalarField (
56- " HTTP_REQUEST_URL" ,
57- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->uri ); }
58- ));
59- handlers.insert (HTTPFields::HTTP_REQUEST_AGENT, schema.addScalarField (
60- " HTTP_REQUEST_AGENT" ,
61- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->userAgent ); }
62- ));
63- handlers.insert (HTTPFields::HTTP_REQUEST_REFERER, schema.addScalarField (
64- " HTTP_REQUEST_REFERER" ,
65- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->referer ); }
66- ));
67- handlers.insert (HTTPFields::HTTP_RESPONSE_STATUS_CODE, schema.addScalarField (
68- " HTTP_RESPONSE_STATUS_CODE" ,
69- [](const void * context) { return reinterpret_cast <const HTTPData*>(context)->statusCode ; }
70- ));
71- handlers.insert (HTTPFields::HTTP_RESPONSE_CONTENT_TYPE, schema.addScalarField (
72- " HTTP_RESPONSE_CONTENT_TYPE" ,
73- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->contentType ); }
74- ));
75- handlers.insert (HTTPFields::HTTP_RESPONSE_SERVER, schema.addScalarField (
76- " HTTP_RESPONSE_SERVER" ,
77- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->server ); }
78- ));
79- handlers.insert (HTTPFields::HTTP_RESPONSE_SET_COOKIE_NAMES, schema.addScalarField (
80- " HTTP_RESPONSE_SET_COOKIE_NAMES" ,
81- [](const void * context) { return toStringView (reinterpret_cast <const HTTPData*>(context)->cookies ); }
82- ));
47+ handlers.insert (
48+ HTTPFields::HTTP_REQUEST_METHOD,
49+ schema.addScalarField (" HTTP_REQUEST_METHOD" , [](const void * context) {
50+ return toStringView (reinterpret_cast <const HTTPData*>(context)->method );
51+ }));
52+ handlers.insert (
53+ HTTPFields::HTTP_REQUEST_HOST,
54+ schema.addScalarField (" HTTP_REQUEST_HOST" , [](const void * context) {
55+ return toStringView (reinterpret_cast <const HTTPData*>(context)->host );
56+ }));
57+ handlers.insert (
58+ HTTPFields::HTTP_REQUEST_URL,
59+ schema.addScalarField (" HTTP_REQUEST_URL" , [](const void * context) {
60+ return toStringView (reinterpret_cast <const HTTPData*>(context)->uri );
61+ }));
62+ handlers.insert (
63+ HTTPFields::HTTP_REQUEST_AGENT,
64+ schema.addScalarField (" HTTP_REQUEST_AGENT" , [](const void * context) {
65+ return toStringView (reinterpret_cast <const HTTPData*>(context)->userAgent );
66+ }));
67+ handlers.insert (
68+ HTTPFields::HTTP_REQUEST_REFERER,
69+ schema.addScalarField (" HTTP_REQUEST_REFERER" , [](const void * context) {
70+ return toStringView (reinterpret_cast <const HTTPData*>(context)->referer );
71+ }));
72+ handlers.insert (
73+ HTTPFields::HTTP_RESPONSE_STATUS_CODE,
74+ schema.addScalarField (" HTTP_RESPONSE_STATUS_CODE" , [](const void * context) {
75+ return reinterpret_cast <const HTTPData*>(context)->statusCode ;
76+ }));
77+ handlers.insert (
78+ HTTPFields::HTTP_RESPONSE_CONTENT_TYPE,
79+ schema.addScalarField (" HTTP_RESPONSE_CONTENT_TYPE" , [](const void * context) {
80+ return toStringView (reinterpret_cast <const HTTPData*>(context)->contentType );
81+ }));
82+ handlers.insert (
83+ HTTPFields::HTTP_RESPONSE_SERVER,
84+ schema.addScalarField (" HTTP_RESPONSE_SERVER" , [](const void * context) {
85+ return toStringView (reinterpret_cast <const HTTPData*>(context)->server );
86+ }));
87+ handlers.insert (
88+ HTTPFields::HTTP_RESPONSE_SET_COOKIE_NAMES,
89+ schema.addScalarField (" HTTP_RESPONSE_SET_COOKIE_NAMES" , [](const void * context) {
90+ return toStringView (reinterpret_cast <const HTTPData*>(context)->cookies );
91+ }));
8392
8493 return schema;
8594}
8695
87- HTTPPlugin::HTTPPlugin ([[maybe_unused]]const std::string& params, FieldManager& manager)
96+ HTTPPlugin::HTTPPlugin ([[maybe_unused]] const std::string& params, FieldManager& manager)
8897{
8998 createHTTPSchema (manager, m_fieldHandlers);
9099}
91100
92- void HTTPPlugin::saveParsedValues (const HTTPParser& parser, FlowRecord& flowRecord, HTTPData& httpData) noexcept
101+ void HTTPPlugin::saveParsedValues (
102+ const HTTPParser& parser,
103+ FlowRecord& flowRecord,
104+ HTTPData& httpData) noexcept
93105{
94106 httpData.requestParsed |= parser.requestParsed ;
95107 httpData.responseParsed |= parser.responseParsed ;
96108
97109 if (parser.method .has_value ()) {
98- std::ranges::copy (*parser. method |
99- std::views::take (httpData.method .capacity ()),
100- std::back_inserter (httpData.method ));
110+ std::ranges::copy (
111+ *parser. method | std::views::take (httpData.method .capacity ()),
112+ std::back_inserter (httpData.method ));
101113 m_fieldHandlers[HTTPFields::HTTP_REQUEST_METHOD].setAsAvailable (flowRecord);
102114 }
103115 if (parser.uri .has_value ()) {
104- std::ranges::copy (*parser. uri |
105- std::views::take (httpData.uri .capacity ()),
106- std::back_inserter (httpData.uri ));
116+ std::ranges::copy (
117+ *parser. uri | std::views::take (httpData.uri .capacity ()),
118+ std::back_inserter (httpData.uri ));
107119 m_fieldHandlers[HTTPFields::HTTP_REQUEST_URL].setAsAvailable (flowRecord);
108120 }
109121 if (parser.host .has_value ()) {
110- std::ranges::copy (*parser. host |
111- std::views::take (httpData.host .capacity ()),
112- std::back_inserter (httpData.host ));
122+ std::ranges::copy (
123+ *parser. host | std::views::take (httpData.host .capacity ()),
124+ std::back_inserter (httpData.host ));
113125 m_fieldHandlers[HTTPFields::HTTP_REQUEST_HOST].setAsAvailable (flowRecord);
114126 }
115127 if (parser.userAgent .has_value ()) {
116- std::ranges::copy (*parser. userAgent |
117- std::views::take (httpData.userAgent .capacity ()),
118- std::back_inserter (httpData.userAgent ));
128+ std::ranges::copy (
129+ *parser. userAgent | std::views::take (httpData.userAgent .capacity ()),
130+ std::back_inserter (httpData.userAgent ));
119131 m_fieldHandlers[HTTPFields::HTTP_REQUEST_AGENT].setAsAvailable (flowRecord);
120132 }
121133 if (parser.referer .has_value ()) {
122- std::ranges::copy (*parser. referer |
123- std::views::take (httpData.referer .capacity ()),
124- std::back_inserter (httpData.referer ));
134+ std::ranges::copy (
135+ *parser. referer | std::views::take (httpData.referer .capacity ()),
136+ std::back_inserter (httpData.referer ));
125137 m_fieldHandlers[HTTPFields::HTTP_REQUEST_REFERER].setAsAvailable (flowRecord);
126138 }
127139 if (parser.statusCode .has_value ()) {
128140 httpData.statusCode = *parser.statusCode ;
129141 m_fieldHandlers[HTTPFields::HTTP_RESPONSE_STATUS_CODE].setAsAvailable (flowRecord);
130142 }
131143 if (parser.contentType .has_value ()) {
132- std::ranges::copy (*parser. contentType |
133- std::views::take (httpData.contentType .capacity ()),
134- std::back_inserter (httpData.contentType ));
144+ std::ranges::copy (
145+ *parser. contentType | std::views::take (httpData.contentType .capacity ()),
146+ std::back_inserter (httpData.contentType ));
135147 m_fieldHandlers[HTTPFields::HTTP_RESPONSE_CONTENT_TYPE].setAsAvailable (flowRecord);
136148 }
137149 if (parser.server .has_value ()) {
138- std::ranges::copy (*parser. server |
139- std::views::take (httpData.server .capacity ()),
140- std::back_inserter (httpData.server ));
150+ std::ranges::copy (
151+ *parser. server | std::views::take (httpData.server .capacity ()),
152+ std::back_inserter (httpData.server ));
141153 m_fieldHandlers[HTTPFields::HTTP_RESPONSE_SERVER].setAsAvailable (flowRecord);
142154 }
143155 if (parser.cookies .has_value ()) {
144156 std::ranges::for_each (*parser.cookies , [&](std::string_view cookie) {
145- std::ranges::copy (cookie |
146- std::views::take (
147- httpData.cookies .capacity () - httpData.cookies .size ()),
148- std::back_inserter (httpData.cookies ));
157+ std::ranges::copy (
158+ cookie | std::views::take (httpData.cookies .capacity () - httpData.cookies .size ()),
159+ std::back_inserter (httpData.cookies ));
149160 if (httpData.cookies .size () != httpData.cookies .capacity ()) {
150161 httpData.cookies .push_back (' ;' );
151162 }
@@ -166,7 +177,7 @@ void HTTPPlugin::saveParsedValues(const HTTPParser& parser, FlowRecord& flowReco
166177 .flowAction = FlowAction::RemovePlugin,
167178 };
168179 }
169-
180+
170181 if (parser.requestParsed && httpData.requestParsed) {
171182 // Must be flush and reinsert ????
172183 return {
@@ -199,7 +210,8 @@ void HTTPPlugin::saveParsedValues(const HTTPParser& parser, FlowRecord& flowReco
199210PluginInitResult HTTPPlugin::onInit (const FlowContext& flowContext, void * pluginContext)
200211{
201212 HTTPParser parser;
202- parser.parse (toSpan<const std::byte>(flowContext.packet .payload , flowContext.packet .payload_len ));
213+ parser.parse (
214+ toSpan<const std::byte>(flowContext.packet .payload , flowContext.packet .payload_len ));
203215 if (!parser.method .has_value ()) {
204216 return {
205217 .constructionState = ConstructionState::NotConstructed,
@@ -211,15 +223,15 @@ PluginInitResult HTTPPlugin::onInit(const FlowContext& flowContext, void* plugin
211223 auto * pluginData = std::construct_at (reinterpret_cast <HTTPData*>(pluginContext));
212224 saveParsedValues (parser, flowContext.flowRecord , *pluginData);
213225 /* auto [updateRequirement, flowAction] = parseHTTP(
214- toSpan<const std::byte>(flowContext.packet.payload, flowContext.packet.payload_len), flowContext.flowRecord, *pluginData);*/
226+ toSpan<const std::byte>(flowContext.packet.payload, flowContext.packet.payload_len),
227+ flowContext.flowRecord, *pluginData);*/
215228 return {
216229 .constructionState = ConstructionState::Constructed,
217230 .updateRequirement = UpdateRequirement::RequiresUpdate,
218231 .flowAction = FlowAction::NoAction,
219232 };
220233}
221234
222-
223235PluginUpdateResult HTTPPlugin::beforeUpdate (const FlowContext& flowContext, void * pluginContext)
224236{
225237 auto * pluginData = reinterpret_cast <HTTPData*>(pluginContext);
@@ -240,21 +252,22 @@ PluginUpdateResult HTTPPlugin::onUpdate(const FlowContext& flowContext, void* pl
240252{
241253 auto * pluginData = reinterpret_cast <HTTPData*>(pluginContext);
242254 HTTPParser parser;
243- parser.parse (toSpan<const std::byte>(flowContext.packet .payload , flowContext.packet .payload_len ));
255+ parser.parse (
256+ toSpan<const std::byte>(flowContext.packet .payload , flowContext.packet .payload_len ));
244257 if (pluginData->requestParsed && pluginData->responseParsed ) {
245258 return {
246259 .updateRequirement = UpdateRequirement::NoUpdateNeeded,
247260 .flowAction = FlowAction::NoAction,
248261 };
249262 }
250-
263+
251264 return {
252265 .updateRequirement = UpdateRequirement::RequiresUpdate,
253266 .flowAction = FlowAction::NoAction,
254267 };
255268}
256269
257- void HTTPPlugin::onDestroy (void * pluginContext)
270+ void HTTPPlugin::onDestroy (void * pluginContext)
258271{
259272 std::destroy_at (reinterpret_cast <HTTPData*>(pluginContext));
260273}
@@ -267,7 +280,9 @@ PluginDataMemoryLayout HTTPPlugin::getDataMemoryLayout() const noexcept
267280 };
268281}
269282
270- static const PluginRegistrar<HTTPPlugin, PluginFactory<ProcessPlugin, const std::string&, FieldManager&>>
283+ static const PluginRegistrar<
284+ HTTPPlugin,
285+ PluginFactory<ProcessPlugin, const std::string&, FieldManager&>>
271286 httpPluginRegistrar (httpPluginManifest);
272287
273288} // namespace ipxp
0 commit comments