Skip to content

Commit 1c6366e

Browse files
committed
fix: consider only non-empty values when parsing pagination parameters from URLs
1 parent e77628a commit 1c6366e

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

pagination/keysetpagination/header.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"strings"
1212

1313
"github.com/pkg/errors"
14+
15+
"github.com/ory/x/stringsx"
1416
)
1517

1618
// Pagination Request Parameters
@@ -94,8 +96,8 @@ func Header(w http.ResponseWriter, u *url.URL, p *Paginator) {
9496
// Parse returns the pagination options from the URL query.
9597
func Parse(q url.Values, p PageTokenConstructor) ([]Option, error) {
9698
var opts []Option
97-
if q.Has("page_token") {
98-
pageToken, err := url.QueryUnescape(q.Get("page_token"))
99+
if pt := stringsx.Coalesce(q["page_token"]...); pt != "" {
100+
pageToken, err := url.QueryUnescape(pt)
99101
if err != nil {
100102
return nil, errors.WithStack(err)
101103
}
@@ -105,8 +107,8 @@ func Parse(q url.Values, p PageTokenConstructor) ([]Option, error) {
105107
}
106108
opts = append(opts, WithToken(parsed))
107109
}
108-
if q.Get("page_size") != "" {
109-
size, err := strconv.Atoi(q.Get("page_size"))
110+
if ps := stringsx.Coalesce(q["page_size"]...); ps != "" {
111+
size, err := strconv.Atoi(ps)
110112
if err != nil {
111113
return nil, errors.WithStack(err)
112114
}

pagination/keysetpagination/paginator_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,26 @@ func TestParse(t *testing.T) {
168168
_, err := Parse(url.Values{"page_size": {"invalid-int"}}, NewStringPageToken)
169169
require.ErrorIs(t, err, strconv.ErrSyntax)
170170
})
171+
172+
t.Run("empty tokens and page sizes work as if unset, empty values are skipped", func(t *testing.T) {
173+
opts, err := Parse(url.Values{}, NewStringPageToken)
174+
require.NoError(t, err)
175+
paginator := GetPaginator(append(opts, WithDefaultToken(StringPageToken("default")))...)
176+
assert.Equal(t, "default", paginator.Token().Encode())
177+
assert.Equal(t, 100, paginator.Size())
178+
179+
opts, err = Parse(url.Values{"page_token": {""}, "page_size": {""}}, NewStringPageToken)
180+
require.NoError(t, err)
181+
paginator = GetPaginator(append(opts, WithDefaultToken(StringPageToken("default2")))...)
182+
assert.Equal(t, "default2", paginator.Token().Encode())
183+
assert.Equal(t, 100, paginator.Size())
184+
185+
opts, err = Parse(url.Values{"page_token": {"", "foo", ""}, "page_size": {"", "123", ""}}, NewStringPageToken)
186+
require.NoError(t, err)
187+
paginator = GetPaginator(append(opts, WithDefaultToken(StringPageToken("default3")))...)
188+
assert.Equal(t, "foo", paginator.Token().Encode())
189+
assert.Equal(t, 123, paginator.Size())
190+
})
171191
}
172192

173193
func TestPaginateWithAdditionalColumn(t *testing.T) {

0 commit comments

Comments
 (0)