# 已知限制

本頁整理目前程式碼中會影響部署與使用的行為限制與缺陷，每項附上所在位置。

## 錯誤處理缺陷

| 位置 | 行為 | 影響 |
|---|---|---|
| `handlers/PostToPath.go` 類型檢查 | 不支援的類型只設定 `errMessage`，`err` 為 nil；`HandleError` 呼叫 `err.Error()` 觸發 panic | 由 gin Recovery 回 `500`，而非預期的 `400` |
| `handlers/GetFromPath.go` 解碼 | `vips.NewImageFromBuffer` 失敗後送出錯誤但沒有 `return`，接著存取 nil 的影像 | panic 發生在 goroutine 內，gin Recovery 攔不到，整個程序結束 |
| `handlers/GetFromPath.go` `streamImage` | ResponseWriter 不支援 `http.Flusher` 時遞迴呼叫自己 | 無限遞迴；Gin 預設的 ResponseWriter 支援 `Flusher`，一般部署不會觸發 |

## 並行與逾時

三個處理器的結果 channel 皆無緩衝。逾時回 `408` 後沒有人接收結果，背景 goroutine 會永久阻塞在送出那一行；上傳與讀圖的 goroutine 也會在處理器返回後繼續存取 `gin.Context`。

## 快取

| 限制 | 說明 |
|---|---|
| 刪除不清快取 | 原檔移入回收桶後，`storage/image/cache/` 的轉檔結果仍會被回傳（見 [快取分層](/zh/caching#失效與清除)） |
| 快取 key 未正規化 | `q=75` 與不帶 `q` 輸出相同，卻產生兩個快取檔 |
| 副檔名衝突 | 快取檔名去掉原副檔名，同資料夾的 `photo.jpg` 與 `photo.png` 以相同參數讀取時共用同一個快取檔 |
| 無容量上限 | 本地快取檔不會過期或淘汰 |

## 安全與部署

| 限制 | 說明 |
|---|---|
| 無驗證 | Go 服務不驗證上傳與刪除請求；Nginx 白名單預設為註解狀態 |
| 路徑未限制 | 上傳與刪除以 `filepath.Join` 組合路徑，未檢查結果仍位於 `storage/image/upload/` 內 |
| 類型只看標頭 | 上傳類型依 part 的 `Content-Type` 判斷，不檢查檔案內容 |
| 佔位圖不在 repo | `.gitignore` 的 `**/image/` 排除了 `app/internal/assets/image/`，需自行提供 `404-light.svg`／`404-dark.svg` |
| 錯誤時狀態碼 | 讀圖失敗以 `c.File` 回傳佔位圖，HTTP 狀態碼為 `200` 而非 `404` |
