@@ -7,6 +7,7 @@ package context
7
7
8
8
import (
9
9
"fmt"
10
+ "net/url"
10
11
"strings"
11
12
12
13
"github.com/go-macaron/csrf"
@@ -77,23 +78,49 @@ func (ctx *APIContext) Error(status int, title string, obj interface{}) {
77
78
})
78
79
}
79
80
80
- // SetLinkHeader sets pagination link header by given total number and page size.
81
- func (ctx * APIContext ) SetLinkHeader (total , pageSize int ) {
82
- page := NewPagination (total , pageSize , ctx .QueryInt ("page" ), 0 )
81
+ func genAPILinks (curURL * url.URL , total , pageSize , curPage int ) []string {
82
+ page := NewPagination (total , pageSize , curPage , 0 )
83
83
paginater := page .Paginater
84
84
links := make ([]string , 0 , 4 )
85
+
85
86
if paginater .HasNext () {
86
- links = append (links , fmt .Sprintf ("<%s%s?page=%d>; rel=\" next\" " , setting .AppURL , ctx .Req .URL .Path [1 :], paginater .Next ()))
87
+ u := * curURL
88
+ queries := u .Query ()
89
+ queries .Set ("page" , fmt .Sprintf ("%d" , paginater .Next ()))
90
+ u .RawQuery = queries .Encode ()
91
+
92
+ links = append (links , fmt .Sprintf ("<%s%s>; rel=\" next\" " , setting .AppURL , u .RequestURI ()[1 :]))
87
93
}
88
94
if ! paginater .IsLast () {
89
- links = append (links , fmt .Sprintf ("<%s%s?page=%d>; rel=\" last\" " , setting .AppURL , ctx .Req .URL .Path [1 :], paginater .TotalPages ()))
95
+ u := * curURL
96
+ queries := u .Query ()
97
+ queries .Set ("page" , fmt .Sprintf ("%d" , paginater .TotalPages ()))
98
+ u .RawQuery = queries .Encode ()
99
+
100
+ links = append (links , fmt .Sprintf ("<%s%s>; rel=\" last\" " , setting .AppURL , u .RequestURI ()[1 :]))
90
101
}
91
102
if ! paginater .IsFirst () {
92
- links = append (links , fmt .Sprintf ("<%s%s?page=1>; rel=\" first\" " , setting .AppURL , ctx .Req .URL .Path [1 :]))
103
+ u := * curURL
104
+ queries := u .Query ()
105
+ queries .Set ("page" , "1" )
106
+ u .RawQuery = queries .Encode ()
107
+
108
+ links = append (links , fmt .Sprintf ("<%s%s>; rel=\" first\" " , setting .AppURL , u .RequestURI ()[1 :]))
93
109
}
94
110
if paginater .HasPrevious () {
95
- links = append (links , fmt .Sprintf ("<%s%s?page=%d>; rel=\" prev\" " , setting .AppURL , ctx .Req .URL .Path [1 :], paginater .Previous ()))
111
+ u := * curURL
112
+ queries := u .Query ()
113
+ queries .Set ("page" , fmt .Sprintf ("%d" , paginater .Previous ()))
114
+ u .RawQuery = queries .Encode ()
115
+
116
+ links = append (links , fmt .Sprintf ("<%s%s>; rel=\" prev\" " , setting .AppURL , u .RequestURI ()[1 :]))
96
117
}
118
+ return links
119
+ }
120
+
121
+ // SetLinkHeader sets pagination link header by given total number and page size.
122
+ func (ctx * APIContext ) SetLinkHeader (total , pageSize int ) {
123
+ links := genAPILinks (ctx .Req .URL , total , pageSize , ctx .QueryInt ("page" ))
97
124
98
125
if len (links ) > 0 {
99
126
ctx .Header ().Set ("Link" , strings .Join (links , "," ))
0 commit comments