gitea源码

serve_test.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package httplib
  4. import (
  5. "net/http"
  6. "net/http/httptest"
  7. "net/url"
  8. "os"
  9. "strconv"
  10. "strings"
  11. "testing"
  12. "github.com/stretchr/testify/assert"
  13. "github.com/stretchr/testify/require"
  14. )
  15. func TestServeContentByReader(t *testing.T) {
  16. data := "0123456789abcdef"
  17. test := func(t *testing.T, expectedStatusCode int, expectedContent string) {
  18. _, rangeStr, _ := strings.Cut(t.Name(), "_range_")
  19. r := &http.Request{Header: http.Header{}, Form: url.Values{}}
  20. if rangeStr != "" {
  21. r.Header.Set("Range", "bytes="+rangeStr)
  22. }
  23. reader := strings.NewReader(data)
  24. w := httptest.NewRecorder()
  25. ServeContentByReader(r, w, int64(len(data)), reader, &ServeHeaderOptions{})
  26. assert.Equal(t, expectedStatusCode, w.Code)
  27. if expectedStatusCode == http.StatusPartialContent || expectedStatusCode == http.StatusOK {
  28. assert.Equal(t, strconv.Itoa(len(expectedContent)), w.Header().Get("Content-Length"))
  29. assert.Equal(t, expectedContent, w.Body.String())
  30. }
  31. }
  32. t.Run("_range_", func(t *testing.T) {
  33. test(t, http.StatusOK, data)
  34. })
  35. t.Run("_range_0-", func(t *testing.T) {
  36. test(t, http.StatusPartialContent, data)
  37. })
  38. t.Run("_range_0-15", func(t *testing.T) {
  39. test(t, http.StatusPartialContent, data)
  40. })
  41. t.Run("_range_1-", func(t *testing.T) {
  42. test(t, http.StatusPartialContent, data[1:])
  43. })
  44. t.Run("_range_1-3", func(t *testing.T) {
  45. test(t, http.StatusPartialContent, data[1:3+1])
  46. })
  47. t.Run("_range_16-", func(t *testing.T) {
  48. test(t, http.StatusRequestedRangeNotSatisfiable, "")
  49. })
  50. t.Run("_range_1-99999", func(t *testing.T) {
  51. test(t, http.StatusPartialContent, data[1:])
  52. })
  53. }
  54. func TestServeContentByReadSeeker(t *testing.T) {
  55. data := "0123456789abcdef"
  56. tmpFile := t.TempDir() + "/test"
  57. err := os.WriteFile(tmpFile, []byte(data), 0o644)
  58. assert.NoError(t, err)
  59. test := func(t *testing.T, expectedStatusCode int, expectedContent string) {
  60. _, rangeStr, _ := strings.Cut(t.Name(), "_range_")
  61. r := &http.Request{Header: http.Header{}, Form: url.Values{}}
  62. if rangeStr != "" {
  63. r.Header.Set("Range", "bytes="+rangeStr)
  64. }
  65. seekReader, err := os.OpenFile(tmpFile, os.O_RDONLY, 0o644)
  66. require.NoError(t, err)
  67. defer seekReader.Close()
  68. w := httptest.NewRecorder()
  69. ServeContentByReadSeeker(r, w, nil, seekReader, &ServeHeaderOptions{})
  70. assert.Equal(t, expectedStatusCode, w.Code)
  71. if expectedStatusCode == http.StatusPartialContent || expectedStatusCode == http.StatusOK {
  72. assert.Equal(t, strconv.Itoa(len(expectedContent)), w.Header().Get("Content-Length"))
  73. assert.Equal(t, expectedContent, w.Body.String())
  74. }
  75. }
  76. t.Run("_range_", func(t *testing.T) {
  77. test(t, http.StatusOK, data)
  78. })
  79. t.Run("_range_0-", func(t *testing.T) {
  80. test(t, http.StatusPartialContent, data)
  81. })
  82. t.Run("_range_0-15", func(t *testing.T) {
  83. test(t, http.StatusPartialContent, data)
  84. })
  85. t.Run("_range_1-", func(t *testing.T) {
  86. test(t, http.StatusPartialContent, data[1:])
  87. })
  88. t.Run("_range_1-3", func(t *testing.T) {
  89. test(t, http.StatusPartialContent, data[1:3+1])
  90. })
  91. t.Run("_range_16-", func(t *testing.T) {
  92. test(t, http.StatusRequestedRangeNotSatisfiable, "")
  93. })
  94. t.Run("_range_1-99999", func(t *testing.T) {
  95. test(t, http.StatusPartialContent, data[1:])
  96. })
  97. }