Skip to content

Repository files navigation

myhttpserver

Build Pytest

Overview

実装は理解しやすい構造とHTTP仕様の正しさを重視しつつ、実用的な性能も維持することを目標にしています。

主な特徴

  • asyncio + マルチコア処理による並行処理
  • コアあたり約2kリクエスト/秒の処理能力
  • Webサーバーとして必要な基本コンポーネントを実装
  • 実際のWebサイトとして試験運用しています。
  • RFC2616 / RFC7231 / RFC7232 を参考に設計

すべてのHTTP仕様を完全に満たしているわけではありませんが、RFC準拠を目標として継続的に改善を行っています。

Demo

demo2.mp4

Features

シンプルな構造を維持しつつ、Webサーバーとして必要な基本機能を提供します。

主な機能:

  • 静的ファイル配信
  • リバースプロキシ
  • パスベースルーティング(トライ木)
  • IPベースアクセス制御
  • Keep-Alive対応
  • gzipレスポンス圧縮
  • ETag生成
  • HCLベース設定ファイル
  • Cookieの受け渡し、キャッシュ無効処理
  • ユーザー情報など、キャッシュされてはいけない場合があるため、詳細なテストを実施
  • ストリーミングによる分割レスポンス
  • ルールベースのレート制限

HTTPサーバーの基本コンポーネントを理解しやすい形で実装することを重視しています。

Quick Start

このプロジェクトでは Pythonパッケージ管理に uv を使用しています。

# 未インストールの場合
curl -LsSf https://astral.sh/uv/install.sh | sh

git clone https://github.com/sanbungi/myhttpserver.git
uv sync

# テスト用静的アセット取得
git submodule update --init --recursive

# 起動
uv run src/main.py --host 0.0.0.0 --config test-assets/config/example.hcl

# テスト
uv run pytest tests --server-mode=config-http

Architecture

リクエストは以下の処理フローで処理されます。

処理途中でエラーが発生した場合は HTTP 500 を返します。

server_flow_yoko

Configuration

myhttpserver は HCL (HashiCorp Configuration Language) を使用して設定を定義します。

設定は次の3階層構造で構成されています。

Global → Server → Route
Scope 説明
global サーバープロセス全体の設定
server バーチャルホスト設定
route パス単位のルーティング

最小設定例

global {
  worker_processes = 4
}

server {
  host = "localhost"
  port = 8080
  root = "./public"
}

route "/" {
  type = "static"
}

詳細な設定リファレンスは Wiki を参照してください。

https://github.com/sanbungi/myhttpserver/wiki

Development

テストには pytest を使用しています。

uv run pytest tests --server-mode=config-http

Roadmap

今後予定している機能:

  • HTTP/2対応
  • メトリクス機能の強化
  • 負荷分散やロードバランサー機能の実験

About

HTTP 1.1 server built from scratch

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages