# bt:// 协议

## 功能
`bt://` 是 `bt_app` 内部 WebView 使用的项目资源协议。它把项目目录或打包 Bundle 中的文件映射成页面可访问的 URL。

```text
bt://app/index.html
bt://app/assets/app.css
bt://app/main.js
```

该协议不是系统级外部协议，不用于让操作系统或普通浏览器打开 BT 应用。它只在 `bt_app` 创建的 WebView 内部生效。

## 使用方式
`static` 模式下，`app.entry` 写相对路径即可：

```json
{
  "app": {
    "mode": "static",
    "entry": "index.html"
  }
}
```

页面中可以显式引用项目资源：

```html
<link rel="stylesheet" href="bt://app/assets/app.css">
<script src="bt://app/assets/app.js"></script>
<img src="bt://app/assets/logo.png">
```

## 路径规则
- 主机名必须是 `app`，例如 `bt://app/index.html`。
- 路径是项目内相对路径。
- 不能访问绝对路径。
- 不能包含 `..`。
- 开发模式读取项目目录文件，打包模式读取 exe 尾部 Bundle。

## 内容类型
协议会按扩展名返回常见 Content-Type：

| 扩展名 | 类型 |
|---|---|
| `.html` `.htm` | `text/html; charset=utf-8` |
| `.css` | `text/css; charset=utf-8` |
| `.js` | `application/javascript; charset=utf-8` |
| `.json` | `application/json; charset=utf-8` |
| `.png` `.jpg` `.jpeg` `.gif` `.svg` `.webp` `.ico` | 对应图片类型 |
| `.wasm` | `application/wasm` |
| `.txt` | `text/plain; charset=utf-8` |

## 调试
需要查看协议请求时，可以设置环境变量：

```bash
set BT_APP_TRACE_PROTOCOL=1
./bt_app.exe run
```

## 常见错误
- `资源路径无效`：URL 路径为空、包含非法编码或不是安全相对路径。
- `资源不存在或无法读取`：文件没有放在项目目录中，或打包时没有进入 Bundle。
- `403`：协议主机不是 `app`，或路径试图访问项目外部。
