Что такое boost::asio::ssl::context::load_verify_file и как с ним работать?

Это настороженно небольшое количество повышения:: asio:: ssl небольшая база C++ образовательных кодов онлайн. Еще меньше на boost:: asio:: ssl:: context:: load _ verify _ file Поэтому я нашел один из here code с минимальными изменениями - компилирует и запускает с boost 1,47,0:

#include 
#include 
#include 
#include 
#include 
#include 
#include 


class client
{
public:
    client(boost::asio::io_service& io_service, boost::asio::ssl::context& context, boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
        : socket_(io_service, context)
    {
        socket_.set_verify_mode(boost::asio::ssl::context::verify_none);
        socket_.set_verify_callback(boost::bind(&client::verify_certificate, this, _1, _2));

        boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error));
    }

    bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)
    {
        char subject_name[256];
        X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
        X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
        std::cout << "Verifying:\n" << subject_name << std::endl;

        return preverified;
    }

    void handle_connect(const boost::system::error_code& error)
    {
        if(!error){
            std::cout << "Connection OK!" << std::endl;
            socket_.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&client::handle_handshake, this, boost::asio::placeholders::error));
        }else{
            std::cout << "Connect failed: " << error.message() << std::endl;
        }
    }

    void handle_handshake(const boost::system::error_code& error)
    {
        if(!error){
            std::cout << "Sending request: " << std::endl;

            std::stringstream request_;

            request_ << "GET /api/0/data/ticker.php HTTP/1.1\r\n";
            request_ << "Host: mtgox.com\r\n";
            request_ << "Accept-Encoding: *\r\n";
            request_ << "\r\n";

            std::cout << request_.str() << std::endl;

            boost::asio::async_write(socket_, boost::asio::buffer(request_.str()), boost::bind(&client::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
        }else{
            std::cout << "Handshake failed: " << error.message() << std::endl;
        }
    }

    void handle_write(const boost::system::error_code& error, size_t bytes_transferred)
    {
        if (!error){
            std::cout << "Sending request OK!" << std::endl;
            boost::asio::async_read(socket_, boost::asio::buffer(reply_, bytes_transferred), boost::bind(&client::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
        }else{
            std::cout << "Write failed: " << error.message() << std::endl;
        }
    }

    void handle_read(const boost::system::error_code& error, size_t bytes_transferred)
    {
        if (!error){
            std::cout << "Reply: ";
            std::cout.write(reply_, bytes_transferred);
            std::cout << "\n";
        }else{
            std::cout << "Read failed: " << error.message() << std::endl;
        }
    }

private:
    boost::asio::ssl::stream socket_;
    char reply_[0x1 << 16];
};

int main(int argc, char* argv[])
{
    try{
        boost::asio::io_service io_service;

        boost::asio::ip::tcp::resolver resolver(io_service);
        boost::asio::ip::tcp::resolver::query query("mtgox.com", "443");
        boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

        boost::asio::ssl::context context(boost::asio::ssl::context::sslv23);
        //context.load_verify_file("key.pem"); // uncomment this line

        client c(io_service, context, iterator);

        io_service.run();
    }catch (std::exception& e){
        std::cerr << "Exception: " << e.what() << "\n";
    }

    std::cin.get();
    return 0;
}

Вот одна действительно любопытная строка: context.load _ verify _ file («key.pem»); Итак, у меня есть несколько вопросов об этом:

  1. Что это значит для меня как HTTP-клиента?
  2. Отправляется ли он на сервер?
  3. Как создать такой файл?
  4. Для чего он в любом случае?
  5. Код компилирует и работает с ним. Все в порядке? Безопасно ли наше подключение к серверу с помощью key.pem ?
  6. Я хочу использовать google или другой большой ssl-узел. Что делать?

-121--1489516-

Цепочка SQL-запросов Сейчас выполняется формула SELECT (FOO) FROM table1 WHERE table1.foo = «FOO» & & table1.bar = «BAR»; но я хотел бы запустить это не на постоянной FOO, а на каждом значении из запроса...

Сейчас я выполняю

SELECT formula('FOO') FROM table1
WHERE table1.foo = 'FOO' && table1.bar = 'BAR';

, но я хочу выполнить это не на константе FOO , а на каждом значении из запроса

SELECT foos FROM table2
WHERE table2.bar = 'BAR';

Как это сделать?

Изменить: Важное изменение: добавлено FOO к аргументам функции.

Иллюстрация:

SELECT foo FROM table1 WHERE foo = 'FOO' && table1.bar = 'BAR';

дает столбец с FOOa, FOOb, FOOc.

SELECT formula('FOO') FROM table1
WHERE table1.foo = 'FOO' && table1.bar = 'BAR';

дает одну запись, скажем, сумму (FOO) (на самом деле гораздо сложнее, но она использует агрегаты в какой-то момент для объединения результатов).

Мне нужен какой-то запрос, который дает столбец с суммой (FOO1), суммой (FOO2),... где каждый FOOn вычисляется аналогично способу к FOO. Но я бы хотел сделать это с помощью одного запроса, а не n запросов (потому что n может быть большим и в любом случае конкретные значения FOOn варьируются в зависимости от случая).

8
задан Charles 6 September 2011 в 19:24
поделиться