diff --git a/libsrc/ssdp/SSDPDiscover.cpp b/libsrc/ssdp/SSDPDiscover.cpp index 9cd203f5..c607d159 100644 --- a/libsrc/ssdp/SSDPDiscover.cpp +++ b/libsrc/ssdp/SSDPDiscover.cpp @@ -12,7 +12,7 @@ static const quint16 SSDP_PORT(1900); static const QString UPNP_DISCOVER_MESSAGE = "M-SEARCH * HTTP/1.1\r\n" "HOST: 239.255.255.250:1900\r\n" "MAN: \"ssdp:discover\"\r\n" - "MX: 1\r\n" + "MX: 1\r\n" "ST: %1\r\n" "\r\n"; @@ -49,7 +49,6 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin QByteArray datagram; while (_udpSocket->hasPendingDatagrams()) { - datagram.resize(_udpSocket->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; @@ -163,13 +162,15 @@ void SSDPDiscover::readPendingDatagrams() if(entry.contains("HTTP/1.1")) continue; - // split into key:vale, be aware that value field may contain also a ":" + // split into key:value, be aware that value field may contain also a ":" entry = entry.simplified(); int pos = entry.indexOf(":"); if(pos == -1) continue; - headers[entry.left(pos).trimmed().toLower()] = entry.mid(pos+1).trimmed(); + const QString key = entry.left(pos).trimmed().toLower(); + const QString value = entry.mid(pos + 1).trimmed(); + headers[key] = value; } // verify ssdp spec @@ -185,7 +186,7 @@ void SSDPDiscover::readPendingDatagrams() _usnList << headers.value("usn"); //Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st"))); QUrl url(headers.value("location")); - emit newService(url.host()+":"+QString::number(url.port())); + emit newService(url.host() + ":" + QString::number(url.port())); } } } @@ -194,7 +195,5 @@ void SSDPDiscover::sendSearch(const QString& st) { const QString msg = UPNP_DISCOVER_MESSAGE.arg(st); - _udpSocket->writeDatagram(msg.toUtf8(), - QHostAddress(SSDP_ADDR), - SSDP_PORT); + _udpSocket->writeDatagram(msg.toUtf8(), QHostAddress(SSDP_ADDR), SSDP_PORT); } diff --git a/libsrc/ssdp/SSDPHandler.cpp b/libsrc/ssdp/SSDPHandler.cpp index 04944a4f..a72d455e 100644 --- a/libsrc/ssdp/SSDPHandler.cpp +++ b/libsrc/ssdp/SSDPHandler.cpp @@ -150,13 +150,28 @@ const QString SSDPHandler::getLocalAddress() void SSDPHandler::handleMSearchRequest(const QString& target, const QString& mx, const QString address, const quint16 & port) { - // TODO Response delay according to MX field (sec) random between 0 and MX + const auto respond = [=] () { + // when searched for all devices / root devices / basic device + if(target == "ssdp:all") + sendMSearchResponse(SSDP_HYPERION_ST, address, port); + else if(target == "upnp:rootdevice" || target == "urn:schemas-upnp-org:device:basic:1" || target == SSDP_HYPERION_ST) + sendMSearchResponse(target, address, port); + }; - // when searched for all devices / root devices / basic device - if(target == "ssdp:all") - sendMSearchResponse(SSDP_HYPERION_ST, address, port); - else if(target == "upnp:rootdevice" || target == "urn:schemas-upnp-org:device:basic:1" || target == SSDP_HYPERION_ST) - sendMSearchResponse(target, address, port); + bool ok = false; + int maxDelay = mx.toInt(&ok); + if (ok) + { + /* Pick a random delay between 0 and MX seconds */ + int randomDelay = qrand() % (maxDelay * 1000); + QTimer::singleShot(randomDelay, respond); + } + else + { + /* MX Header is not valid. + * Send response without delay */ + respond(); + } } const QString SSDPHandler::getDescAddress() diff --git a/libsrc/ssdp/SSDPServer.cpp b/libsrc/ssdp/SSDPServer.cpp index 4ff6f3aa..8845c1a1 100644 --- a/libsrc/ssdp/SSDPServer.cpp +++ b/libsrc/ssdp/SSDPServer.cpp @@ -163,8 +163,8 @@ void SSDPServer::readPendingDatagrams() if (headers.value("man") == "\"ssdp:discover\"") { - //Debug(_log, "Received msearch from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st"))); - emit msearchRequestReceived(headers.value("st"), headers.value("mx"), sender.toString(), senderPort); + //Debug(_log, "Received msearch from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st"))); + emit msearchRequestReceived(headers.value("st"), headers.value("mx"), sender.toString(), senderPort); } } } @@ -181,9 +181,7 @@ void SSDPServer::sendMSearchResponse(const QString& st, const QString& senderIp, , _jssPort , _name ); - _udpSocket->writeDatagram(message.toUtf8(), - QHostAddress(senderIp), - senderPort); + _udpSocket->writeDatagram(message.toUtf8(), QHostAddress(senderIp), senderPort); } void SSDPServer::sendByeBye(const QString& st) @@ -192,11 +190,8 @@ void SSDPServer::sendByeBye(const QString& st) // we repeat 3 times quint8 rep = 0; - while(rep < 3) { - _udpSocket->writeDatagram(message.toUtf8(), - QHostAddress(SSDP_ADDR), - SSDP_PORT); - rep++; + while(rep++ < 3) { + _udpSocket->writeDatagram(message.toUtf8(), QHostAddress(SSDP_ADDR), SSDP_PORT); } } @@ -215,11 +210,8 @@ void SSDPServer::sendAlive(const QString& st) // we repeat 3 times quint8 rep = 0; - while(rep < 3) { - _udpSocket->writeDatagram(message.toUtf8(), - QHostAddress(SSDP_ADDR), - SSDP_PORT); - rep++; + while(rep++ < 3) { + _udpSocket->writeDatagram(message.toUtf8(), QHostAddress(SSDP_ADDR), SSDP_PORT); } } @@ -229,7 +221,5 @@ void SSDPServer::sendUpdate(const QString& st) , st , _uuid+"::"+st ); - _udpSocket->writeDatagram(message.toUtf8(), - QHostAddress(SSDP_ADDR), - SSDP_PORT); + _udpSocket->writeDatagram(message.toUtf8(), QHostAddress(SSDP_ADDR), SSDP_PORT); }