Skip to content

Commit 61f2939

Browse files
authored
Merge pull request #401 from ipfs/release-v0.10.2
2 parents 198f9bc + 2d3edc5 commit 61f2939

25 files changed

+1360
-1029
lines changed

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,45 @@ The following emojis are used to highlight certain changes:
1414

1515
## [Unreleased]
1616

17+
### Added
18+
19+
### Changed
20+
21+
### Removed
22+
23+
### Fixed
24+
25+
### Security
26+
27+
## [0.10.2] - 2023-06-29
28+
29+
### Fixed
30+
31+
- Gateway: include CORS on subdomain redirects.
32+
- Gateway: ensure 'X-Ipfs-Root' header is valid.
33+
1734
## [0.10.1] - 2023-06-19
1835

1936
### Added
2037

38+
None.
39+
2140
### Changed
2241

42+
None.
43+
2344
### Removed
2445

46+
None.
47+
2548
### Fixed
2649

2750
- Allow CAR requests with a path when `DeserializedResponses` is `false`.
2851

2952
### Security
3053

54+
None.
55+
3156
## [0.10.0] - 2023-06-09
3257

3358
### Added

gateway/errors_test.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,35 @@ import (
88
"testing"
99
"time"
1010

11-
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
1212
)
1313

1414
func TestErrRetryAfterIs(t *testing.T) {
15+
t.Parallel()
1516
var err error
1617

1718
err = NewErrorRetryAfter(errors.New("test"), 10*time.Second)
18-
assert.True(t, errors.Is(err, &ErrorRetryAfter{}), "pointer to error must be error")
19+
require.True(t, errors.Is(err, &ErrorRetryAfter{}), "pointer to error must be error")
1920

2021
err = fmt.Errorf("wrapped: %w", err)
21-
assert.True(t, errors.Is(err, &ErrorRetryAfter{}), "wrapped pointer to error must be error")
22+
require.True(t, errors.Is(err, &ErrorRetryAfter{}), "wrapped pointer to error must be error")
2223
}
2324

2425
func TestErrRetryAfterAs(t *testing.T) {
26+
t.Parallel()
27+
2528
var (
2629
err error
2730
errRA *ErrorRetryAfter
2831
)
2932

3033
err = NewErrorRetryAfter(errors.New("test"), 25*time.Second)
31-
assert.True(t, errors.As(err, &errRA), "pointer to error must be error")
32-
assert.EqualValues(t, errRA.RetryAfter, 25*time.Second)
34+
require.True(t, errors.As(err, &errRA), "pointer to error must be error")
35+
require.EqualValues(t, errRA.RetryAfter, 25*time.Second)
3336

3437
err = fmt.Errorf("wrapped: %w", err)
35-
assert.True(t, errors.As(err, &errRA), "wrapped pointer to error must be error")
36-
assert.EqualValues(t, errRA.RetryAfter, 25*time.Second)
38+
require.True(t, errors.As(err, &errRA), "wrapped pointer to error must be error")
39+
require.EqualValues(t, errRA.RetryAfter, 25*time.Second)
3740
}
3841

