Przeglądaj źródła

Answer dangling publish requests after removing the last subscription; Pass one more CTT test

Julius Pfrommer 8 lat temu
rodzic
commit
eb47649898
3 zmienionych plików z 23 dodań i 0 usunięć
  1. 4 0
      src/server/ua_server_binary.c
  2. 17 0
      src/ua_session.c
  3. 2 0
      src/ua_session.h

+ 4 - 0
src/server/ua_server_binary.c

@@ -510,6 +510,10 @@ processRequest(UA_SecureChannel *channel, UA_Server *server, UA_UInt32 requestId
     /* Clean up */
     UA_deleteMembers(request, requestType);
     UA_deleteMembers(response, responseType);
+
+    /* See if we need to return publish requests without a subscription */
+    if(responseType == &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE])
+        UA_Session_answerPublishRequestsWithoutSubscription(session);
 }
 
 /* MSG -> Normal request */

+ 17 - 0
src/ua_session.c

@@ -104,5 +104,22 @@ UA_UInt32 UA_Session_getUniqueSubscriptionID(UA_Session *session) {
     return ++(session->lastSubscriptionID);
 }
 
+void UA_Session_answerPublishRequestsWithoutSubscription(UA_Session *session) {
+    /* Do we have publish requests but no subscriptions? */
+    if(LIST_FIRST(&session->serverSubscriptions))
+        return;
+
+    /* Send a response for every queued request */
+    UA_PublishResponseEntry *pre;
+    while((pre = SIMPLEQ_FIRST(&session->responseQueue))) {
+        SIMPLEQ_REMOVE_HEAD(&session->responseQueue, listEntry);
+        UA_PublishResponse *response = &pre->response;
+        UA_UInt32 requestId = pre->requestId;
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOSUBSCRIPTION;
+        UA_SecureChannel_sendBinaryMessage(session->channel, requestId, response,
+                                           &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
+        UA_free(pre);
+    }
+}
 
 #endif

+ 2 - 0
src/ua_session.h

@@ -67,6 +67,8 @@ UA_Session_deleteSubscription(UA_Server *server, UA_Session *session,
 
 UA_UInt32
 UA_Session_getUniqueSubscriptionID(UA_Session *session);
+
+void UA_Session_answerPublishRequestsWithoutSubscription(UA_Session *session);
 #endif
 
 /**