3.5.3. pfi::network::http

3.5.3.1. 概要

HTTPを扱うライブラリ。

3.5.3.2. 使い方

リクエスト、レスポンスを直接扱う、ローレベルなライブラリと、 ストリーム形式のハイレベルなライブラリが用意されている。

3.5.3.3. ローレベルライブラリ

3.5.3.3.1. requestクラス

request::request(const string &method, const uri &u, int major_ver=1, int minor_ver=1)

requestを作る。 メソッド、URI、HTTPのバージョンが指定できる。

request::request(shared_ptr<stream_socekt> sock)

ソケットからリクエストを読む。

const string &request::method() const
const uri &request::path() const
const pair<int,int> &request::version() const

アクセッサ

header &head()

ヘッダ用アクセッサ。 設定したり取得したり。

iostream &body()

bodyを表すiostreamを返す。 送るデータを入れたり、 送られたデータを取り出したり。

自分で作ったrequestクラスのbodyの実体は、stringstreamである。 メモリ上に一旦貯めるので、大きなリクエストを送信する時は注意すること。 bodyに何も書き込まずにsend()した場合、bodyの実態がソケットになるので、 大きなリクエストの転送にも利用できる。 しかし、この場合リクエストを再利用することができなくなる。 一度send()したら破棄しなければならない。 socketから読み込んだrequestの場合はソケットになるので、 メモリは消費しない。

request::send(shared_ptr<stream_socket> sock)

sockにHTTPリクエストを送信する。

3.5.3.3.2. responseクラス

response::response(int code, const string &reason, int major_ver=1, int minor_ver=1)

レスポンスクラスを作る。

response::response(shared_ptr<stream_socket> sock)

ソケットからレスポンスを読み込む。

const pair<int,int> &response::version() const
int response::code() cosnt
const string &response::reason() const

アクセッサ

header &response::head()

ヘッダ

iostream &response::body()

bodyを表すiostream。 実体は、大体requestのそれと同じ。

void response::send(shared_ptr<stream_socket>)

ソケットにresponseの内容を送信。

3.5.3.3.4. サンプルコード

#include <iostream>
using namespace std;

#include <pficommon/lang/shared_ptr.h>
#include <pficommon/network/socket.h>
#include <pficommon/network/http.h>
using namespace pfi::lang;
using namespace pfi::network;
using namespace pfi::network::http;

int main()
{
  shared_ptr<stream_socket> ss(new stream_socket());
  request req("GET", uri("http://kzk9.net/blog/"), 1, 1);
  req.head()["Host"]="kzk9.net";
  ss->connect("kzk9.net", 80);
  req.send(ss);
  response resp(ss);

  for (string line; getline(resp.body(), line); )
    cout<<line<<endl;

  return 0;
}

3.5.3.4. ハイレベルライブラリ

httpstreamというistream互換のクラスが用意されている。 これを用いるとGETリクエストを簡単に送ることができる。

なおこのクラスは、失敗したときに pfi::network::http::http_exception を投げる。

3.5.3.4.1. サンプルコード

httpstream hs("http://kzk9.net/blog/");
for (string line; getline(hs, line); )
  cout<<line<<endl;