C++ Исходник Http requests (cloud cfg)

Начинающий
Статус
Оффлайн
Регистрация
12 Июл 2017
Сообщения
67
Реакции[?]
20
Поинты[?]
1K
Всем привет, вместо того чтобы подумать головой мне люди часто писали - "как сделать клауд кфг?:roflanzdarova:", скорее всего они увидели это хайповое название, и просто не стали вникать что это, и как оно работает.
Проект github -
Пожалуйста, авторизуйтесь для просмотра ссылки.


В первую очередь хочу сказать что все файлы конфигов хранят структурированную информацию, в основном это формат json.
Мы будем использовать json - общепринятый стандарт обмена данными между сервером и веб-приложением.

И так, нам понадобиться веб-сервер, который будет хранить наши файлы и принимать реквесты.
На стороне клиента также будем использовать библиотеку
Пожалуйста, авторизуйтесь для просмотра ссылки.
для создания реквестов на наш веб-сервер.

В c++
Пожалуйста, авторизуйтесь для просмотра ссылки.
имеет сериализованный тип строки, и для того чтобы отправить эту строку на сервер нам нужно:
Создать POST запрос с телом этой самой строки, в которую ранее мы записали наш кфг.

Я буду использовать вариант с использованием моего имени для дальнейшей работы с движком Xenforo.

C++:
void c_cfg::upload_cfg(const std::string user_name) {

   nlohmann::json json{};

   auto& object = json[ "cfg" ];

   for ( const auto& var : m_vars )
   var->save( object );

   auto str = json.dump( );

   try
   {
      http::Request request("http://01.01.01.101/json.php?username=" + user_name + "&upload");
      request.send("POST", str, {{"Content-Type", "application/json"} });
    }
    catch (const std::exception& e)
    {
      MessageBoxA(0, "request failed, error: ", e.what(), MB_OK);
      return;
    }

}
Теперь нужно чтобы наш веб-сервер смог принять этот запрос, и создал файл и записал в него информацию

PHP:
if ( isset( $_GET[ "username" ] ) )
{
    require( 'src/XF.php' );
    XF::start( $fileDir );
    $app = \XF::setupApp( 'XF\App' );

    $ip = $app->request->getIp( );

    $finder = \XF::finder( 'XF:User' );
    $user = $finder->where( 'username', $_GET[ "username" ] )->fetchOne( );

    -- создадим файл в директории 'data/cfg/' с id моего юзера от xf
    $file_directory = 'data/cfg/' . $user[ "user_id" ] . '.txt';

    if ( isset( $_GET[ "upload" ] ) ) {

        $input = json_decode(file_get_contents("php://input"), true);

        $f = fopen($file_directory, 'w');

        fwrite($f, json_encode($input));

        fclose($f);
    }
}
Для того чтобы получить строку json с сервера, нужно послать GET запрос, тогда в респонсе мы получим наш результат

C++:
std::string str{};

try
{
     http::Request request{ "http://01.01.01.101/json.php?username=" + user_name + "&get" };

     const auto response = request.send("GET");
     // наш результат
     str = std::string{ response.body.begin(), response.body.end() };
}
catch (const std::exception& e)
{
     MessageBoxA(0, "request failed, error: ", e.what(), MB_OK);
     return;
}
Серверная часть:
PHP:
else if ( isset( $_GET[ "get" ] ) ) {
     
     if(file_exists($file_directory)) {
           $homepage = file_get_contents($file_directory);
           echo $homepage;
     }
}
Как видим ничего сложного нету
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
12 Фев 2020
Сообщения
382
Реакции[?]
95
Поинты[?]
0
вместо того чтобы подумать головой мне люди часто писали - "как сделать клауд кфг?
советую больше с такими не общаться и игнорировать так как любая сказанная им информация будет бесполезной
 
Пользователь
Статус
Оффлайн
Регистрация
22 Май 2022
Сообщения
203
Реакции[?]
43
Поинты[?]
6K
Пользователь
Статус
Оффлайн
Регистрация
22 Май 2022
Сообщения
203
Реакции[?]
43
Поинты[?]
6K
Всем привет, вместо того чтобы подумать головой мне люди часто писали - "как сделать клауд кфг?:roflanzdarova:", скорее всего они увидели это хайповое название, и просто не стали вникать что это, и как оно работает.
Проект github -
Пожалуйста, авторизуйтесь для просмотра ссылки.


В первую очередь хочу сказать что все файлы конфигов хранят структурированную информацию, в основном это формат json.
Мы будем использовать json - общепринятый стандарт обмена данными между сервером и веб-приложением.

И так, нам понадобиться веб-сервер, который будет хранить наши файлы и принимать реквесты.
На стороне клиента также будем использовать библиотеку
Пожалуйста, авторизуйтесь для просмотра ссылки.
для создания реквестов на наш веб-сервер.

В c++
Пожалуйста, авторизуйтесь для просмотра ссылки.
имеет сериализованный тип строки, и для того чтобы отправить эту строку на сервер нам нужно:
Создать POST запрос с телом этой самой строки, в которую ранее мы записали наш кфг.

Я буду использовать вариант с использованием моего имени для дальнейшей работы с движком Xenforo.

C++:
void c_cfg::upload_cfg(const std::string user_name) {

   nlohmann::json json{};

   auto& object = json[ "cfg" ];

   for ( const auto& var : m_vars )
   var->save( object );

   auto str = json.dump( );

   try
   {
      http::Request request("http://01.01.01.101/json.php?username=" + user_name + "&upload");
      request.send("POST", str, {{"Content-Type", "application/json"} });
    }
    catch (const std::exception& e)
    {
      MessageBoxA(0, "request failed, error: ", e.what(), MB_OK);
      return;
    }

}
Теперь нужно чтобы наш веб-сервер смог принять этот запрос, и создал файл и записал в него информацию

PHP:
if ( isset( $_GET[ "username" ] ) )
{
    require( 'src/XF.php' );
    XF::start( $fileDir );
    $app = \XF::setupApp( 'XF\App' );

    $ip = $app->request->getIp( );

    $finder = \XF::finder( 'XF:User' );
    $user = $finder->where( 'username', $_GET[ "username" ] )->fetchOne( );

    -- создадим файл в директории 'data/cfg/' с id моего юзера от xf
    $file_directory = 'data/cfg/' . $user[ "user_id" ] . '.txt';

    if ( isset( $_GET[ "upload" ] ) ) {

        $input = json_decode(file_get_contents("php://input"), true);

        $f = fopen($file_directory, 'w');

        fwrite($f, json_encode($input));

        fclose($f);
    }
}
Для того чтобы получить строку json с сервера, нужно послать GET запрос, тогда в респонсе мы получим наш результат

C++:
std::string str{};

try
{
     http::Request request{ "http://01.01.01.101/json.php?username=" + user_name + "&get" };

     const auto response = request.send("GET");
     // наш результат
     str = std::string{ response.body.begin(), response.body.end() };
}
catch (const std::exception& e)
{
     MessageBoxA(0, "request failed, error: ", e.what(), MB_OK);
     return;
}
Серверная часть:
PHP:
else if ( isset( $_GET[ "get" ] ) ) {
    
     if(file_exists($file_directory)) {
           $homepage = file_get_contents($file_directory);
           echo $homepage;
     }
}
Как видим ничего сложного нету
Ну только советую всем кто хочет это юзать, защиту сделать хотя бы)) а то если анализом трафика пройдутся, то ссылку узнают и смогут всякую хуйню всем юзерам заливать)))
 
Сверху Снизу