| 1238 | } |
| 1239 | |
| 1240 | func Test_App_AutoHead_Compliance_SendFile(t *testing.T) { |
| 1241 | t.Parallel() |
| 1242 | |
| 1243 | if runtime.GOOS == "windows" { |
| 1244 | t.Skip("SendFile auto-HEAD test is skipped on Windows due to file locking semantics") |
| 1245 | } |
| 1246 | |
| 1247 | tmpDir := t.TempDir() |
| 1248 | filePath := filepath.Join(tmpDir, "hello.txt") |
| 1249 | fileContent := []byte("file-body") |
| 1250 | require.NoError(t, os.WriteFile(filePath, fileContent, 0o644)) |
| 1251 | |
| 1252 | app := New() |
| 1253 | app.Get("/file", func(c Ctx) error { |
| 1254 | c.Set("X-Test", "file") |
| 1255 | return c.SendFile(filePath) |
| 1256 | }) |
| 1257 | app.startupProcess() |
| 1258 | |
| 1259 | getReq := httptest.NewRequest(MethodGet, "/file", http.NoBody) |
| 1260 | getResp, err := app.Test(getReq) |
| 1261 | require.NoError(t, err, "app.Test(get)") |
| 1262 | defer func() { |
| 1263 | require.NoError(t, getResp.Body.Close()) |
| 1264 | }() |
| 1265 | |
| 1266 | body, err := io.ReadAll(getResp.Body) |
| 1267 | require.NoError(t, err) |
| 1268 | require.Equal(t, fileContent, body) |
| 1269 | require.Equal(t, "file", getResp.Header.Get("X-Test")) |
| 1270 | |
| 1271 | headReq := httptest.NewRequest(MethodHead, "/file", http.NoBody) |
| 1272 | headResp, err := app.Test(headReq) |
| 1273 | require.NoError(t, err, "app.Test(head)") |
| 1274 | defer func() { |
| 1275 | require.NoError(t, headResp.Body.Close()) |
| 1276 | }() |
| 1277 | |
| 1278 | require.Equal(t, getResp.StatusCode, headResp.StatusCode) |
| 1279 | require.Equal(t, strconv.Itoa(len(fileContent)), headResp.Header.Get(HeaderContentLength)) |
| 1280 | require.Equal(t, getResp.Header.Get(HeaderContentType), headResp.Header.Get(HeaderContentType)) |
| 1281 | require.Equal(t, getResp.Header.Get("X-Test"), headResp.Header.Get("X-Test")) |
| 1282 | |
| 1283 | headBody, err := io.ReadAll(headResp.Body) |
| 1284 | require.NoError(t, err) |
| 1285 | require.Empty(t, headBody) |
| 1286 | } |
| 1287 | |
| 1288 | func Test_App_Methods(t *testing.T) { |
| 1289 | t.Parallel() |