diff options
Diffstat (limited to 'redfish-core/lib')
-rw-r--r-- | redfish-core/lib/event_service.hpp | 49 |
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; |