# 機能設計書 16-Rack統合

## 概要

本ドキュメントは、Ruby on RailsフレームワークにおけるRack統合機能の設計を記載する。RailsアプリケーションはRackインターフェースを通じてWebサーバーと通信し、ミドルウェアスタックを通じてリクエスト/レスポンス処理を行う。

### 本機能の処理概要

Rack統合は、RailsアプリケーションとWebサーバー間の標準インターフェースを提供する。ミドルウェアスタックを構成し、リクエストの前処理とレスポンスの後処理を階層的に実行する。

**業務上の目的・背景**：
WebアプリケーションはHTTPリクエストを受け取り、レスポンスを返す。RackはRuby Webアプリケーションの標準インターフェースであり、様々なWebサーバー（Puma、Unicorn等）と互換性を持つ。Railsはミドルウェアスタックを通じて、セッション管理、クッキー処理、静的ファイル配信、ログ出力等の横断的関心事を処理する。これにより、アプリケーションコードはビジネスロジックに集中できる。

**機能の利用シーン**：
- HTTPリクエストの受信と前処理
- セッション、クッキー、キャッシュの管理
- 静的ファイルの配信
- リクエストロギング
- 例外処理とエラーページ表示
- カスタムミドルウェアの追加

**主要な処理内容**：
1. ミドルウェアスタックの構築と管理
2. リクエストの順次処理（上から下へ）
3. レスポンスの逆順処理（下から上へ）
4. ミドルウェアの挿入・削除・入れ替え
5. 計装（Instrumentation）によるパフォーマンス測定

**関連システム・外部連携**：
- Webサーバー（Puma、Unicorn、Passenger等）
- Action Dispatch（ルーティング）
- Action Controller（コントローラ処理）
- Active Support（計装）

**権限による制御**：
- Rack統合自体には権限制御機能はない
- 認証・認可ミドルウェアを追加することで制御可能

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | - |

## 機能種別

ミドルウェア / HTTPインターフェース / リクエスト処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| env | Hash | Yes | Rack環境変数 | - |
| REQUEST_METHOD | String | Yes | HTTPメソッド | - |
| PATH_INFO | String | Yes | リクエストパス | - |
| HTTP_* | String | No | HTTPヘッダー | - |

### 入力データソース

- Webサーバーからのリクエスト
- `config/application.rb`のミドルウェア設定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| status | Integer | HTTPステータスコード |
| headers | Hash | レスポンスヘッダー |
| body | Enumerable | レスポンスボディ |

### 出力先

- Webサーバーへのレスポンス

## 処理フロー

### 処理シーケンス

```
1. ミドルウェアスタックの構築
   └─ MiddlewareStack#use でミドルウェア追加
   └─ MiddlewareStack#build でアプリケーション構築

2. リクエスト処理
   └─ 最初のミドルウェア#call(env)
      └─ 次のミドルウェア#call(env)
         └─ ... 順次処理 ...
            └─ アプリケーション#call(env)

3. レスポンス処理
   └─ [status, headers, body] が逆順に返る
```

### フローチャート

