From da873b4a3742a0431ff6c38a91b22d082a653d2d Mon Sep 17 00:00:00 2001
From: kharade <rohan.kharade@openairinterface.org>
Date: Tue, 7 Sep 2021 10:45:27 +0200
Subject: [PATCH] maintain http version of subscription

---
 src/nrf_app/nrf_app.cpp          | 23 ++++++++++++++---------
 src/nrf_app/nrf_app.hpp          |  2 +-
 src/nrf_app/nrf_client.cpp       | 27 +++++++++++++++++++--------
 src/nrf_app/nrf_client.hpp       |  6 +++---
 src/nrf_app/nrf_subscription.cpp | 10 ++++++++++
 src/nrf_app/nrf_subscription.hpp | 13 +++++++++++++
 6 files changed, 60 insertions(+), 21 deletions(-)

diff --git a/src/nrf_app/nrf_app.cpp b/src/nrf_app/nrf_app.cpp
index 51be173..5a4af0c 100644
--- a/src/nrf_app/nrf_app.cpp
+++ b/src/nrf_app/nrf_app.cpp
@@ -432,7 +432,7 @@ void nrf_app::handle_create_subscription(
       // generate a subscription ID
       generate_ev_subscription_id(evsub_id);
       ss.get()->set_subscription_id(evsub_id);
-
+      ss.get()->set_http_version(http_version);
       // subscribe to NF status registered
       // subscribe_nf_status(evsub_id);  // from nrf_app
       // subscribe to NF status
@@ -471,7 +471,7 @@ void nrf_app::handle_create_subscription(
         for (auto p : profiles) {
           // send notifications
           nrf_client_inst->notify_subscribed_event(
-              p, NOTIFICATION_TYPE_NF_REGISTERED, notification_uris);
+              p, NOTIFICATION_TYPE_NF_REGISTERED, notification_uris, http_version);
         }
       }
 
@@ -1025,12 +1025,13 @@ void nrf_app::handle_nf_status_registered(const std::string& profile_id) {
   find_nf_profile(profile_id, profile);
   if (profile.get() != nullptr) {
     std::vector<std::string> notification_uris = {};
+    uint8_t httpVersion = 1;
     get_subscription_list(
-        profile_id, NOTIFICATION_TYPE_NF_REGISTERED, notification_uris);
+        profile_id, NOTIFICATION_TYPE_NF_REGISTERED, notification_uris, httpVersion);
     // send notifications
     if (notification_uris.size() > 0)
       nrf_client_inst->notify_subscribed_event(
-          profile, NOTIFICATION_TYPE_NF_REGISTERED, notification_uris);
+          profile, NOTIFICATION_TYPE_NF_REGISTERED, notification_uris, httpVersion);
     else
       Logger::nrf_app().debug("\tNo subscription found");
 
@@ -1056,13 +1057,14 @@ void nrf_app::handle_nf_status_deregistered(
       p.get()->get_nf_instance_id().c_str());
 
   std::vector<std::string> notification_uris = {};
+  uint8_t http_version = 1;
   get_subscription_list(
       p.get()->get_nf_instance_id(), NOTIFICATION_TYPE_NF_DEREGISTERED,
-      notification_uris);
+      notification_uris, http_version);
   // send notifications
   if (notification_uris.size() > 0)
     nrf_client_inst->notify_subscribed_event(
-        p, NOTIFICATION_TYPE_NF_DEREGISTERED, notification_uris);
+        p, NOTIFICATION_TYPE_NF_DEREGISTERED, notification_uris, http_version);
   else
     Logger::nrf_app().debug("\tNo subscription found");
 }