3942
func TestWebError(t *testing.T) {
@@ -43,37 +46,45 @@ func TestWebError(t *testing.T) {
4346
config := &Config{Headers: map[string][]string{}}
4447

4548
t.Run("429 Too Many Requests", func(t *testing.T) {
49+
t.Parallel()
50+
4651
err := fmt.Errorf("wrapped for testing: %w", NewErrorRetryAfter(ErrTooManyRequests, 0))
4752
w := httptest.NewRecorder()
4853
r := httptest.NewRequest(http.MethodGet, "/blah", nil)
4954
webError(w, r, config, err, http.StatusInternalServerError)
50-
assert.Equal(t, http.StatusTooManyRequests, w.Result().StatusCode)
51-
assert.Zero(t, len(w.Result().Header.Values("Retry-After")))
55+
require.Equal(t, http.StatusTooManyRequests, w.Result().StatusCode)
56+
require.Zero(t, len(w.Result().Header.Values("Retry-After")))
5257
})
5358

5459
t.Run("429 Too Many Requests with Retry-After header", func(t *testing.T) {
60+
t.Parallel()
61+
5562
err := NewErrorRetryAfter(ErrTooManyRequests, 25*time.Second)
5663
w := httptest.NewRecorder()
5764
r := httptest.NewRequest(http.MethodGet, "/blah", nil)
5865
webError(w, r, config, err, http.StatusInternalServerError)
59-
assert.Equal(t, http.StatusTooManyRequests, w.Result().StatusCode)
60-
assert.Equal(t, "25", w.Result().Header.Get("Retry-After"))
66+
require.Equal(t, http.StatusTooManyRequests, w.Result().StatusCode)
67+
require.Equal(t, "25", w.Result().Header.Get("Retry-After"))
6168
})
6269

6370
t.Run("503 Service Unavailable with Retry-After header", func(t *testing.T) {
71+
t.Parallel()
72+
6473
err := NewErrorRetryAfter(ErrServiceUnavailable, 50*time.Second)
6574
w := httptest.NewRecorder()
6675
r := httptest.NewRequest(http.MethodGet, "/blah", nil)
6776
webError(w, r, config, err, http.StatusInternalServerError)
68-
assert.Equal(t, http.StatusServiceUnavailable, w.Result().StatusCode)
69-
assert.Equal(t, "50", w.Result().Header.Get("Retry-After"))
77+
require.Equal(t, http.StatusServiceUnavailable, w.Result().StatusCode)
78+
require.Equal(t, "50", w.Result().Header.Get("Retry-After"))
7079
})
7180

7281
t.Run("ErrorStatusCode propagates HTTP Status Code", func(t *testing.T) {
82+
t.Parallel()
83+
7384
err := NewErrorStatusCodeFromStatus(http.StatusTeapot)
7485
w := httptest.NewRecorder()
7586
r := httptest.NewRequest(http.MethodGet, "/blah", nil)
7687
webError(w, r, config, err, http.StatusInternalServerError)
77-
assert.Equal(t, http.StatusTeapot, w.Result().StatusCode)
88+
require.Equal(t, http.StatusTeapot, w.Result().StatusCode)
7889
})
7990
}

gateway/gateway.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -320,20 +320,22 @@ func cleanHeaderSet(headers []string) []string {
320320
return result
321321
}
322322

323-
// AddAccessControlHeaders adds default HTTP headers used for controlling
324-
// cross-origin requests. This function adds several values to the
325-
// [Access-Control-Allow-Headers] and [Access-Control-Expose-Headers] entries.
323+
// AddAccessControlHeaders ensures safe default HTTP headers are used for
324+
// controlling cross-origin requests. This function adds several values to the
325+
// [Access-Control-Allow-Headers] and [Access-Control-Expose-Headers] entries
326+
// to be exposed on GET and OPTIONS responses, including [CORS Preflight].
326327
//
327-
// If the Access-Control-Allow-Origin entry is missing a value of '*' is
328+
// If the Access-Control-Allow-Origin entry is missing, a default value of '*' is
328329
// added, indicating that browsers should allow requesting code from any
329330
// origin to access the resource.
330331
//
331-
// If the Access-Control-Allow-Methods entry is missing a value of 'GET' is
332-
// added, indicating that browsers may use the GET method when issuing cross
332+
// If the Access-Control-Allow-Methods entry is missing a value, 'GET, HEAD,
333+
// OPTIONS' is added, indicating that browsers may use them when issuing cross
333334
// origin requests.
334335
//
335336
// [Access-Control-Allow-Headers]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
336337
// [Access-Control-Expose-Headers]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
338+
// [CORS Preflight]: https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request
337339
func AddAccessControlHeaders(headers map[string][]string) {
338340
// Hard-coded headers.
339341
const ACAHeadersName = "Access-Control-Allow-Headers"
@@ -346,8 +348,12 @@ func AddAccessControlHeaders(headers map[string][]string) {
346348
headers[ACAOriginName] = []string{"*"}
347349
}
348350
if _, ok := headers[ACAMethodsName]; !ok {
349-
// Default to GET
350-
headers[ACAMethodsName] = []string{http.MethodGet}
351+
// Default to GET, HEAD, OPTIONS
352+
headers[ACAMethodsName] = []string{
353+
http.MethodGet,
354+
http.MethodHead,
355+
http.MethodOptions,
356+
}
351357
}
352358

353359
headers[ACAHeadersName] = cleanHeaderSet(

0 commit comments

Comments
 (0)