CLX C++ Libraries - https
Author: clown

CLX C++ Libraries
Home >> http >> https

# Declaration

    typedef basic_http<ssl::socket> https;

# Overview

https は，HTTPS (HTTP over SSL) 通信を行うためのクラスです．tcp::socket の代わりに ssl::socket を用いることで実現しています． インターフェースは http クラスと同様です．ただし， サーバ側の証明書の認証を行う場合は，サーバと接続する（start() メソッドを実行する） 前に verify_locations() メソッドで rootCA 認証書のファイル/ディレクトリ名を指定しておく必要があります （詳細は，ssl::socket を参照して下さい）．

CLX における SSL 通信は OpenSSL を用いて実装しています． そのため，SSL 通信関連ライブラリを使用する際には環境に OpenSSL ライブラリがインストールされている必要があります．OpenSSL に関する詳細は， OpenSSL: The Open Source toolkit for SSL/TLS ( OpenSSL 日本語サイト ) を参照して下さい．

# Example

example_https.cpp

    #include <iostream>
    #include "clx/https.h"
    #include "clx/uri.h"

    int main(int argc, char* argv[]) {
        if (argc < 3) return -1;

        try {
            clx::https session(clx::uri::encode(argv[1]), 443);
            session.get(clx::uri::encode(argv[2]));

            std::cout << "code: " << session.code() << std::endl;
            std::cout << std::endl;

            std::cout << "head" << std::endl;
            std::cout << "--" << std::endl;
            for (clx::http::head_iterator pos = session.head().begin();
                pos != session.head().end(); pos++) {
                std::cout << pos->first << ": " << pos->second << std::endl;
            }
            std::cout << std::endl;

            std::cout << "body" << std::endl;
            std::cout << "--" << std::endl;
            std::cout << session.body() << std::endl;
        }
        catch (clx::socket_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }
        catch (clx::sockaddress_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }
        catch (std::runtime_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }

        return 0;
    }

サーバ側の証明書の認証を行う場合は，以下のようにサーバと接続する（start() メソッドを実行する）前に verify_locations() メソッドで rootCA 認証書のファイル/ ディレクトリ名を指定します．ファイルを指定する場合は verify_locations() メソッドの第 1 引数に，ディレクトリを指定する場合には第 2 引数にその名前を指定します．

example_https_verify.cpp

    #include <iostream>
    #include "clx/https.h"
    #include "clx/uri.h"

    int main(int argc, char* argv[]) {
        if (argc < 3) return -1;

        try {
            clx::https session;

            try {
                session.verify_locations("ca-bundle.crt");
                session.start(clx::uri::encode(argv[1]), 443);
            }
            catch (clx::verify_error& e) {
                std::cerr << e.what() << std::endl;
                // std::exit(-1);
            }

            session.get(clx::uri::encode(argv[2]));

            std::cout << "code: " << session.code() << std::endl;
            std::cout << std::endl;

            std::cout << "head" << std::endl;
            std::cout << "--" << std::endl;
            for (clx::http::head_iterator pos = session.head().begin();
                pos != session.head().end(); pos++) {
                std::cout << pos->first << ": " << pos->second << std::endl;
            }
            std::cout << std::endl;

            std::cout << "body" << std::endl;
            std::cout << "--" << std::endl;
            std::cout << session.body() << std::endl;
        }
        catch (clx::socket_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }
        catch (clx::sockaddress_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }
        catch (std::runtime_error& e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }

        return 0;
    }

# Related Pages

1. CLX C++ Libraries - ssl::socket
2. CLX C++ Libraries - http

# References

1. OpenSSL: The Open Source toolkit for SSL/TLS
2. OpenSSL 日本語サイト: The Open Source toolkit for SSL/TLS