@@ -1085,14 +1087,15 @@ void nrf_app::handle_nf_status_profile_changed(const std::string& profile_id) {
   find_nf_profile(profile_id, profile);
   if (profile.get() != nullptr) {
     std::vector<std::string> notification_uris = {};
+    uint8_t http_version = 1;
     get_subscription_list(
-        profile_id, NOTIFICATION_TYPE_NF_PROFILE_CHANGED, notification_uris);
+        profile_id, NOTIFICATION_TYPE_NF_PROFILE_CHANGED, notification_uris, http_version);
     // Notification data includes NF profile (other alternative, includes
     // profile_changes)
     // send notifications
     if (notification_uris.size() > 0)
       nrf_client_inst->notify_subscribed_event(
-          profile, NOTIFICATION_TYPE_NF_PROFILE_CHANGED, notification_uris);
+          profile, NOTIFICATION_TYPE_NF_PROFILE_CHANGED, notification_uris, http_version);
     else
       Logger::nrf_app().debug("\tNo subscription found");
   } else {
@@ -1104,7 +1107,7 @@ void nrf_app::handle_nf_status_profile_changed(const std::string& profile_id) {
 //------------------------------------------------------------------------------
 void nrf_app::get_subscription_list(
     const std::string& profile_id, const uint8_t& notification_type,
-    std::vector<std::string>& uris) const {
+    std::vector<std::string>& uris, uint8_t& http_version) const {
   Logger::nrf_app().info(
       "\tGet the list of subscriptions related to this profile, profile id %s",
       profile_id.c_str());
@@ -1123,6 +1126,8 @@ void nrf_app::get_subscription_list(
     std::string uri;
     s.second.get()->get_notification_uri(uri);
 
+    http_version = s.second.get()->get_http_version();
+
     // check notification event type
     bool match_notif_type = false;
     for (auto i : s.second.get()->get_notif_events()) {
diff --git a/src/nrf_app/nrf_app.hpp b/src/nrf_app/nrf_app.hpp
index cc5ee7c..31a66d5 100644
--- a/src/nrf_app/nrf_app.hpp
+++ b/src/nrf_app/nrf_app.hpp
@@ -409,7 +409,7 @@ class nrf_app {
    */
   void get_subscription_list(
       const std::string& profile_id, const uint8_t& notification_type,
-      std::vector<std::string>& uris) const;
+      std::vector<std::string>& uris, uint8_t& http_version) const;
 
   /*
    * Verify whether the requester is allowed to discover the NF services
diff --git a/src/nrf_app/nrf_client.cpp b/src/nrf_app/nrf_client.cpp
index 251a0c7..786599f 100644
--- a/src/nrf_app/nrf_client.cpp
+++ b/src/nrf_app/nrf_client.cpp
@@ -88,8 +88,8 @@ nrf_client::~nrf_client() {
 
 //------------------------------------------------------------------------------
 CURL* nrf_client::curl_create_handle(
-    const std::string& uri, const std::string& data,
-    std::string& response_data) {
+    const std::string& uri, const std::string& data, std::string& response_data,
+    uint8_t http_version) {
   // create handle for a curl request
   CURL* curl = curl_easy_init();
 
@@ -106,17 +106,26 @@ CURL* nrf_client::curl_create_handle(
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
     curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.length());
     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
+    if (http_version == 2) {
+      curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+      // curl_easy_setopt(curl, CURLOPT_PORT, 8080);
+      // We use a self-signed test server, skip verification during debugging
+      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+      curl_easy_setopt(
+          curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE);
+    }
   }
   return curl;
 }
 
 //------------------------------------------------------------------------------
 void nrf_client::send_curl_multi(
-    const std::string& uri, const std::string& data,
-    std::string& response_data) {
+    const std::string& uri, const std::string& data, std::string& response_data,
+    uint8_t http_version) {
   // create a new handle and add to the multi handle
   // the curl will actually be sent in perform_curl_multi
-  CURL* tmp = curl_create_handle(uri, data, response_data);
+  CURL* tmp = curl_create_handle(uri, data, response_data, http_version);
   curl_multi_add_handle(curl_multi, tmp);
   handles.push_back(tmp);
 }
@@ -209,9 +218,11 @@ void nrf_client::curl_release_handles() {
 //------------------------------------------------------------------------------
 void nrf_client::notify_subscribed_event(
     const std::shared_ptr<nrf_profile>& profile, const uint8_t& event_type,
-    const std::vector<std::string>& uris) {
+    const std::vector<std::string>& uris, uint8_t http_version) {
   Logger::nrf_app().debug(
-      "Send notification for the subscribed event to the subscriptions");
+      "Send notification for the subscribed event to the subscriptions (HTTP "
+      "VERSION %d)",
+      http_version);
 
   std::map<std::string, std::string> responses = {};
   // Fill the json part
@@ -255,7 +266,7 @@ void nrf_client::notify_subscribed_event(
   for (auto uri : uris) {
     responses[uri] = "";
     std::unique_ptr<std::string> httpData(new std::string());
-    send_curl_multi(uri, body, responses[uri]);
+    send_curl_multi(uri, body, responses[uri], http_version);
   }
 
   perform_curl_multi(
diff --git a/src/nrf_app/nrf_client.hpp b/src/nrf_app/nrf_client.hpp
index 748cf15..abb6daf 100644
--- a/src/nrf_app/nrf_client.hpp
+++ b/src/nrf_app/nrf_client.hpp
@@ -64,7 +64,7 @@ class nrf_client {
    */
   void notify_subscribed_event(
       const std::shared_ptr<nrf_profile>& profile, const uint8_t& event_type,
-      const std::vector<std::string>& uris);
+      const std::vector<std::string>& uris, uint8_t http_version);
 
   /*
    * Create Curl handle for multi curl
@@ -75,7 +75,7 @@ class nrf_client {
    */
   CURL* curl_create_handle(
       const std::string& uri, const std::string& data,
-      std::string& response_data);
+      std::string& response_data, uint8_t http_version);
 
   /*
    * Prepare to send a request using curl multi
@@ -86,7 +86,7 @@ class nrf_client {
    */
   void send_curl_multi(
       const std::string& uri, const std::string& data,
-      std::string& response_data);
+      std::string& response_data, uint8_t http_version);
 
   /*
    * Perform curl multi to actually process the available data
diff --git a/src/nrf_app/nrf_subscription.cpp b/src/nrf_app/nrf_subscription.cpp
index 947cdff..81acdbd 100644
--- a/src/nrf_app/nrf_subscription.cpp
+++ b/src/nrf_app/nrf_subscription.cpp
@@ -115,6 +115,16 @@ boost::posix_time::ptime nrf_subscription::get_validity_time() const {
   return validity_time;
 }
 
+//------------------------------------------------------------------------------
+void nrf_subscription::set_http_version(const uint8_t& httpVersion) {
+  http_version = httpVersion;
+}
+
+//------------------------------------------------------------------------------
+uint8_t nrf_subscription::get_http_version() const{
+  return http_version;
+}
+
 //------------------------------------------------------------------------------
 void nrf_subscription::display() {
   Logger::nrf_app().debug("Subscription information");
diff --git a/src/nrf_app/nrf_subscription.hpp b/src/nrf_app/nrf_subscription.hpp
index 2f4566e..98c3393 100644
--- a/src/nrf_app/nrf_subscription.hpp
+++ b/src/nrf_app/nrf_subscription.hpp
@@ -157,7 +157,19 @@ class nrf_subscription {
    * @return [boost::posix_time::ptime &] validity time
    */
   boost::posix_time::ptime get_validity_time() const;
+  /*
+   * Set the http_version
+   * @param [uint8_t&]: http_version: http_version
+   * @return void
+   */
+  void set_http_version(const uint8_t& http_version);
 
+  /*
+   * Get the http_version
+   * @param [void]
+   * @return http_version
+   */
+  uint8_t get_http_version() const;
   /*
    * Subscribe to be notified when a new NF registered to the NRF
    * @param void
@@ -188,6 +200,7 @@ class nrf_subscription {
   nrf_event& m_event_sub;
   bs2::connection ev_connection;
   boost::posix_time::ptime validity_time;
+  uint8_t http_version =1;
 };
 }  // namespace app
 }  // namespace nrf
-- 
GitLab