linux epoll を使う簡易 HTTP/1.1 オリジン・サーバ 0.1.0 alpha

linux epoll を使う簡易 HTTP/1.1 オリジン・サーバソースコードのどこに何が記述されているのか、 わかりにくいと感じ始めたので、 ファイル名のリネームをおこない、 ソースコードの編成を変更しました。

tociyuki/epoll-http-server-cxx11 0.1.0 alpha

Reactor パターンではなく、 プリフォーク・パターンでも利用できるものと、 Reactor パターン専用のものがあります。

両方で使えるもの。

  • decode-系 DFA で記述したデコーダを記述しています。
  • handler-系 リクエスト・ハンドラを記述しています。
    • handler-file.cpp 静的ファイルを public/ ディレクトリから返す簡易ハンドラ
    • handler-test.cpp テスト・ページの GET と POST に対応した簡易ハンドラ
    • handler.cpp ハンドラのベース・クラス
  • html-builder.cpp HTML エスケープをおこなう簡易 HTML ビルダ
  • http-condition.cpp If-None-Match や If-Modified-Since の条件判定を担うクラス
  • http-request.cpp HTTP リクエストのコンテナ・クラス
  • http-response.cpp HTTP レスポンスのコンテナ・クラス
  • logger.cpp アクセス・ログ出力とエラー・ログ出力用のシングルトン
  • time_decode.cpp HTTP 時刻フォーマットのデコーダ
  • time_to_string.cpp HTTP 時刻文字列を作成する関数

すべてを decode- に切り出したわけではなく、 handler-file 中のパスのデコーダはディスパッチャを導入するときに廃止する予定なのでそのまま残してあります。

Reactor パターン専用のもの。

  • mplex-epoll.cpp Linux epoll システムコールによる入出力多重化クラス
  • mplex-io.cpp タイムアウトありの入出力多重化クラスのベース・クラス
  • http-connection.cpp HTTP/1.1 コネクションに応答するクラス
  • tcpserver.cpp サーバのメイン・ループ

今のテストは decode-系限定です。 http-connection.cpp をテストしたいのですが、 システム・コールと強く結びつきすぎていて、 テスト用の Mock オブジェクトをかませる余地がないのが問題です。 これから手をいれるなら、 そこをなんとかしないといけないのでしょう。