#endif
HTTPConnector::HTTPConnector(std::map<std::string,std::string> options): d_socket(nullptr) {
+
+ if (options.find("url") == options.end()) {
+ throw PDNSException("Cannot find 'url' option in the remote backend HTTP connector's parameters");
+ }
+
this->d_url = options.find("url")->second;
+
+ try {
+ YaHTTP::URL url(d_url);
+ d_host = url.host;
+ d_port = url.port;
+ }
+ catch(const std::exception& e) {
+ throw PDNSException("Error parsing the 'url' option provided to the remote backend HTTP connector: " + std::string(e.what()));
+ }
+
if (options.find("url-suffix") != options.end()) {
this->d_url_suffix = options.find("url-suffix")->second;
} else {
this->d_socket.reset();
- if (req.url.protocol == "unix") {
- // connect using unix socket
- } else {
- // connect using tcp
- struct addrinfo *gAddr, *gAddrPtr, hints;
- std::string sPort = std::to_string(req.url.port);
- memset(&hints,0,sizeof hints);
- hints.ai_family = AF_UNSPEC;
- hints.ai_flags = AI_ADDRCONFIG;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = 6; // tcp
- if ((ec = getaddrinfo(req.url.host.c_str(), sPort.c_str(), &hints, &gAddr)) == 0) {
- // try to connect to each address.
- gAddrPtr = gAddr;
-
- while(gAddrPtr) {
- try {
- d_socket = std::unique_ptr<Socket>(new Socket(gAddrPtr->ai_family, gAddrPtr->ai_socktype, gAddrPtr->ai_protocol));
- d_addr.setSockaddr(gAddrPtr->ai_addr, gAddrPtr->ai_addrlen);
- d_socket->connect(d_addr);
- d_socket->setNonBlocking();
- d_socket->writenWithTimeout(out.str().c_str(), out.str().size(), timeout);
- rv = 1;
- } catch (NetworkError& ne) {
- g_log<<Logger::Error<<"While writing to HTTP endpoint "<<d_addr.toStringWithPort()<<": "<<ne.what()<<std::endl;
- } catch (...) {
- g_log<<Logger::Error<<"While writing to HTTP endpoint "<<d_addr.toStringWithPort()<<": exception caught"<<std::endl;
- }
-
- if (rv > -1) break;
- d_socket.reset();
- gAddrPtr = gAddrPtr->ai_next;
-
+ // connect using tcp
+ struct addrinfo *gAddr, *gAddrPtr, hints;
+ std::string sPort = std::to_string(d_port);
+ memset(&hints,0,sizeof hints);
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_flags = AI_ADDRCONFIG;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ if ((ec = getaddrinfo(d_host.c_str(), sPort.c_str(), &hints, &gAddr)) == 0) {
+ // try to connect to each address.
+ gAddrPtr = gAddr;
+
+ while(gAddrPtr) {
+ try {
+ d_socket = std::unique_ptr<Socket>(new Socket(gAddrPtr->ai_family, gAddrPtr->ai_socktype, gAddrPtr->ai_protocol));
+ d_addr.setSockaddr(gAddrPtr->ai_addr, gAddrPtr->ai_addrlen);
+ d_socket->connect(d_addr);
+ d_socket->setNonBlocking();
+ d_socket->writenWithTimeout(out.str().c_str(), out.str().size(), timeout);
+ rv = 1;
+ } catch (NetworkError& ne) {
+ g_log<<Logger::Error<<"While writing to HTTP endpoint "<<d_addr.toStringWithPort()<<": "<<ne.what()<<std::endl;
+ } catch (...) {
+ g_log<<Logger::Error<<"While writing to HTTP endpoint "<<d_addr.toStringWithPort()<<": exception caught"<<std::endl;
}
- freeaddrinfo(gAddr);
- } else {
- g_log<<Logger::Error<<"Unable to resolve " << req.url.host << ": " << gai_strerror(ec) << std::endl;
+
+ if (rv > -1) break;
+ d_socket.reset();
+ gAddrPtr = gAddrPtr->ai_next;
}
+ freeaddrinfo(gAddr);
+ } else {
+ g_log<<Logger::Error<<"Unable to resolve " << d_host << ": " << gai_strerror(ec) << std::endl;
}
return rv;