summaryrefslogtreecommitdiff
path: root/redfish-core/lib
diff options
context:
space:
mode:
Diffstat (limited to 'redfish-core/lib')
-rw-r--r--redfish-core/lib/event_service.hpp49
1 files changed, 11 insertions, 38 deletions
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index 04b46e0cdd..2b63955009 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -18,6 +18,8 @@
#include <app.hpp>
#include <boost/beast/http/fields.hpp>
+#include <http/utility.hpp>
+#include <logging.hpp>
#include <query.hpp>
#include <registries/privilege_registry.hpp>
@@ -266,56 +268,27 @@ inline void requestRoutesEventDestinationCollection(App& app)
}
}
- // Validate the URL using regex expression
- // Format: <protocol>://<host>:<port>/<uri>
- // protocol: http/https
- // host: Exclude ' ', ':', '#', '?'
- // port: Empty or numeric value with ':' separator.
- // uri: Start with '/' and Exclude '#', ' '
- // Can include query params(ex: '/event?test=1')
- // TODO: Need to validate hostname extensively(as per rfc)
- const std::regex urlRegex(
- "(http|https)://([^/\\x20\\x3f\\x23\\x3a]+):?([0-9]*)(/"
- "([^\\x20\\x23\\x3f]*\\x3f?([^\\x20\\x23\\x3f])*)?)");
- std::cmatch match;
- if (!std::regex_match(destUrl.c_str(), match, urlRegex))
- {
- messages::propertyValueFormatError(asyncResp->res, destUrl,
- "Destination");
- return;
- }
+ std::string host;
+ std::string urlProto;
+ uint16_t port = 0;
+ std::string path;
- std::string uriProto = std::string(match[1].first, match[1].second);
- if (uriProto == "http")
+ if (!crow::utility::validateAndSplitUrl(destUrl, urlProto, host,
+ port, path))
{
-#ifndef BMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING
+ BMCWEB_LOG_WARNING
+ << "Failed to validate and split destination url";
messages::propertyValueFormatError(asyncResp->res, destUrl,
"Destination");
return;
-#endif
}
- std::string host = std::string(match[2].first, match[2].second);
- std::string port = std::string(match[3].first, match[3].second);
- std::string path = std::string(match[4].first, match[4].second);
- if (port.empty())
- {
- if (uriProto == "http")
- {
- port = "80";
- }
- else
- {
- port = "443";
- }
- }
if (path.empty())
{
path = "/";
}
-
std::shared_ptr<Subscription> subValue =
- std::make_shared<Subscription>(host, port, path, uriProto);
+ std::make_shared<Subscription>(host, port, path, urlProto);
subValue->destinationUrl = destUrl;