@@ -202,6 +202,45 @@ Poco::Net::SocketAddress DNSResolver::resolveAddress(const std::string & host, U
202202 return Poco::Net::SocketAddress (impl->cache_host (host).front (), port);
203203}
204204
205+ std::pair<Poco::Net::IPAddress, std::optional<UInt16>> DNSResolver::resolveHostOrAddress (const std::string & host_and_port)
206+ {
207+ Poco::Net::IPAddress ip;
208+
209+ size_t number_of_colons = std::count (host_and_port.begin (), host_and_port.end (), ' :' );
210+ if (number_of_colons > 1 )
211+ {
212+ // / IPv6 host
213+ if (host_and_port.starts_with (' [' ))
214+ {
215+ size_t close_bracket_pos = host_and_port.find (' ]' );
216+ assert (close_bracket_pos != std::string::npos);
217+ ip = resolveHost (host_and_port.substr (0 , close_bracket_pos));
218+
219+ if (close_bracket_pos == host_and_port.size () - 1 )
220+ return {ip, std::nullopt };
221+ if (host_and_port[close_bracket_pos + 1 ] != ' :' )
222+ throw Exception (" Missing delimiter between host and port" , ErrorCodes::BAD_ARGUMENTS);
223+
224+ unsigned int port;
225+ if (!Poco::NumberParser::tryParseUnsigned (host_and_port.substr (close_bracket_pos + 2 ), port))
226+ throw Exception (" Port must be numeric" , ErrorCodes::BAD_ARGUMENTS);
227+ if (port > 0xFFFF )
228+ throw Exception (" Port must be less 0xFFFF" , ErrorCodes::BAD_ARGUMENTS);
229+ return {ip, port};
230+ }
231+ return {resolveHost (host_and_port), std::nullopt };
232+ }
233+ else if (number_of_colons == 1 )
234+ {
235+ // / IPv4 host with port
236+ Poco::Net::SocketAddress socket = resolveAddress (host_and_port);
237+ return {socket.host (), socket.port ()};
238+ }
239+
240+ // / IPv4 host
241+ return {resolveHost (host_and_port), std::nullopt };
242+ }
243+
205244String DNSResolver::reverseResolve (const Poco::Net::IPAddress & address)
206245{
207246 if (impl->disable_cache )
0 commit comments