CLX C++ Libraries - http
Author: clown

CLX C++ Libraries
Home >> http

# Declaration

    template <class Socket>
    class basic_http : public Socket;

    typedef basic_http<tcp::socket> http;

# Overview

http は，指定したホスト名 + パス名に HTTP リクエストを送信して内容を取得するためのクラスです． get() メソッド，および post() メソッドはそれぞれ GET，POST リクエストに対応しています． 取得された内容は，ステータスコード，ヘッダ，本文に分割して記憶します．ユーザは，それぞれ code()，head()，body() メソッドで結果を取得することができます．

# Example

example_http.cpp

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

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

        try {
            clx::http session(clx::uri::encode(argv[1]), 80);
            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);
        }

        return 0;
    }

    Result
    $ ./test clx.cielquis.net /index.html
    code: 200

    head
    --
    Accept-Ranges: bytes
    Connection: close
    Content-Length: 14775
    Content-Type: text/html
    Date: Fri, 29 Aug 2008 06:14:21 GMT
    ETag: "c5fe8e-39b7-48b704e8"
    Last-Modified: Thu, 28 Aug 2008 20:04:56 GMT
    Server: Apache

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

    <head>
    <meta name="author" content="clown">
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Style-Type" content="text/css">

    <link rel="index" href="index.html">
    <link rel="stylesheet" href="style/default.css" type="text/css">

    ・・・（以下略）・・・

# Template Parameters

Socket
  ソケットクラスを指定します．

# Related Types

    typedef char char_type;
    typedef std::basic_string<char_type> string_type;
    typedef std::map<string_type, string_type> head_type;
    typedef typename head_type::iterator head_iterator;
    typedef typename head_type::const_iterator const_head_iterator;

# Construction and Member Functions

    basic_http();
    explicit basic_http(const socket_type& cp);
    explicit basic_http(const string_type& host, int port = 80);
    explicit basic_http(const char_type* host, int port = 80);
    virtual ~basic_http();

    basic_http& start(const string_type& host, int port = 80);
    basic_http& start(const char_type* host, int port = 80);
    void finish();

    basic_http& request(const string_type& query);
    basic_http& request(const char_type* query);
    bool response(double timeout = -1.0);

start() メソッドで指定したホストと接続を試みます．request() メソッドは， 引数として指定された文字列を接続したサーバへ送信します．response() メソッドは， request() メソッドで送信した HTTP リクエストに対する応答を受信し，内部変数に記憶します． timeout に0以上の値を指定すると，timeout 秒経過しても応答がない場合 false を返して終了します．

    bool head(const string_type& path,
        const head_type& head = head_type(), double timeout = -1.0);
    bool head(const char_type* path,
        const head_type& head = head_type(), double timeout = -1.0);

    bool get(const string_type& path,
        const head_type& head = head_type(), double timeout = -1.0);
    bool get(const char_type* path,
        const head_type& head = head_type(), double timeout = -1.0);

    bool post(const string_type& path, const string_type& data,
        const head_type& head = head_type(), double timeout = -1.0);
    bool post(const char_type* path, const char_type* data,
        const head_type& head = head_type(), double timeout = -1.0);

head()，get()，および post() メソッドは，path で指定された Web ページの内容を取得するための HTTP リクエストを作成した後，request()，response() メソッドを自動的に呼び出します．これらのメソッドは head を指定した場合， 送信する HTTP リクエストに指定されたヘッダ情報を付加します．head は [ヘッダ名，内容] の std::map<std::string, std::string> 形式で指定して下さい．尚， デフォルトの状態では，head()，get() メソッドは Host ヘッダ，pos() メソッドは Host，および Content-Length ヘッダを付加します．

    int code() const;
    const string_type& message() const;
    const head_type& head() const;
    head_type& head();
    const string_type& body() const;

response() メソッドで取得した内容にアクセスするためのメソッド群です．それぞれ， ステータスコード，ステータスコードに対応する文字列，ヘッダ情報，本文を取得します．

    double& version();
    double version() const;

HTTP バージョンの内容を設定/取得するためのメソッドです． get()，post() メソッドは，ここで設定された値を基に HTTP リクエストを作成します．

# Related Page

1. CLX C++ Libraries - https

# Referrence

1. Life like a clown - ワイド文字と codecvt