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
#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 引数にその名前を指定します.
#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; }