Fix duplicate subscriber startup and validate reconnect handshakes · sttp/cppapi@07c8327 · GitHub
Skip to content

Commit 07c8327

Browse files
Fix duplicate subscriber startup and validate reconnect handshakes
1 parent dd95b9f commit 07c8327

8 files changed

Lines changed: 439 additions & 20 deletions

File tree

‎src/CMakeLists.txt‎

Lines changed: 5 additions & 0 deletions

‎src/lib/transport/SubscriberInstance.cpp‎

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,25 @@ void SubscriberInstance::HandleConnect()
210210
m_subscriber->Subscribe();
211211
}
212212

213+
bool SubscriberInstance::CompleteConnection()
214+
{
215+
if (m_subscriber->GetVersion() > 2 && !m_subscriber->WaitForOperationalModesResponse(m_operationalModesResponseTimeout))
216+
{
217+
ErrorMessage("Timed out waiting for define operational modes response, cancelling automated connection steps...");
218+
return false;
219+
}
220+
221+
if (!m_subscriber->IsValidated())
222+
{
223+
ErrorMessage("Data publisher rejected connection, cancelling automated connection steps...");
224+
return false;
225+
}
226+
227+
ConnectionEstablished();
228+
HandleConnect();
229+
return true;
230+
}
231+
213232
void SubscriberInstance::SetupSubscriptionInfo()
214233
{
215234
m_subscriptionInfo = CreateSubscriptionInfo();
@@ -255,22 +274,7 @@ bool SubscriberInstance::Connect()
255274

256275
if (result == SubscriberConnector::ConnectSuccess)
257276
{
258-
if (m_subscriber->GetVersion() > 2 && !m_subscriber->WaitForOperationalModesResponse(m_operationalModesResponseTimeout))
259-
{
260-
ErrorMessage("Timed out waiting for define operational modes response, cancelling automated connection steps...");
261-
return false;
262-
}
263-
264-
if (!m_subscriber->IsValidated())
265-
{
266-
ErrorMessage("Data publisher rejected connection, cancelling automated connection steps...");
267-
return false;
268-
}
269-
270-
ConnectionEstablished();
271-
HandleConnect();
272-
273-
return true;
277+
return CompleteConnection();
274278
}
275279

276280
if (result == SubscriberConnector::ConnectFailed)
@@ -1344,8 +1348,7 @@ void SubscriberInstance::HandleResubscribe(DataSubscriber* source)
13441348

13451349
if (source->IsConnected())
13461350
{
1347-
instance->ConnectionEstablished();
1348-
instance->HandleConnect();
1351+
instance->CompleteConnection();
13491352
}
13501353
else
13511354
{
@@ -1456,8 +1459,17 @@ void SubscriberInstance::HandleConnectionEstablished(const DataSubscriber* sourc
14561459
if (instance == nullptr)
14571460
return;
14581461

1459-
instance->ConnectionEstablished();
1460-
instance->HandleConnect();
1462+
// Outbound connections complete in Connect or HandleResubscribe after the
1463+
// connector returns. Only reverse connections start from this callback.
1464+
if (source->IsListening())
1465+
{
1466+
// The accept thread also services socket I/O for reverse connections.
1467+
// Wait on the callback thread so it can receive the handshake response.
1468+
instance->m_subscriber->Dispatch([instance](DataSubscriber*, const vector<uint8_t>&)
1469+
{
1470+
instance->CompleteConnection();
1471+
});
1472+
}
14611473
}
14621474

14631475
void SubscriberInstance::HandleConnectionTerminated(const DataSubscriber* source)

‎src/lib/transport/SubscriberInstance.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ namespace sttp::transport
5757
void* m_userData;
5858

5959
void HandleConnect();
60+
bool CompleteConnection();
6061
void SetupSubscriptionInfo();
6162
void SendMetadataRefreshCommand();
6263

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# SubscriberStartupTest
2+
3+
A local loopback publisher checks that each connection produces one connection event and one metadata request/subscription sequence. No external STTP publisher is required.
4+
5+
Coverage includes outbound initial connection and automatic reconnect, reverse connections, protocol versions 2 and 3, metadata parsing enabled/disabled, delayed acceptance, rejection, and handshake timeout.
6+
7+
Build with the included Visual Studio project or build.cmd on Windows. With CMake, build target SubscriberStartupTest and run Samples/SubscriberStartupTest. A successful run prints twelve PASS lines and exits with code 0.
Lines changed: 175 additions & 0 deletions

0 commit comments

Comments
 (0)