```mermaid
flowchart TD
    A[HTTPリクエスト] --> B[Webサーバー]
    B --> C[Rack環境変数生成]
    C --> D[MiddlewareStack#build]
    D --> E[Middleware 1]
    E --> F[Middleware 2]
    F --> G[...]
    G --> H[Rails Application]
    H --> I[Controller/Action]
    I --> J[レスポンス生成]
    J --> K[Middleware n ... 2 ... 1]
    K --> L[Webサーバー]
    L --> M[HTTPレスポンス]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | ミドルウェア順序 | 登録順にリクエスト処理、逆順にレスポンス処理 | 常時 |
| BR-002 | Rackインターフェース | call(env)を実装し[status, headers, body]を返す | 常時 |
| BR-003 | 計装 | process_middleware.action_dispatchイベントを発行 | Notifications有効時 |

### 計算ロジック

特になし

## データベース操作仕様

Rack統合はデータベースを直接操作しない。

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | なし |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| RuntimeError | 例外 | ミドルウェアが見つからない | ミドルウェア名を確認 |

### リトライ仕様

特になし

## トランザクション仕様

特になし

## パフォーマンス要件

- ミドルウェアスタックはアプリケーション起動時に構築
- 計装によるオーバーヘッドは最小限（Notificationsリスナーがない場合はスキップ）

## セキュリティ考慮事項

- セキュリティ関連ミドルウェア（CSRF保護、CSP等）はスタックに含まれる
- ミドルウェアの順序がセキュリティに影響する場合がある

## 備考

- Rackは2007年に開発されたRuby Webアプリケーションの標準インターフェース
- `config.middleware`でミドルウェアスタックをカスタマイズ可能
- `rake middleware`でスタック一覧を確認可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: ミドルウェアスタックの基本構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | stack.rb | `actionpack/lib/action_dispatch/middleware/stack.rb` | MiddlewareStackクラスの構造 |

**読解のコツ**: MiddlewareStackはミドルウェアの配列を管理し、buildメソッドでアプリケーションを構築する。

**主要処理フロー**（stack.rb）:
- **14-50行目**: Middlewareクラス、各ミドルウェアのラッパー
- **43-45行目**: `build`メソッド、ミドルウェアのインスタンス化
- **54-70行目**: InstrumentationProxy、計装用ラッパー
- **76-79行目**: `initialize`、ミドルウェア配列の初期化
- **97-100行目**: `unshift`、先頭にミドルウェア追加
- **106-110行目**: `insert`/`insert_before`、指定位置に挿入
- **114-118行目**: `insert_after`、指定位置の後に挿入
- **120-125行目**: `swap`、ミドルウェアの入れ替え
- **131-141行目**: `delete`/`delete!`、ミドルウェアの削除
- **161-164行目**: `use`、末尾にミドルウェア追加
- **166-175行目**: `build`、アプリケーション構築

#### Step 2: 計装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | stack.rb | `actionpack/lib/action_dispatch/middleware/stack.rb` | InstrumentationProxy |

**主要処理フロー**:
- **55行目**: EVENT_NAME定義 `process_middleware.action_dispatch`
- **57-63行目**: `initialize`でペイロード準備
- **65-69行目**: `call`でNotifications.instrumentを呼び出し

### プログラム呼び出し階層図

```
Rails.application
    │
    └─ ActionDispatch::MiddlewareStack#build
           │
           ├─ middlewares.freeze.reverse.inject(app)
           │      │
           │      └─ Middleware#build(app) または build_instrumented(app)
           │             │
           │             └─ klass.new(app, *args, &block)
           │
           └─ 最終的なRackアプリケーション
                  │
                  └─ call(env)
                         │
                         ├─ Middleware 1 call
                         │      │
                         │      └─ Middleware 2 call
                         │             │
                         │             └─ ... (チェーン)
                         │                    │
                         │                    └─ Rails App call
                         │
                         └─ [status, headers, body]
```

### データフロー図

```
[入力]                       [処理]                          [出力]

config/application.rb ───▶ MiddlewareStack設定
                                   │
                                   ▼
                          MiddlewareStack#build ───▶ Rackアプリ
                                   │
                                   ▼
HTTPリクエスト ────────────▶ Middleware Chain ────────▶ HTTPレスポンス
     │                            │                         │
     └─▶ env Hash ─────────▶ call(env) ─────────▶ [status, headers, body]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| stack.rb | `actionpack/lib/action_dispatch/middleware/stack.rb` | ソース | ミドルウェアスタック管理 |
| static.rb | `actionpack/lib/action_dispatch/middleware/static.rb` | ソース | 静的ファイル配信 |
| cookies.rb | `actionpack/lib/action_dispatch/middleware/cookies.rb` | ソース | クッキー処理 |
| session | `actionpack/lib/action_dispatch/middleware/session/` | ディレクトリ | セッション管理 |
| flash.rb | `actionpack/lib/action_dispatch/middleware/flash.rb` | ソース | フラッシュメッセージ |
| request_id.rb | `actionpack/lib/action_dispatch/middleware/request_id.rb` | ソース | リクエストID付与 |
| show_exceptions.rb | `actionpack/lib/action_dispatch/middleware/show_exceptions.rb` | ソース | 例外表示 |
| debug_exceptions.rb | `actionpack/lib/action_dispatch/middleware/debug_exceptions.rb` | ソース | デバッグ例外表示 |
| reloader.rb | `actionpack/lib/action_dispatch/middleware/reloader.rb` | ソース | コードリロード |
| executor.rb | `actionpack/lib/action_dispatch/middleware/executor.rb` | ソース | リクエスト実行 |
