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;
}
実行結果
$ ./a ss1.xrea.com /clx.cielquis.net/
code: 200

head
--
Accept-Ranges: bytes
Connection: close
Content-Length: 18632
Content-Type: text/html
Date: Tue, 15 Dec 2009 09:05:17 GMT
ETag: "c5fe8e-48c8-4b0ae3a9"
Last-Modified: Mon, 23 Nov 2009 19:34:01 GMT
Server: Apache
X-Cache: MISS from ss1.xrea.com

body
--
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">

・・・(省略)・・・

サーバ側の証明書の認証を行う場合は,以下のようにサーバと接続する(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