Skip to content

Commit 7773d07

Browse files
authored
Fix SSDP Discovery reliability (#756)
1 parent 253cd18 commit 7773d07

File tree

1 file changed

+70
-65
lines changed

1 file changed

+70
-65
lines changed

libsrc/ssdp/SSDPDiscover.cpp

Lines changed: 70 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -42,83 +42,88 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin
4242
// search
4343
sendSearch(st);
4444

45-
_udpSocket->waitForReadyRead(timeout_ms);
46-
47-
while (_udpSocket->hasPendingDatagrams())
45+
if ( _udpSocket->waitForReadyRead(timeout_ms) )
4846
{
49-
QByteArray datagram;
50-
datagram.resize(_udpSocket->pendingDatagramSize());
51-
QHostAddress sender;
52-
quint16 senderPort;
53-
54-
_udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
55-
56-
QString data(datagram);
47+
while (_udpSocket->waitForReadyRead(500))
48+
{
49+
QByteArray datagram;
50+
while (_udpSocket->hasPendingDatagrams())
51+
{
5752

58-
Debug(_log, "_data: [%s]", QSTRING_CSTR(data));
53+
datagram.resize(_udpSocket->pendingDatagramSize());
54+
QHostAddress sender;
55+
quint16 senderPort;
5956

60-
QMap<QString,QString> headers;
61-
QString address;
62-
// parse request
63-
QStringList entries = data.split("\n", QString::SkipEmptyParts);
64-
for(auto entry : entries)
65-
{
66-
// http header parse skip
67-
if(entry.contains("HTTP/1.1"))
68-
continue;
57+
_udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
6958

70-
// split into key:vale, be aware that value field may contain also a ":"
71-
entry = entry.simplified();
72-
int pos = entry.indexOf(":");
73-
if(pos == -1)
74-
continue;
59+
QString data(datagram);
7560

76-
headers[entry.left(pos).trimmed().toLower()] = entry.mid(pos+1).trimmed();
77-
}
61+
Debug(_log, "_data: [%s]", QSTRING_CSTR(data));
7862

79-
// verify ssdp spec
80-
if(!headers.contains("st"))
81-
continue;
63+
QMap<QString,QString> headers;
64+
QString address;
65+
// parse request
66+
QStringList entries = data.split("\n", QString::SkipEmptyParts);
67+
for(auto entry : entries)
68+
{
69+
// http header parse skip
70+
if(entry.contains("HTTP/1.1"))
71+
continue;
8272

83-
// usn duplicates
84-
if (_usnList.contains(headers.value("usn")))
85-
continue;
73+
// split into key:vale, be aware that value field may contain also a ":"
74+
entry = entry.simplified();
75+
int pos = entry.indexOf(":");
76+
if(pos == -1)
77+
continue;
8678

87-
if (headers.value("st") == _searchTarget)
88-
{
89-
_usnList << headers.value("usn");
90-
QUrl url(headers.value("location"));
91-
//Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st")));
92-
if(type == STY_WEBSERVER)
93-
{
94-
Debug(_log, "Found service [%s] at: %s:%d", QSTRING_CSTR(st), QSTRING_CSTR(url.host()), url.port());
79+
headers[entry.left(pos).trimmed().toLower()] = entry.mid(pos+1).trimmed();
80+
}
9581

96-
return url.host()+":"+QString::number(url.port());
97-
}
98-
else if(type == STY_FLATBUFSERVER)
99-
{
100-
const QString fbsport = headers.value("hyperion-fbs-port");
101-
if(fbsport.isEmpty())
102-
{
82+
// verify ssdp spec
83+
if(!headers.contains("st"))
10384
continue;
104-
}
105-
else
106-
{
107-
Debug(_log, "Found service [%s] at: %s:%s", QSTRING_CSTR(st), QSTRING_CSTR(url.host()), QSTRING_CSTR(fbsport));
108-
return url.host()+":"+fbsport;
109-
}
110-
}
111-
else if(type == STY_JSONSERVER)
112-
{
113-
const QString jssport = headers.value("hyperion-jss-port");
114-
if(jssport.isEmpty())
115-
{
85+
86+
// usn duplicates
87+
if (_usnList.contains(headers.value("usn")))
11688
continue;
117-
}
118-
else
89+
90+
if (headers.value("st") == _searchTarget)
11991
{
120-
Debug(_log, "Found service at: %s:%s", QSTRING_CSTR(url.host()), QSTRING_CSTR(jssport));
121-
return url.host()+":"+jssport;
92+
_usnList << headers.value("usn");
93+
QUrl url(headers.value("location"));
94+
//Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st")));
95+
if(type == STY_WEBSERVER)
96+
{
97+
Debug(_log, "Found service [%s] at: %s:%d", QSTRING_CSTR(st), QSTRING_CSTR(url.host()), url.port());
98+
99+
return url.host()+":"+QString::number(url.port());
100+
}
101+
else if(type == STY_FLATBUFSERVER)
102+
{
103+
const QString fbsport = headers.value("hyperion-fbs-port");
104+
if(fbsport.isEmpty())
105+
{
106+
continue;
107+
}
108+
else
109+
{
110+
Debug(_log, "Found service [%s] at: %s:%s", QSTRING_CSTR(st), QSTRING_CSTR(url.host()), QSTRING_CSTR(fbsport));
111+
return url.host()+":"+fbsport;
112+
}
113+
}
114+
else if(type == STY_JSONSERVER)
115+
{
116+
const QString jssport = headers.value("hyperion-jss-port");
117+
if(jssport.isEmpty())
118+
{
119+
continue;
120+
}
121+
else
122+
{
123+
Debug(_log, "Found service at: %s:%s", QSTRING_CSTR(url.host()), QSTRING_CSTR(jssport));
124+
return url.host()+":"+jssport;
125+
}
126+
}
122127
}
123128
}
124129
}

0 commit comments

Comments
 (0)